From 8791d2410a92676735874043ecf4f5c8a1573613 Mon Sep 17 00:00:00 2001 From: Donald Haase Date: Fri, 9 Jun 2023 21:14:17 -0400 Subject: [PATCH] Initial commit of Beta 2 source code --- Makefile.dc | 276 + Makefile.linux | 274 + Makefile.win32 | 237 + README.md | 92 - data/background.bmp | Bin 0 -> 4918 bytes data/colors.txt | 5 + data/splash.bmp | Bin 0 -> 39478 bytes data/text.bmp | Bin 0 -> 5622 bytes data/text2.bmp | Bin 0 -> 5622 bytes doc/porting.txt | 725 ++ src/2xsai.cpp | 1210 +++ src/apu.cpp | 860 ++ src/c4.cpp | 235 + src/c4emu.cpp | 889 ++ src/cheats.cpp | 441 + src/cheats2.cpp | 279 + src/clip.cpp | 764 ++ src/cpu.cpp | 268 + src/cpuexec.cpp | 407 + src/cpuops.cpp | 4428 +++++++++ src/data.cpp | 540 ++ src/dma.cpp | 1299 +++ src/dsp1.cpp | 1184 +++ src/dsp1_old.cpp | 529 ++ src/dsp1emu.c | 1397 +++ src/dsp1emu_old.c | 1518 +++ src/dsp2emu.c | 342 + src/dsp3emu.cpp | 729 ++ src/dsp4emu.cpp | 1586 ++++ src/fxemu.cpp | 726 ++ src/fxinst.cpp | 1916 ++++ src/getppu_table.h | 8195 +++++++++++++++++ src/gfx.cpp | 4990 ++++++++++ src/globals.cpp | 445 + src/i386/2xsaimmx.asm | 2089 +++++ src/i386/asmaddr.h | 759 ++ src/i386/asmops.h | 894 ++ src/i386/asmstruc.h | 268 + src/i386/bilinear.asm | 432 + src/i386/c4.asm | 2412 +++++ src/i386/cpuexec.S | 626 ++ src/i386/cpuops.S | 4641 ++++++++++ src/i386/fxemu2.asm | 2692 ++++++ src/i386/fxemu2.mac | 834 ++ src/i386/fxemu2b.asm | 617 ++ src/i386/fxemu2b.mac | 88 + src/i386/fxemu2c.asm | 2557 +++++ src/i386/fxemu2c.mac | 528 ++ src/i386/fxtable.asm | 3557 +++++++ src/i386/getset.S | 1079 +++ src/i386/macros.mac | 52 + src/i386/offsets.h | 273 + src/i386/regs.mac | 101 + src/i386/regsw.mac | 51 + src/i386/sa1addr.h | 537 ++ src/i386/sa1gs.S | 508 + src/i386/sa1ops.S | 4535 +++++++++ src/i386/sa1ops.h | 650 ++ src/i386/sa1struc.h | 257 + src/i386/sfxproc.asm | 678 ++ src/i386/spc.asm | 520 ++ src/i386/spc700.S | 7485 +++++++++++++++ src/i386/spcops.h | 268 + src/i386/zsnes.asm | 403 + src/i386/zsnesc4.asm | 103 + src/include/3d.h | 150 + src/include/65c816.h | 172 + src/include/apu.h | 221 + src/include/apumem.h | 248 + src/include/c4.h | 124 + src/include/cheats.h | 158 + src/include/copyright.h | 159 + src/include/cpuaddr.h | 500 + src/include/cpuexec.h | 242 + src/include/cpumacro.h | 892 ++ src/include/cpuops.h | 100 + src/include/debug.h | 113 + src/include/display.h | 136 + src/include/dma.h | 101 + src/include/dsp1.h | 138 + src/include/dsp1_old.h | 244 + src/include/dsp4.h | 83 + src/include/font.h | 148 + src/include/fxemu.h | 183 + src/include/fxinst.h | 475 + src/include/getset.h | 806 ++ src/include/gfx.h | 320 + src/include/language.h | 328 + src/include/memmap.h | 317 + src/include/messages.h | 137 + src/include/missing.h | 167 + src/include/movie.h | 146 + src/include/netplay.h | 285 + src/include/obc1.h | 102 + src/include/pixform.h | 366 + src/include/port.h | 341 + src/include/ppu.h | 747 ++ src/include/sa1.h | 219 + src/include/sar.h | 138 + src/include/screenshot.h | 96 + src/include/sdd1.h | 98 + src/include/sdd1emu.h | 104 + src/include/sdlinterface.h | 24 + src/include/seta.h | 160 + src/include/snaporig.h | 383 + src/include/snapshot.h | 116 + src/include/snes4all.h | 109 + src/include/snes9x.h | 419 + src/include/soundux.h | 301 + src/include/spc700.h | 194 + src/include/spc7110.h | 199 + src/include/srtc.h | 157 + src/include/tile.h | 445 + src/include/videogl.h | 136 + src/loadzip.cpp | 270 + src/memmap.cpp | 4461 +++++++++ src/menu/fade.cpp | 41 + src/menu/fade.h | 5 + src/menu/menu.cpp | 822 ++ src/menu/menu.h | 52 + src/menu/menu_load.cpp | 466 + src/menu/menu_main.cpp | 592 ++ src/menu/menu_save.cpp | 449 + src/menu/msg.h | 4 + src/mmu_handle/Makefile | 33 + .../kos-patch/addons/lib/dreamcast/libkglx.a | Bin 0 -> 399076 bytes .../kernel/arch/dreamcast/fs/fs_iso9660.c | 931 ++ .../kernel/arch/dreamcast/hardware/sq.c | 203 + .../kernel/arch/dreamcast/include/dc/pvr.h | 1064 +++ .../kos-patch/lib/dreamcast/libkallisti.a | Bin 0 -> 1800440 bytes src/mmu_handle/mmu_handle.cpp | 1074 +++ src/mmu_handle/mmu_handle.h | 81 + src/netplay.cpp | 1045 +++ src/obc1.cpp | 204 + src/offsets.cpp | 557 ++ src/ppu.cpp | 3282 +++++++ src/sa1.cpp | 929 ++ src/sa1cpu.cpp | 186 + src/screenshot.cpp | 218 + src/sdd1.cpp | 205 + src/sdd1emu.cpp | 413 + src/sdl/config.cpp | 786 ++ src/sdl/keydef.h | 38 + src/sdl/machine.cpp | 2042 ++++ src/sdl/save_icon.h | 39 + src/sdl/sdl.cpp | 473 + src/sdl/soundux.cpp | 0 src/sdl/vgl.h | 540 ++ src/sdl/videogl.cpp | 1179 +++ src/sdl/vmu.cpp | 264 + src/server.cpp | 1303 +++ src/seta.cpp | 105 + src/seta010.cpp | 750 ++ src/seta011.cpp | 232 + src/seta018.cpp | 256 + src/setppu_table.h | 8174 ++++++++++++++++ src/sh/aputimer.h | 195 + src/sh/asmaddr.h | 1159 +++ src/sh/asmops.h | 1200 +++ src/sh/asmstruc.h | 399 + src/sh/cpuexec.S | 1391 +++ src/sh/cpumem.S | 232 + src/sh/cpuops.S | 7287 +++++++++++++++ src/sh/getset.S | 2288 +++++ src/sh/offsets.h | 321 + src/sh/sa1addr.h | 776 ++ src/sh/sa1gs.S | 733 ++ src/sh/sa1ops.S | 4402 +++++++++ src/sh/sa1ops.h | 955 ++ src/sh/sa1struc.h | 325 + src/sh/spcops.h | 118 + src/snaporig.cpp | 470 + src/snapshot.cpp | 1831 ++++ src/sound.cpp | 270 + src/soundux.cpp | 2267 +++++ src/spc.cpp | 133 + src/spc700.cpp | 2531 +++++ src/spc7110.cpp | 2348 +++++ src/spccycles.cpp | 110 + src/spctool.cpp | 192 + src/srtc.cpp | 577 ++ src/tile.cpp | 1469 +++ src/tilegl.cpp | 530 ++ src/unzip/explode.c | 1119 +++ src/unzip/unreduce.c | 217 + src/unzip/unshrink.c | 177 + src/unzip/unz.h | 994 ++ src/unzip/unzip.c | 1223 +++ src/unzip/unzip.h | 285 + src/unzip/unzipP.h | 124 + 190 files changed, 161551 insertions(+), 92 deletions(-) create mode 100644 Makefile.dc create mode 100644 Makefile.linux create mode 100644 Makefile.win32 delete mode 100644 README.md create mode 100644 data/background.bmp create mode 100644 data/colors.txt create mode 100644 data/splash.bmp create mode 100644 data/text.bmp create mode 100644 data/text2.bmp create mode 100644 doc/porting.txt create mode 100644 src/2xsai.cpp create mode 100644 src/apu.cpp create mode 100644 src/c4.cpp create mode 100644 src/c4emu.cpp create mode 100644 src/cheats.cpp create mode 100644 src/cheats2.cpp create mode 100644 src/clip.cpp create mode 100644 src/cpu.cpp create mode 100644 src/cpuexec.cpp create mode 100644 src/cpuops.cpp create mode 100644 src/data.cpp create mode 100644 src/dma.cpp create mode 100644 src/dsp1.cpp create mode 100644 src/dsp1_old.cpp create mode 100644 src/dsp1emu.c create mode 100644 src/dsp1emu_old.c create mode 100644 src/dsp2emu.c create mode 100644 src/dsp3emu.cpp create mode 100644 src/dsp4emu.cpp create mode 100644 src/fxemu.cpp create mode 100644 src/fxinst.cpp create mode 100644 src/getppu_table.h create mode 100644 src/gfx.cpp create mode 100644 src/globals.cpp create mode 100644 src/i386/2xsaimmx.asm create mode 100644 src/i386/asmaddr.h create mode 100644 src/i386/asmops.h create mode 100644 src/i386/asmstruc.h create mode 100644 src/i386/bilinear.asm create mode 100644 src/i386/c4.asm create mode 100644 src/i386/cpuexec.S create mode 100644 src/i386/cpuops.S create mode 100644 src/i386/fxemu2.asm create mode 100644 src/i386/fxemu2.mac create mode 100644 src/i386/fxemu2b.asm create mode 100644 src/i386/fxemu2b.mac create mode 100644 src/i386/fxemu2c.asm create mode 100644 src/i386/fxemu2c.mac create mode 100644 src/i386/fxtable.asm create mode 100644 src/i386/getset.S create mode 100644 src/i386/macros.mac create mode 100644 src/i386/offsets.h create mode 100644 src/i386/regs.mac create mode 100644 src/i386/regsw.mac create mode 100644 src/i386/sa1addr.h create mode 100644 src/i386/sa1gs.S create mode 100644 src/i386/sa1ops.S create mode 100644 src/i386/sa1ops.h create mode 100644 src/i386/sa1struc.h create mode 100644 src/i386/sfxproc.asm create mode 100644 src/i386/spc.asm create mode 100644 src/i386/spc700.S create mode 100644 src/i386/spcops.h create mode 100644 src/i386/zsnes.asm create mode 100644 src/i386/zsnesc4.asm create mode 100644 src/include/3d.h create mode 100644 src/include/65c816.h create mode 100644 src/include/apu.h create mode 100644 src/include/apumem.h create mode 100644 src/include/c4.h create mode 100644 src/include/cheats.h create mode 100644 src/include/copyright.h create mode 100644 src/include/cpuaddr.h create mode 100644 src/include/cpuexec.h create mode 100644 src/include/cpumacro.h create mode 100644 src/include/cpuops.h create mode 100644 src/include/debug.h create mode 100644 src/include/display.h create mode 100644 src/include/dma.h create mode 100644 src/include/dsp1.h create mode 100644 src/include/dsp1_old.h create mode 100644 src/include/dsp4.h create mode 100644 src/include/font.h create mode 100644 src/include/fxemu.h create mode 100644 src/include/fxinst.h create mode 100644 src/include/getset.h create mode 100644 src/include/gfx.h create mode 100644 src/include/language.h create mode 100644 src/include/memmap.h create mode 100644 src/include/messages.h create mode 100644 src/include/missing.h create mode 100644 src/include/movie.h create mode 100644 src/include/netplay.h create mode 100644 src/include/obc1.h create mode 100644 src/include/pixform.h create mode 100644 src/include/port.h create mode 100644 src/include/ppu.h create mode 100644 src/include/sa1.h create mode 100644 src/include/sar.h create mode 100644 src/include/screenshot.h create mode 100644 src/include/sdd1.h create mode 100644 src/include/sdd1emu.h create mode 100644 src/include/sdlinterface.h create mode 100644 src/include/seta.h create mode 100644 src/include/snaporig.h create mode 100644 src/include/snapshot.h create mode 100644 src/include/snes4all.h create mode 100644 src/include/snes9x.h create mode 100644 src/include/soundux.h create mode 100644 src/include/spc700.h create mode 100644 src/include/spc7110.h create mode 100644 src/include/srtc.h create mode 100644 src/include/tile.h create mode 100644 src/include/videogl.h create mode 100644 src/loadzip.cpp create mode 100644 src/memmap.cpp create mode 100644 src/menu/fade.cpp create mode 100644 src/menu/fade.h create mode 100644 src/menu/menu.cpp create mode 100644 src/menu/menu.h create mode 100644 src/menu/menu_load.cpp create mode 100644 src/menu/menu_main.cpp create mode 100644 src/menu/menu_save.cpp create mode 100644 src/menu/msg.h create mode 100644 src/mmu_handle/Makefile create mode 100644 src/mmu_handle/kos-patch/addons/lib/dreamcast/libkglx.a create mode 100644 src/mmu_handle/kos-patch/kernel/arch/dreamcast/fs/fs_iso9660.c create mode 100644 src/mmu_handle/kos-patch/kernel/arch/dreamcast/hardware/sq.c create mode 100644 src/mmu_handle/kos-patch/kernel/arch/dreamcast/include/dc/pvr.h create mode 100644 src/mmu_handle/kos-patch/lib/dreamcast/libkallisti.a create mode 100644 src/mmu_handle/mmu_handle.cpp create mode 100644 src/mmu_handle/mmu_handle.h create mode 100644 src/netplay.cpp create mode 100644 src/obc1.cpp create mode 100644 src/offsets.cpp create mode 100644 src/ppu.cpp create mode 100644 src/sa1.cpp create mode 100644 src/sa1cpu.cpp create mode 100644 src/screenshot.cpp create mode 100644 src/sdd1.cpp create mode 100644 src/sdd1emu.cpp create mode 100644 src/sdl/config.cpp create mode 100644 src/sdl/keydef.h create mode 100644 src/sdl/machine.cpp create mode 100644 src/sdl/save_icon.h create mode 100644 src/sdl/sdl.cpp create mode 100644 src/sdl/soundux.cpp create mode 100644 src/sdl/vgl.h create mode 100644 src/sdl/videogl.cpp create mode 100644 src/sdl/vmu.cpp create mode 100644 src/server.cpp create mode 100644 src/seta.cpp create mode 100644 src/seta010.cpp create mode 100644 src/seta011.cpp create mode 100644 src/seta018.cpp create mode 100644 src/setppu_table.h create mode 100644 src/sh/aputimer.h create mode 100644 src/sh/asmaddr.h create mode 100644 src/sh/asmops.h create mode 100644 src/sh/asmstruc.h create mode 100644 src/sh/cpuexec.S create mode 100644 src/sh/cpumem.S create mode 100644 src/sh/cpuops.S create mode 100644 src/sh/getset.S create mode 100644 src/sh/offsets.h create mode 100644 src/sh/sa1addr.h create mode 100644 src/sh/sa1gs.S create mode 100644 src/sh/sa1ops.S create mode 100644 src/sh/sa1ops.h create mode 100644 src/sh/sa1struc.h create mode 100644 src/sh/spcops.h create mode 100644 src/snaporig.cpp create mode 100644 src/snapshot.cpp create mode 100644 src/sound.cpp create mode 100644 src/soundux.cpp create mode 100644 src/spc.cpp create mode 100644 src/spc700.cpp create mode 100644 src/spc7110.cpp create mode 100644 src/spccycles.cpp create mode 100644 src/spctool.cpp create mode 100644 src/srtc.cpp create mode 100644 src/tile.cpp create mode 100644 src/tilegl.cpp create mode 100644 src/unzip/explode.c create mode 100644 src/unzip/unreduce.c create mode 100644 src/unzip/unshrink.c create mode 100644 src/unzip/unz.h create mode 100644 src/unzip/unzip.c create mode 100644 src/unzip/unzip.h create mode 100644 src/unzip/unzipP.h diff --git a/Makefile.dc b/Makefile.dc new file mode 100644 index 0000000..b93bc04 --- /dev/null +++ b/Makefile.dc @@ -0,0 +1,276 @@ +USE_CPUASM=1 +#USE_CPUASM_MIXTO=1 +USE_GL=1 +USE_MMU=1 + +TARGET = snes4all + +BACK_KOS_AS=$(KOS_CC_BASE)/bin/$(KOS_CC_PREFIX)-as +KOS_AS = $(KOS_CCPLUS) -ml -m4-single-only -c + +OPTFLAGS=-O3 -fomit-frame-pointer -DDREAMCAST -DDATA_PREFIX="/rd/" -ffast-math -g0 +#OPTFLAGS=-Os -fomit-frame-pointer -DDREAMCAST -DDATA_PREFIX="/rd/" -ffast-math -g0 +#OPTFLAGS+= -falign-functions=32 -falign-labels=32 -falign-loops=32 -falign-jumps=32 +OPTFLAGS+= -falign-functions=32 -falign-labels=4 -falign-loops=4 -falign-jumps=4 +#OPTFLAGS+= -falign-functions -falign-labels -falign-loops -falign-jumps + +DEFS += -DSNES4ALL_MAX_ROM_SIZE=0x600000 +#DEFS += -DNORES256 + +DEFS += -DUSE_RASTER_DIFF +DEFS += -DCPU_SHUTDOWN +DEFS += -DSPC700_SHUTDOWN +DEFS += -DEXECUTE_SUPERFX_PER_LINE +DEFS += -DSPC700_C +DEFS += -DVAR_CYCLES +DEFS += -DSDD1_DECOMP +DEFS += -DUSE_OLD_DSP1 +DEFS += -DUSE_NO_WAIT_WHEN_IRQ +DEFS += -DNO_INLINE_SET_GET +#DEFS += -DUSE_MMU_BOUNDARY +#DEFS += -DUSE_MMU_MASK +DEFS += -DUSE_MMU_DIRECT_INDEX +#DEFS += -DUSE_MMU_BASEPOINTER +#DEFS += -DUSE_MEMORY_SPEED +#DEFS += -DUSE_BLOCK_RAM +DEFS += -DUSE_ASM_ALIGN_OPCODES +DEFS += -DUSE_ASM_SMALL +#DEFS += -DUSE_ASM_R5 +DEFS += -DUSE_ASM_R12 +#DEFS += -DENABLE_ECHO_SOUND +#DEFS += -DENABLE_MASTER_VOLUMEN +#DEFS += -DUSE_SOUND_DESYNC +#DEFS += -DUSE_REAL_SOUND_MUL +#DEFS += -DENABLE_INTERPOLATE_SOUND +DEFS += -DUSE_ALTDECODE=5 +#DEFS += -DENABLE_FIX_FREQUENCY +#DEFS += -DUSE_MODE7_INTERPOLATE +DEFS += -DENABLE_GRAPHIC_WINDOWS +DEFS += -DENABLE_HDMA +#DEFS += -DUSE_HDMA_EVENT +#DEFS += -DNEW_COLOUR_BLENDING +#DEFS += -DOLD_COLOUR_BLENDING +#DEFS += -DSNES4ALL_NUM_CHANNELS=6 +#DEFS += -DSNES4ALL_STEREO +#DEFS += -DUSE_VIDEOGL_DIRECT_SLOT +#DEFS += -DDIRECT_COLOR_MAP +DEFS += -DTEST_CACHETILE +DEFS += -DTILES_INLINE +DEFS += -DUSE_SETPPU_TABLE +#DEFS += -DUSE_SETPPU_SMALL_TABLE +DEFS += -DUSE_GETPPU_TABLE +DEFS += -DUSE_ASM_GET_SPC +DEFS += -DUSE_ASM_SET_MATRIX +DEFS += -DUSE_ASM_IRQ_INLINE +DEFS += -DUSE_ASM_PREFETCH +DEFS += -DUSE_VIDEOGL_SELECTIVE_CACHE_RESET=4 +DEFS += -DVIDEO_GL_MAX_TEX=32768 +DEFS += -DVIDEO_GL_RASTER=64 +#DEFS += -DUSE_VIDEOGL_EXTEND_TILELIST +#DEFS += -DUSE_VGL_TABLE +#DEFS += -DUSE_VGL_LARGE_TABLE + +#DEFS += -DNOSOUND + +#DEFS += -DAUTOLOAD="/cd/Aladdin.zip" +#DEFS += -DAUTOLOAD="/cd/smario.zip" +#DEFS += -DAUTOLOAD="/cd/starwars.zip" +#DEFS += -DAUTOLOAD="/cd/turrican.zip" +#DEFS += -DAUTOLOAD="/cd/castlevania.zip" +#DEFS += -DAUTOLOAD="/cd/jamespond.zip" +#DEFS += -DAUTOLOAD="/cd/Parodius.zip" +#DEFS += -DAUTOLOAD="/sd/snes4all/EarthwormJim.zip" +#DEFS += -DAUTOLOAD="/sd/snes4all/KirbySuperstar.zip" +#DEFS += -DAUTOSAVESTATE +#DEFS += -DAUTO_LOADSAVESTATE="jamespond.ssn" +#DEFS += -DAUTO_LOADSAVESTATE="castlevania.ssn" +#DEFS += -DAUTO_LOADSAVESTATE="turrican.ssn" +#DEFS += -DAUTO_LOADSAVESTATE="aladdin.ssn" +#DEFS += -DAUTO_LOADSAVESTATE="smario.ssn" +#DEFS += -DAUTO_LOADSAVESTATE="starwars.ssn" +#DEFS += -DAUTO_EVENTS +#DEFS += -DMAX_AUTO_EVENTS=500 + +#DEFS += -DSHOW_DMA + +#DEFS += -DPROFILER_SNES4ALL + +#DEFS += -DDEBUG_FRAMESKIP +#DEFS += -DAUTO_DEBUG_FRAMESKIP=1000 +#DEFS += -DDISPLAY_FRAMERATE + +#DEFS += -DDEBUG_TILECACHE +#DEFS += -DAUTO_DEBUG_TILECACHE=2000 + +DEFS += -DREBOOT_DREAMCAST + +ifdef USE_GL +DEFS += -DUSE_GL +endif + +ifdef USE_CPUASM +DEFS += -DUSE_OPC_ASM + +DEFS += -DASMSTRUC_NOP_PATCH +DEFS += -DSA1ADDR_NOP_PATCH +DEFS += -DASMADDR_NOP_PATCH +DEFS += -DUSE_OLD_APUTIMER +#DEFS += -DUSE_OLD_END_REFRESH +#DEFS += -DUSE_OLD_START_REFRESH +#DEFS += -DUSE_OLD_SYNC_SPEED +#DEFS += -DUSE_ALWAYS_APU_SYNC +endif + +ifdef USE_CPUASM_MIXTO +DEFS += -DUSE_OPC_ASM_MIXTO +endif + +ifdef USE_MMU +KOS_CFLAGS= -Isrc/mmu_handle/kos-patch/kernel/arch/dreamcast/include -O3 -fomit-frame-pointer -ml -m4-single-only -fno-optimize-sibling-calls -I$(KOS_BASE)/include -I$(KOS_BASE)/addons/include -I$(KOS_BASE)/kernel/arch/dreamcast/include -D_arch_dreamcast -D_arch_sub_pristine -Wall -g -fno-builtin -fno-strict-aliasing +KOS_LDFLAGS = -Lsrc/mmu_handle/kos-patch/lib/dreamcast -Lsrc/mmu_handle/kos-patch/addons/lib/dreamcast -ml -m4-single-only -Wl,-Ttext=0x8c010000 -nostartfiles -nostdlib -L$(KOS_BASE)/lib/dreamcast -L$(KOS_BASE)/addons/lib/dreamcast +MORE_CFLAGS = -DUSE_MMU -Isrc/mmu_handle -I$(KOS_BASE)/addons/include/SDL -I$(KOS_BASE)/addons/include $(OPTFLAGS) +else +MORE_CFLAGS = -I$(KOS_BASE)/addons/include/SDL -I$(KOS_BASE)/addons/include $(OPTFLAGS) +endif + +MORE_CFLAGS += -Isrc/include -Isrc/unzip -Isrc/menu -Isrc/sh -DMITSHM \ + $(DEFS) -DUNZIP_SUPPORT -DZLIB -DHAVE_MKSTEMP \ + -DACCEPT_SIZE_T=int + +#MORE_CFLAGS += -DNOSOUND + +KOS_CFLAGS += $(MORE_CFLAGS) +KOS_CPPFLAGS += $(MORE_CFLAGS) +KOS_AFLAGS = $(MORE_CFLAGS) + +all: $(TARGET).bin + +include $(KOS_BASE)/Makefile.rules + +KOS_CPPFLAGS=-fno-operator-names -fno-exceptions + +ifdef USE_CPUASM +ifdef USE_CPUASM_MIXTO +OBJS += \ + src/cpuexec.o +endif +OBJS += \ + src/sh/cpuexec.o \ + src/sh/cpuops.o \ + src/sh/cpumem.o +ifdef USE_MMU +OBJS += src/sh/sa1ops.o +else +OBJS += src/sa1cpu.o +endif + +else +OBJS += \ + src/cpuops.o \ + src/cpuexec.o \ + src/sa1cpu.o +endif + +ifdef USE_MMU +OBJS += src/mmu_handle/mmu_handle.o +endif + + +OBJS += \ + src/globals.o \ + src/fxinst.o \ + src/c4emu.o \ + src/fxemu.o \ + src/2xsai.o \ + src/apu.o \ + src/c4.o \ + src/cheats.o \ + src/cheats2.o \ + src/clip.o \ + src/cpu.o \ + src/data.o \ + src/dma.o \ + src/dsp1.o \ + src/gfx.o \ + src/loadzip.o \ + src/memmap.o \ + src/netplay.o \ + src/obc1.o \ + src/ppu.o \ + src/sa1.o \ + src/screenshot.o \ + src/sdd1.o \ + src/sdd1emu.o \ + src/server.o \ + src/seta.o \ + src/seta010.o \ + src/seta011.o \ + src/seta018.o \ + src/snaporig.o \ + src/snapshot.o \ + src/soundux.o \ + src/spc700.o \ + src/spc7110.o \ + src/srtc.o \ + src/tile.o \ + src/sdl/config.o \ + src/sdl/machine.o \ + src/sdl/vmu.o \ + src/sdl/sdl.o \ + src/unzip/explode.o \ + src/unzip/unreduce.o \ + src/unzip/unshrink.o \ + src/unzip/unzip.o \ + src/menu/fade.o \ + src/menu/menu.o \ + src/menu/menu_main.o \ + src/menu/menu_save.o \ + src/menu/menu_load.o \ + romdisk.o + +ifdef USE_GL +OBJS += \ + src/sdl/videogl.o \ + src/tilegl.o +endif + +ifdef USE_GL +LIBS= -lSDL_mixer_126 -lSDL_gl_1213 -lkglx -lz_123 -lm +else +LIBS= -lSDL_mixer_126 -lSDL_1213 -lz_123 -lm +endif + +clean: + rm -f $(OBJS) $(TARGET).elf $(TARGET).bin romdisk.o romdisk.img example.iso offsets.bin offsets.elf src/offsets.o + +$(TARGET).elf: $(OBJS) + $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET).elf $(KOS_START) \ + $(OBJS) $(OBJEXTRA) $(LIBS) $(KOS_LIBS) + +offsets.elf: src/offsets.o + $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o offsets.elf $(KOS_START) \ + src/offsets.o $(OBJEXTRA) -lm $(KOS_LIBS) + +$(TARGET).bin: $(TARGET).elf + $(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin + +offsets.bin: offsets.elf + $(KOS_OBJCOPY) -R .stack -O binary offsets.elf offsets.bin + +romdisk.o: romdisk.img + KOS_AS=$(BACK_KOS_AS) KOS_AFLAGS=-little $(KOS_BASE)/utils/bin2o/bin2o romdisk.img romdisk romdisk.o +# bin2odc romdisk.img romdisk.o + +romdisk.img: + $(KOS_GENROMFS) -f romdisk.img -d data -v + +example.iso: example + mkisofs -joliet-long -l -o example.iso -graft-points /=example/ + +run: $(TARGET).bin example.iso + $(KOS_LOADER) $(TARGET).bin -i example.iso +# $(KOS_LOADER) $(TARGET).bin + +offsets: offsets.bin + $(KOS_LOADER) offsets.bin > offsets.h + diff --git a/Makefile.linux b/Makefile.linux new file mode 100644 index 0000000..c5e99b6 --- /dev/null +++ b/Makefile.linux @@ -0,0 +1,274 @@ +#USE_CPUASM=1 +#USE_MMX=1 +#USE_ZSNES_FX=1 +USE_GL=1 + + +NAME = snes4all +O = o +RM = rm -f +CC = gcc +CXX = g++ +AS = c++ +STRIP = strip + +PROG = $(NAME) + +DEFS += -DSNES4ALL_MAX_ROM_SIZE=0x600000 +ifdef USE_GL +DEFS += -DUSE_GL +else +#DEFS += -DNORES256 +endif + +#DEFS += -DPLAYBACK_RATE=22050 +DEFS += -DCPU_SHUTDOWN +DEFS += -DSPC700_SHUTDOWN +DEFS += -DEXECUTE_SUPERFX_PER_LINE +DEFS += -DSPC700_C +DEFS += -DVAR_CYCLES +DEFS += -DSDD1_DECOMP +DEFS += -DUSE_NO_WAIT_WHEN_IRQ +DEFS += -DNO_INLINE_SET_GET +#DEFS += -DUSE_MEMORY_SPEED +#DEFS += -DUSE_BLOCK_RAM +#DEFS += -DENABLE_ECHO_SOUND +#DEFS += -DENABLE_MASTER_VOLUMEN +#DEFS += -DUSE_SOUND_DESYNC +#DEFS += -DENABLE_INTERPOLATE_SOUND +#DEFS += -DUSE_ALTDECODE=1 +#DEFS += -DENABLE_FIX_FREQUENCY +#DEFS += -DUSE_MODE7_INTERPOLATE +DEFS += -DENABLE_GRAPHIC_WINDOWS +DEFS += -DENABLE_HDMA +#DEFS += -DUSE_HDMA_EVENT +DEFS += -DUSE_OLD_DSP1 +#DEFS += -DNEW_COLOUR_BLENDING +#DEFS += -DOLD_COLOUR_BLENDING +#DEFS += -DSNES4ALL_NUM_CHANNELS=6 +#DEFS += -DSNES4ALL_STEREO +#DEFS += -DDIRECT_COLOR_MAP +#DEFS += -DTEST_CACHETILE +#DEFS += -DTILES_INLINE +DEFS += -DUSE_RASTER_DIFF +DEFS += -DUSE_SETPPU_TABLE +DEFS += -DUSE_GETPPU_TABLE +#DEFS += -DUSE_VIDEOGL_SELECTIVE_CACHE_RESET=1 +DEFS += -DUSE_VIDEOGL_SELECTIVE_CACHE_RESET=4 +#DEFS += -DUSE_VIDEOGL_EXTEND_TILELIST +#DEFS += -DUSE_VGL_TABLE +#DEFS += -DUSE_VGL_LARGE_TABLE + +#DEFS += -DNOSOUND + +#DEFS += -DAUTOLOAD=\"example/Super\ Metroid.zip\" +#DEFS += -DAUTOLOAD=\"example/Aladdin.zip\" +#DEFS += -DAUTOLOAD=\"example/castlevania.zip\" +#DEFS += -DAUTOLOAD=\"example/smario.zip\" +#DEFS += -DAUTOLOAD=\"example/fzero.zip\" +#DEFS += -DAUTOLOAD=\"example/rrunner.zip\" +#DEFS += -DAUTOLOAD=\"example/supergoal.zip\" +#DEFS += -DAUTOLOAD=\"example/dkcountry.zip\" +#DEFS += -DAUTOLOAD=\"example/pacintime.zip\" +#DEFS += -DAUTOLOAD=\"example/starwars.zip\" +#DEFS += -DAUTOLOAD=\"example/jurassic.zip\" +#DEFS += -DAUTOLOAD=\"example/jimpower.zip\" +#DEFS += -DAUTOLOAD=\"example/turrican.zip\" +#DEFS += -DAUTOLOAD=\"example/sfighter.zip\" +#DEFS += -DAUTOLOAD=\"example/rtype.zip\" +#DEFS += -DAUTO_LOADSAVESTATE=\"castlevania.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"rtype.1ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"sfighter.2ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"jimpower.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"turrican.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"pacintime.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"jurassic.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"supergoal.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"smario.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"fzero.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"smario.1ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"prueba.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"rrunner.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"Aladdin.ssn\" +#DEFS += -DAUTO_LOADSAVESTATE=\"Super\ Metroid.1ssn\" +#DEFS += -DAUTO_EVENTS +#DEFS += -DMAX_AUTO_EVENTS=50 +#DEFS += -DMAX_AUTO_EVENTS=500 + +#DEFS += -DPROFILER_SNES4ALL + +#DEFS += -DDEBUG_FRAMESKIP +#DEFS += -DAUTO_DEBUG_FRAMESKIP=1000 +#DEFS += -DDISPLAY_FRAMERATE + +#DEFS += -DDEBUG_TILECACHE +#DEFS += -DAUTO_DEBUG_TILECACHE=2000 + +DEFS += -DLINUX -DUNIX + +ifdef USE_CPUASM +DEFS += -DUSE_X86_ASM +endif + +ifdef USE_MMX +DEFS += -DMMX +endif + +ifdef USE_ZSNES_FX +DEFS += -DZSNES_FX +endif + + +DEFAULT_CFLAGS = `sdl-config --cflags` +LDFLAGS = `sdl-config --libs` -lSDL_mixer -lz + +ifdef USE_GL +LDFLAGS += -lGL +endif + + +MORE_CFLAGS = -O3 -DDATA_PREFIX=\"data/\" + +MORE_CFLAGS += -Isrc/include -Isrc/unzip -Isrc/menu -Isrc/i386 -DMITSHM \ + $(DEFS) -DUNZIP_SUPPORT -DZLIB -DHAVE_MKSTEMP -DHAVE_STRINGS_H \ + -DHAVE_SYS_IOCTL_H '-DACCEPT_SIZE_T=int' + +#MORE_CFLAGS += -DNOSOUND + + +CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) +CPPFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) + +OBJS = \ + src/2xsai.o \ + src/apu.o \ + src/c4.o \ + src/cheats.o \ + src/cheats2.o \ + src/clip.o \ + src/cpu.o \ + src/data.o \ + src/dma.o \ + src/dsp1.o \ + src/gfx.o \ + src/globals.o \ + src/loadzip.o \ + src/memmap.o \ + src/netplay.o \ + src/obc1.o \ + src/ppu.o \ + src/sa1.o \ + src/screenshot.o \ + src/sdd1.o \ + src/sdd1emu.o \ + src/server.o \ + src/seta.o \ + src/seta010.o \ + src/seta011.o \ + src/seta018.o \ + src/snaporig.o \ + src/snapshot.o \ + src/soundux.o \ + src/spc700.o \ + src/spc7110.o \ + src/srtc.o \ + src/tile.o \ + src/sdl/config.o \ + src/sdl/machine.o \ + src/sdl/sdl.o \ + src/unzip/explode.o \ + src/unzip/unreduce.o \ + src/unzip/unshrink.o \ + src/unzip/unzip.o \ + src/menu/fade.o \ + src/menu/menu.o \ + src/menu/menu_main.o \ + src/menu/menu_save.o \ + src/menu/menu_load.o + +ifdef USE_GL +OBJS += \ + src/sdl/videogl.o \ + src/tilegl.o +endif + +ifdef USE_CPUASM +OBJS += \ + src/i386/cpuexec.o \ + src/i386/cpuops.o \ + src/i386/sa1ops.o \ + src/i386/spc.o +else +OBJS += \ + src/cpuexec.o \ + src/sa1cpu.o +endif + +ifdef USE_MMX +OBJS += \ + src/i386/2xsaimmx.o \ + src/i386/bilinear.o +endif + +ifdef USE_ZSNES_FX +OBJS += \ + src/i386/fxemu2.o \ + src/i386/fxemu2b.o \ + src/i386/fxemu2c.o \ + src/i386/fxtable.o \ + src/i386/sfxproc.o \ + src/i386/zsnes.o \ + src/i386/zsnesc4.o \ + src/i386/c4.o +else +OBJS += \ + src/cpuops.o \ + src/fxinst.o \ + src/c4emu.o \ + src/fxemu.o +endif + + +$(PROG): $(OBJS) + $(CC) $(CFLAGS) -o $(PROG) $(OBJS) $(LDFLAGS) + $(STRIP) $(PROG) + + +run: $(PROG) + ./$(PROG) + +clean: + $(RM) $(PROG) $(OBJS) + +src/i386/2xsaimmx.o: src/i386/2xsaimmx.asm + nasm -f elf src/i386/2xsaimmx.asm $(DEFS) + +src/i386/bilinear.o: src/i386/bilinear.asm + nasm -f elf src/i386/bilinear.asm $(DEFS) + +src/i386/c4.o: src/i386/c4.asm + nasm -f elf src/i386/c4.asm $(DEFS) + +src/i386/fxemu2.o: src/i386/fxemu2.asm + nasm -f elf src/i386/fxemu2.asm $(DEFS) + +src/i386/fxemu2b.o: src/i386/fxemu2b.asm + nasm -f elf src/i386/fxemu2b.asm $(DEFS) + +src/i386/fxemu2c.o: src/i386/fxemu2c.asm + nasm -f elf src/i386/fxemu2c.asm $(DEFS) + +src/i386/fxtable.o: src/i386/fxtable.asm + nasm -f elf src/i386/fxtable.asm $(DEFS) + +src/i386/sfxproc.o: src/i386/sfxproc.asm + nasm -f elf src/i386/sfxproc.asm $(DEFS) + +src/i386/spc.o: src/i386/spc.asm + nasm -f elf src/i386/spc.asm $(DEFS) + +src/i386/zsnes.o: src/i386/zsnes.asm + nasm -f elf src/i386/zsnes.asm $(DEFS) + +src/i386/zsnesc4.o: src/i386/zsnesc4.asm + nasm -f elf src/i386/zsnesc4.asm $(DEFS) diff --git a/Makefile.win32 b/Makefile.win32 new file mode 100644 index 0000000..69dd4bd --- /dev/null +++ b/Makefile.win32 @@ -0,0 +1,237 @@ +#USE_CPUASM=1 +#USE_MMX=1 +#USE_ZSNES_FX=1 +USE_GL=1 + + +NAME = snes4all +O = o +RM = rm -f +CC = gcc-3 +CXX = g++-3 +AS = c++-3 +STRIP = strip + +PROG = $(NAME) + +DEFS += -DSNES4ALL_MAX_ROM_SIZE=0x600000 +ifdef USE_GL +DEFS += -DUSE_GL +else +#DEFS += -DNORES256 +endif + +DEFS += -DCPU_SHUTDOWN +DEFS += -DSPC700_SHUTDOWN +DEFS += -DEXECUTE_SUPERFX_PER_LINE +DEFS += -DSPC700_C +DEFS += -DVAR_CYCLES +DEFS += -DSDD1_DECOMP +DEFS += -DUSE_NO_WAIT_WHEN_IRQ +DEFS += -DUSE_OLD_DSP1 +#DEFS += -DNO_INLINE_SET_GET +#DEFS += -DENABLE_ECHO_SOUND +#DEFS += -DENABLE_MASTER_VOLUMEN +#DEFS += -DUSE_SOUND_DESYNC +#DEFS += -DENABLE_INTERPOLATE_SOUND +#DEFS += -DUSE_ALTDECODE=1 +#DEFS += -DENABLE_FIX_FREQUENCY +#DEFS += -DUSE_MODE7_INTERPOLATE +DEFS += -DENABLE_GRAPHIC_WINDOWS +DEFS += -DENABLE_HDMA +#DEFS += -DUSE_HDMA_EVENT +#DEFS += -DNEW_COLOUR_BLENDING +#DEFS += -DOLD_COLOUR_BLENDING +#DEFS += -DSNES4ALL_NUM_CHANNELS=6 +#DEFS += -DSNES4ALL_STEREO +#DEFS += -DDIRECT_COLOR_MAP +#DEFS += -DTEST_CACHETILE +#DEFS += -DTILES_INLINE +DEFS += -DUSE_RASTER_DIFF +DEFS += -DUSE_GETPPU_TABLE + + +#DEFS += -DNOSOUND + +#DEFS += -DAUTOLOAD=\"example/smario.smc\" +#DEFS += -DAUTO_EVENTS +#DEFS += -DMAX_AUTO_EVENTS=1000 + +#DEFS += -DPROFILER_SNES4ALL + +#DEFS += -DDEBUG_FRAMESKIP +#DEFS += -DAUTO_DEBUG_FRAMESKIP=1000 +#DEFS += -DDISPLAY_FRAMERATE + +#DEFS += -DDEBUG_TILECACHE +#DEFS += -DAUTO_DEBUG_TILECACHE=2000 + +DEFS += -D__DJGPP__ -D__DJGCC -D_WINDOWS + +ifdef USE_CPUASM +DEFS += -DUSE_X86_ASM -DUSE_OPC_ASM +endif + +ifdef USE_MMX +DEFS += -DMMX +endif + +ifdef USE_ZSNES_FX +DEFS += -DZSNES_FX +endif + + +DEFAULT_CFLAGS = `sdl-config --cflags` +LDFLAGS = `sdl-config --libs` -lSDL_mixer -lz + +MORE_CFLAGS = -O3 -DDATA_PREFIX=\"data/\" -U__WIN32__ + +MORE_CFLAGS += -Isrc/include -Isrc/unzip -Isrc/menu -Isrc/i386 -DMITSHM \ + $(DEFS) -DUNZIP_SUPPORT -DZLIB -DHAVE_MKSTEMP -DHAVE_STRINGS_H \ + '-DACCEPT_SIZE_T=int' + + + +CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) +CPPFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) + +OBJS = \ + src/2xsai.o \ + src/memmap.o \ + src/apu.o \ + src/c4.o \ + src/cheats.o \ + src/cheats2.o \ + src/clip.o \ + src/cpu.o \ + src/data.o \ + src/dma.o \ + src/dsp1.o \ + src/gfx.o \ + src/globals.o \ + src/loadzip.o \ + src/netplay.o \ + src/obc1.o \ + src/ppu.o \ + src/sa1.o \ + src/screenshot.o \ + src/sdd1.o \ + src/sdd1emu.o \ + src/server.o \ + src/seta.o \ + src/seta010.o \ + src/seta011.o \ + src/seta018.o \ + src/snaporig.o \ + src/snapshot.o \ + src/soundux.o \ + src/spc700.o \ + src/spc7110.o \ + src/srtc.o \ + src/tile.o \ + src/sdl/config.o \ + src/sdl/machine.o \ + src/sdl/sdl.o \ + src/unzip/explode.o \ + src/unzip/unreduce.o \ + src/unzip/unshrink.o \ + src/unzip/unzip.o \ + src/menu/fade.o \ + src/menu/menu.o \ + src/menu/menu_main.o \ + src/menu/menu_save.o \ + src/menu/menu_load.o + +ifdef USE_GL +OBJS += \ + src/sdl/videogl.o \ + src/tilegl.o +endif + +ifdef USE_CPUASM +OBJS += \ + src/i386/cpuexec.o \ + src/i386/cpuops.o \ + src/i386/sa1ops.o \ + src/i386/spc.o +else +OBJS += \ + src/cpuexec.o \ + src/sa1cpu.o +endif + +ifdef USE_MMX +OBJS += \ + src/i386/2xsaimmx.o \ + src/i386/bilinear.o +endif + +ifdef USE_ZSNES_FX +OBJS += \ + src/i386/fxemu2.o \ + src/i386/fxemu2b.o \ + src/i386/fxemu2c.o \ + src/i386/fxtable.o \ + src/i386/sfxproc.o \ + src/i386/zsnes.o \ + src/i386/zsnesc4.o \ + src/i386/c4.o +else +OBJS += \ + src/cpuops.o \ + src/fxinst.o \ + src/c4emu.o \ + src/fxemu.o +endif + + +all: $(PROG) + +run: $(PROG) + ./$(PROG) + +clean: + $(RM) $(PROG).exe $(OBJS) stdout.txt stderr.txt + +src/i386/2xsaimmx.o: src/i386/2xsaimmx.asm + nasm -f gnuwin32 src/i386/2xsaimmx.asm $(DEFS) + +src/i386/bilinear.o: src/i386/bilinear.asm + nasm -f gnuwin32 src/i386/bilinear.asm $(DEFS) + +src/i386/c4.o: src/i386/c4.asm + nasm -f gnuwin32 src/i386/c4.asm $(DEFS) + +src/i386/fxemu2.o: src/i386/fxemu2.asm + nasm -f gnuwin32 src/i386/fxemu2.asm $(DEFS) + +src/i386/fxemu2b.o: src/i386/fxemu2b.asm + nasm -f gnuwin32 src/i386/fxemu2b.asm $(DEFS) + +src/i386/fxemu2c.o: src/i386/fxemu2c.asm + nasm -f gnuwin32 src/i386/fxemu2c.asm $(DEFS) + +src/i386/fxtable.o: src/i386/fxtable.asm + nasm -f gnuwin32 src/i386/fxtable.asm $(DEFS) + +src/i386/sfxproc.o: src/i386/sfxproc.asm + nasm -f gnuwin32 src/i386/sfxproc.asm $(DEFS) + +src/i386/spc.o: src/i386/spc.asm + nasm -f gnuwin32 src/i386/spc.asm $(DEFS) + +src/i386/zsnes.o: src/i386/zsnes.asm + nasm -f gnuwin32 src/i386/zsnes.asm $(DEFS) + +src/i386/zsnesc4.o: src/i386/zsnesc4.asm + nasm -f gnuwin32 src/i386/zsnesc4.asm $(DEFS) + + +$(PROG): $(OBJS) +ifdef USE_GL + $(CC) -L/usr/lib/mingw -L/usr/local/lib -L/usr/lib/w32api/ -L/usr/X11R6/lib -lglu32 -lopengl32 -o $(PROG) -lmingw32 $(OBJS) -lglu32 -lopengl32 -lSDL_static_1212 -lGL -lpthread -mwindows -mno-cygwin -luser32 -lgdi32 -lwinmm -ldxguid +else + $(CC) -L/usr/lib/mingw -L/usr/local/lib -o $(PROG) -lmingw32 $(OBJS) -lz -lSDL_static_129 -mwindows -mno-cygwin -luser32 -lgdi32 -lwinmm -ldxguid +endif + $(STRIP) $(PROG).exe + diff --git a/README.md b/README.md deleted file mode 100644 index 6978060..0000000 --- a/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# snes4all - - - -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: - -``` -cd existing_repo -git remote add origin https://gitlab.completext.com/Dreamcast/snes4all.git -git branch -M main -git push -uf origin main -``` - -## Integrate with your tools - -- [ ] [Set up project integrations](https://gitlab.completext.com/Dreamcast/snes4all/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/data/background.bmp b/data/background.bmp new file mode 100644 index 0000000000000000000000000000000000000000..68ac541d9e5db809b9e08edeb8a99929dcbeab28 GIT binary patch literal 4918 zcmeHHYfw{X8h+Tx?7Fl|cHC*#9k-Xk>27PMrrmAb?u>TTMno_W?s6#!EQPu#9cj6!$(|GZ;eZxq_s{MO&z$e% zJMZ^C&-;GQcTTo2*8c`ptfv6)60=Rj*gy;$tRU_LsKCls<^~ZY7qH>84cPqoX3)27 z#Wp8LYK3ru$=m~P&1^K^&1Hxcu3gNK(VJiWc(7T^j-AOkKz zPVn~ifp35xw(=a{9~c1V2qtz!I>U|Y0{SioY>#n*TZAV9gII8g--0iE;^7$01Uong z&iox<#=62a+7kgGp^%4q!++;)xbxk>;(Q60cqW`g41|P-!X?fNJ7fJ3#t8=_*$G}k zF9bwH!Yj@X;am>bzDl@@JrEX{3di(q*pcc4ZWIqY69U1GiiKN>7b4=q5f+pK*9;c~ zB>N+Zn}q0HF^Gy1!8gSZ9Ckh&v$um2szeMw7SUWexa<;mWVwSaV}To7h|;(a@Hn~f zmj{EH!^FM zyj+A77Gqz29yI%MP@S)YOwbQqK^A19TiAaf9~qKs$jh!mYQoppUr-EnVJ;MD%}~hO zkzSRK!r~$nl@vpfFov3ve58r)<6vnC)T$!v&uN6JtQ3A#$Dt5UqO!acS)y5FNq)rP ziX%9E^ax6HDjcmo2F>wG94cvrPi-yA4mF|bL^aep4a)V^sH|v1y-o{FRTH$w+HtbB z2FYj7qvli{QtKNK)o>B|y3+_T7*MNgM`PU?oT;zFnY#1vYi$DG(1JRB8=BA6qr9O7 zfgNpVXuN=?iv~2DyNale4%8Z3pf$FkrRf4LHW|=pXoaEKh?uKaVKiPtd&?zsv^Al= ztrLRoZnU;^BeM54I<9r%^5xs;x^fLSx;oKyvm1iDcW}dW6Y)cLal5w%rk;Kb_V?iH zzHjhN{~-DY?_l^|KL!T>iF-q%7#bPI@aPCez8%N6-;HAIU*BQu{shJ+9^m2kKjQmG z(|9yBiK*FXOh2B%?9<11Vll(AjAaLw9r)jKz-%#_|BJ57&p=9;XDzc!(;~B;5g%SE zrSYh=A1t#3CdS7nm!d#&pPJ1>4Ls@!8&IgU*UK%Fw~QSf0|On#TN6u=Fi+O-s1%B= z4aJsX!=uya_Zmk=NsNq)blhB2;J%(k1%U+_iwK}O_T#RqfYuN11NeL3fK0+_wC0i%Rq>Pd9=O-ofVj7*t zV$mtKR4Q@NXz!fqweqbV4BQ($J^1v63f7?6Jfope6};D}l%G*-e_?C;b1LmmCkEyO zNdIQLbp_RrUf992W51uP(tCQ+e!b?yPe0xC=BiiUps{`SHQl(;Ydt@6t6Hr-G_`OS z=3z~ds_Q|K=DJG!v6#Nn-roMN+g`J`fAck(9bKasQ;9QFs(zKm%f;anhai=zXx=8w z@-CT5pC>nI8gh9b|1R#`wI96wTkfh=TUTv-g?C+i(ooCm(&$yqZ@DbE`q?EW6zq^#=EnDY8G^5VbgbS3^ds`+e-MW3f4 z-Zo{MX1M6$du!s>YW?=6e&w$=dB0&YsFbD*nJG6g)4xQk{YzQkyzU9PA(=*| zH>ea{GFcaE^E&=V(QfarW7spIKO1fkU(eI$nG6PcLRe;iPUoEC_+ViJk4~1CpM65y z%8&n0`^DO|>vyE5du&}7KWW+T`UlOl%$MnsqJGQw6P-5Yk97S){_~N?J^wg$I6F1_ z@VPPKbKWbFM)uDf)DlpuE3`UYMd#D!vtKr!OEN!6lt`r!<6r6Kpw(#$CtpTc7&n{y zL{h0lQaMpbHbAtXtvJ6h?d6f#15%>CG-A5@ptS+Dx_aj2+0U(zXGHvo){yKZY0Qvi zu8BK#bTKqyzo`$#B(JUnGQEp#u99@0jZ#Gk>nRFUm~2F zqf4YQ<1a{9B=j&+Vy#WqPhQfI&l9X9nIt5FOY@eN^f;A9P_0+~lO+-6Cp}CiUmmHT ibb9{E5}zMmIgprG+V`Jqeu)*9)0Q1rcHsZkfqw%wzCgqP literal 0 HcmV?d00001 diff --git a/data/colors.txt b/data/colors.txt new file mode 100644 index 0000000..ddfb685 --- /dev/null +++ b/data/colors.txt @@ -0,0 +1,5 @@ +menu_inv_color=0x44,0x22,0x22 +menu_win0_color=0x8F,0x5F,0x5F +menu_win1_color=0xCF,0x6F,0x6F +menu_barra0_color=0x45,0x45,0x45 +menu_barra1_color=0xff,0xc4,0x5e diff --git a/data/splash.bmp b/data/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7178f0ff74f2839c0fdaa78a3b8f1d91975bc756 GIT binary patch literal 39478 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 VZTkn^zqQME@DGkMQvQ6r{{_k4umb=9 literal 0 HcmV?d00001 diff --git a/data/text2.bmp b/data/text2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3630a22b2d37db61d22308050ae511a89d395514 GIT binary patch literal 5622 zcmds4W0YOX68>V_wr$&XGQmU>+qP}nwr$(CZS!_jb@$$LGP7>p`}5X%J11RLpSsV< zJ~KN7%Y2FgzOn`elB+IzKp?oP0eA)WL;xO#l)nljg0BDp0w7?(fCv;Q5CR7dj37aR zAZXB_2o@|Df(H+d5FtV!WXO;R6)F@$hYpP}VZtD6*sur}E*!##503~DA|PVKh=>#^ z5+X;Aj3`l}AZpa8h!!mxqDPO87%^fXX3Us~6)P5E$BvCSapE9u+_;DrFCOB@kBF6z~*hx+yF!^g)54H`5+!-fsfs8J&{ zZrm76nlwSvrcKeTSu-?m-W)Ajv_Q+2Ezzn~E3|Ii8g1INLEE-%(XL%Pv~S-Y9XfPC z$BrG*sZ%F(?%Ww&x^zL;u3gcsTQ_v?-W@%9^gz#^J<+RIFZAx+8-4opLEpZ8(XU@W z^zYvv0|pGhz<~oXXwV=G9y}OBh77^bp+hlj*f0zqJ{%)PjKIi|BQa{!D2yIG8e_(c z!Pv25F>c&Aj2}N96DCZ+#EBCzY0@N2o;(>-rcA-qsZ%j++B8g`J{>b=%)rcl^H%%49W3l=QE!i5X5Xwf1pUc4AfmMp>2rAx7F*)l9&z8ou7 ztiZ~ZE3sQJv2NWutY5z#8#Zjf#*G`XY11Zb-nCz=!zI+*1u3W*@t5C-2C{`?tVzI?&guV3-)+c$jw{vAJl{J_tjKk@6=FZ}-f zTYdoipRM%W`k!5Db3eED2lnrrzTbiG$v=;u_`mP#aa=pv#?M^!!>pzdTxeuK7e(<* zqZP2;xE!2d?In{#D5)8_Dv@?eyq!IS#B!+i6HT*PO=X4=Ca9Am@JI%_%pkOTHk7HP zAT`@a$ab|KUxqMM^WIgck z-h&0Cbmgf*gq$Hcyjs}0Jan9^li@`kUVN=?Toa=6)VpTKqd*&}1x6>h;mzJ&j$Tu4 zJ@vkQTCaYWGog!;`JOG#ZfB7+nQ3+9=mfi=5ph*MsfKoDhfq%#D$nR`o@xk`7Y!mY zkkR{Bbs!t9(}s{s_B45BrUxE+dyZf07?<5R)YbC*=VBGqcoWZyUQN-sdZwbsD!Ekk z)VpROwO%aVHqGzZ+1l{tG$vP7)AAXNjw+?QXA-z)=`G5m;l*t-2sK$c!X}B|_@uh_ z;rFXhP59RFq!~G!^I?iZk^B;oIm4gTH@f} z?IVBGUsY1zd&qSl!s8@=ypM3Uh|_<`cba}j}% zPOh1?z?w~r!^?@)EH71vW1bhsp-0-#eR;z2@2zhfCA2&>4av!iUhQa_hD?aWNXaC< z@tdkp^}jl!6R*({>Y3wvc2dYgVtJW7NuU%-GI{@2O`6HksV1Cu(TPsgTJ?759qFP# z9(APvnKf#0hB=l$4$4=TTDfzbhqDRS32d}6PQwBnW46_K;+9~_|6_LP-RI>4v0f~u z)zuu_z!J?;_x)(@ctxliif=Bt!{oj*Zoy=7>D+oEwbce0UU0)3q4WJR2xXXakjMIX zaK4{RC`@?WxMquMiJhr&=}eBTdVeZ(iBEcGb)l}-f4#394~LWbcin$$H=nh~F8;tS zmEDjV{d+_4f}7b?P4JI bool8 Memory.Init () + +Allocates and initialises several major lumps of memory, for example +the SNES ROM and RAM arrays, tile cache arrays, etc. Returns FALSE if +memory allocation fails. + +-> void Memory.Deinit () + +Undoes the memory allocations made by Memory.Init. + +-> bool8 S9xGraphicsInit () + +Allocated and initialises several lookup tables used to speed up SNES +graphics rendering. Call after you have initialised the GFX.Screen, +GFX.SubScreen and GFX.Pitch values. If Settings.Transparency is false it +does not allocate tables used to speed up transparency effects. If you +want to provide the user with option to turn the effects on and off during +game play, make sure Settings.Transparency is true when this function is +called, it can later be set to FALSE. + +Returns FALSE if memory allocation fails. + +-> void S9xGraphicsDeinit () + +Undoes the memory allocations made by S9xGraphicsInit. + +-> bool8 S9xInitAPU () + +Allocates and initialises several arrays used by the sound CPU and sound +generation code. + +-> void S9xDeinitAPU () + +Undoes the allocations made by S9xInitAPU. + +-> bool8 S9xInitSound (int mode, bool8 stereo, int buffer_size) + +Does more sound code initialisation and opens the host system's sound hardware +by calling the S9xOpenSoundDevice function provided by you. + +-> void S9xReset () + +Resets the SNES emulated hardware back to the state it was in at 'switch-on' +except the S-RAM area is presevered. The effect is it resets the current game +back to the start. This function is automatically called by Memory.LoROM. + +-> bool8 Memory.LoadROM (const char *filename) + +Attempts to load the specified ROM image filename into the emulated ROM area. +There are many different SNES ROM image formats and the code attempts to +auto-detect as many different types as it can and in a vast majority of the +cases gets it right. However, some ROM images have been edited by someone at +some stage or have been mangled by the ROM copier that produced them and +LoadROM needs help. Inparticular, it can't auto-detect the odd way in which +some Super FX games have been mangled and needs to be told, via +Settings.Interleaved2, that the ROM image is in that format, or that +odd-sized ROM images have a 512 byte copier header. + +There are several other ROM image options in the Settings structure; +allow the user to set them before calling LoadROM, or make sure they all +reset to default values before each call to LoadROM. + +-> bool8 Memory.LoadSRAM (const char *filename) + +Call this routine to load the associated S-RAM save file (if any). The +filename should be based on the ROM image name to allow easy linkage. +The current ports change the directory and the filename extension of the ROM +filename to derive the S-RAM filename. + +-> bool8 Memory.SaveSRAM (const char *filename) + +Call this routine to save the emulated S-RAM area into a file so it can +be restored again the next time the user wants to play the game. Remember +to call this when just before the emulator exits or when the user has been +playing a game and is about to load another one. + +-> void S9xMainLoop() + +The emulator main loop. Call this from your own main loop that calls this +function (if a ROM image is loaded and the game is not paused), processes +any pending host system events, then goes back around the loop again until +the emulator exits. + +S9xMainLoop normally returns control to your main loop once every emulated +frame, when it reaches the start of scan-line zero. However, the routine +can return more often if the DEBUGGER compile-time flag is defined and the +CPU has hit a break point, or the DEBUG_MODE_FLAG bit is set in CPU.Flags +or instruction single-stepping is enabled. + +-> void S9xMixSamples (uint8 *buffer, int sample_count) + +Call this routine from your host sound hardware handling code to fill the +specified buffer with ready mixed SNES sound data. If 16-bit sound mode is +choosen, then the buffer will be filled with an array of sample_count int16, +otherwise an array of sample_count uint8. If stereo sound generation is +selected the buffer is filled with the same number of samples, but in pairs, +first a left channel sample followed by the right channel sample. + +There is a limit on how much data S9xMixSamples can deal with in one go and +hence a limit on the sample_count value; the limit is the value of the +MAX_BUFFER_SIZE symbol, normally 4096 bytes. + +-> bool8 S9xSetSoundMute (bool8 mute) + +Call with a TRUE parmeter to prevent S9xMixSamples from processing SNES +sample data and instead just filling the return buffer with silent sound +data. Useful if your sound system is interrupt or callback driven and the +game has been paused either directly or indirectly because the user +interacting with the emulator's user interface in some way. + +-> bool8 S9xFreezeGame (const char *filename) + +Call this routine to record the current SNES hardware state into a file, +the file can be loaded back using S9xUnfreezeGame at a later date effectively +restoring the current game to exact same spot. Call this routine while +you're processing any pending system events when S9xMainLoop has returned +control to you in your main loop. + +-> bool8 S9xUnfreezeGame (const char *filename) + +Restore the SNES hardware back to the exactly the state it was in when +S9xFreezeGame was used to generate the file specified. You have to arrange +the correct ROM is already loaded using Memory.LoadROM, an easy way to +arrange this is to base freeze-game filenames on the ROM image name. The +Linux, UNIX and DOS ports load freeze-game files when the user presses a +function key, with the names romfilename.000 for F1, romfilename.001 for F2, +etc. Games are frozen in the first place when the user presses Shift-function +key. You could choose some other scheme. + +-> void S9xNextController () + +The real SNES allows several different types of devices to be plugged into +the game controller ports. The devices Snes9x emulates are a joy-pad, +multi-player adaptor (allowing a further 4 joy-pads to be plugged in), +a 2-button mouse and a light gun known as the SuperScope. + +Each call to S9xNextController will step the current emulated device on to +the next device in the sequence multi-player, joy-pad, mouse on port 1, +mouse on port 2, light gun then back to multi-player again. Defines +allocating a number of each device type are in snes9x.h. The currently +selected device is stored in IPPU.Controller if you want to give some +feedback to the user. The initial value of IPPU.Controller (set when +S9xReset is called) is obtained from Settings.ControllerOption based on +currently enabled options. + +Some ROMs object to certain non-joy-pad devices being plugged into the real +SNES while they are running, all Super FX games should only allow joy-pads to +be plugged in because the Super FX chip and any other device would overload +the SNES power supply. Tetris and Dr. Mario also objects for reasons best +known to itself. For this reason there are switches in the Settings +structure to enable and display the emulation of the various devices. + +const char *S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte) + +const char *S9xProActionReplayToRaw (const char *code, uint32 &address, + uint8 &byte) + +const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram, + uint8 &num_bytes, uint8 bytes[3]) + +void S9xApplyCheats (bool8 apply) + +void S9xRemoveCheats () + +void S9xAddCheat (uint32 address, bool8 cpu_address, bool8 sram, uint8 num_bytes, + uint8 byte1, uint8 byte2, uint8 byte3) + +void S9xDeleteCheats () + +void S9xDoDebug () + +Interface Routines You Need to Implement +---------------------------------------- + +bool8 S9xOpenSnapshotFile (const char *base, bool8 read_only, STREAM *file) +*************************************************************************** +void S9xCloseSnapshotFile (STREAM file) +*************************************** + +Routines to open and close freeze-game files. STREAM is defined as a +gzFile if ZLIB is defined else its defined as FILE *. The read_only parameter +is set to TRUE when reading a freeze-game file and FALSE when writing a +freeze-game file. + +void S9xExit () +*************** + +Called when some fatal error situation arises or when the 'q' debugger +command is used. The Mac port just beeps and drops back to the GUI when +S9xExit is called, the MS-DOS, Linux and Solaris ports all call exit () to +terminate the emulator process. + +void S9xParseArg (char **argv, int &index, int argc) +**************************************************** + +void S9xExtraUsage () +********************* + +If you're going to be using the simple command line parser, when it +encounters an unknown option it calls S9xUsage which is supposed to report +all options the generic parse knows about (I haven't been keeping it up to +date of late). S9xUsage then, in turn calls S9xExtraUsage which you +implement to report any port-specific options available. + +void S9xGraphicsMode () +*********************** +void S9xTextMode () +******************* + +The SNES debugger calls these routines to switch from a graphics screen +mode used to display the SNES game to a debugger screen used to display +debugger output. If the SNES screen can be displayed at the same time as +a text display, as would be the case when the host system implements a +graphical window system, or you're not going to support the SNES debugger, +then these routines should do nothing. + +On the X Window System UNIX/Linux port, these routines do nothing where as +on the MS-DOS port they switch between a graphics screen mode and a text-only +screen mode. + +bool8 S9xInitUpdate () +********************** + +Called just before Snes9x starts to render a SNES screen. The Windows port +uses this call to lock Direct X screen area to allow exclusive access; on +other existing ports its implemented as an empty function. + +bool8 S9xDeinitDisplay (int width, int height, bool8 sixteen_bit) +***************************************************************** + +Called once a complete SNES screen has been rendered into the GFX.Screen +memory buffer, now is your chance to copy the SNES rendered screen to the +host computer's screen memory. The problem is that you have to cope with +different sized SNES rendered screens. Width is always 256, unless you're +supporting SNES hi-res. screen modes (Settings.SupportHiRes is TRUE), in +which case it can be 256 or 512. The height parameter can be either 224 or +239 if you're only supporting SNES lo-res. screen modes, or 224, 239, 448 or +478 if hi-res. SNES screen modes are being supported. + +All current ports support scaling the SNES screen to fill the host system's +screen, the many ports even supports interpolation - blending the colours of +adjacent pixels to help hide the fact they've been scaled - and scan-line +simulation - slightly darkening every other horizontal line. + +Don't forget that if you're just placing the SNES image centerally in the +screen then you might need to clear areas of the screen if the SNES image +changes size between calls to S9xDeinitDisplay. The MS-DOS and UNIX ports +currently don't do this which results in junk being left on the screen if +the ROM changes SNES screen modes. + +The sixteen_bit is just a copy of the Settings.SixteenBit setting and if +TRUE indicates a 16-bit SNES screen image has been rendered, 8-bit otherwise. + +void S9xMessage (int type, int number, const char *message) +*********************************************************** + +I've started work on converting all the old printfs into calls to this +routine. When Snes9x wants to display an error, information or warning +message, it calls this routine. Check in messages.h for the types and +individual message numbers that Snes9x currently passes as parameters. + +The idea is display the message string so the user can see it, but you +choose not to display anything at all, or change the message based on the +message number or message type. + +Eventually all debug output will also go via this function, trace information +already does. + +bool8 S9xOpenSoundDevice(int mode, bool8 stereo, int buffer_size) +***************************************************************** + +S9xInitSound calls this function to actually open the host operating system's +sound device, or initialise the sound card in MS-DOS port. + +The mode parameter is the value passed in on the command line with the -r +command line flag, assuming you're using the Snes9x parser. Its meant to +indicate what playback the sound hardware should be set to, value 1 to 7. +I think the real SNES sound chip playback rate is 30kHz, but such high +playback rates take a lot of native CPU power to emulate. The default +playback rate is 22kHz for the MS-DOS and UNIX ports. + +The stereo flag indicates if the user wants stereo sound. Again, stereo +sound takes more CPU to power to emulate compared to mono sound. + +The buffer_size value indicates what sample buffer size the user wants, +usually zero, meaning you should pick the value best suited to the current +playback rate. Sound data is normally passed to the sound hardware in +blocks, the smaller the block the less latency between the SNES game playing +a sound and it being heard by the user. But if you pick a too smaller value, +and you're having to periodically poll the operating system to see if it can +accept more sound data, then the sound output will break up because other +actions such as rendering the SNES screen can prevent you from polling the +hardware often enough and the operating system runs out of sound data to +play. + +The MS-DOS port uses a buffer size of 128 samples since the sound card +sends an interrupt when more data is required which is acted upon promptly, +where as the Linux and Solaris ports use a buffer size of 512 samples or +more depending on the playback rate. Stereo and 16-bit sound both double the +actual size of the buffer in bytes. + +uint32 S9xReadJoypad (int which1_0_to_4) +**************************************** + +This function is called to return a bit-wise mask of the state of one of the +five emulated SNES controllers. Return 0 if you're not supporting controllers +past a certain number or return the mask representing the current state of +the controller number passed as a parameter or'ed with 0x80000000. + +Symbolic constants are defined in snes9x.h indicating the bit positions of +the various SNES buttons and direction indicators; they're all in the form +SNES_X_MASK where X is the SNES controller button name. + +The MS-DOS and X Window System ports record what keys are currently pressed +and use that to build up a mask, the Windows port polls the operating system +when S9xReadJoypad is called to find out what keys are pressed. All ports +also implement host joysticks and joy-pads via this interface. + +bool8 S9xReadMousePosition (int which1_0_to_1, int &x, int &y, uint32 &buttons) +******************************************************************************* + +Used by Snes9x to get the current position of the host pointing device, +usually a mouse, used to emulated the SNES mouse. Snes9x converts the x and +y values to delta values required by the SNES mouse, so the actual x and y +values are unimportant, only the change in value since the last call to +this function is used. + +Graphical windowing systems normally restrict the movement of the pointer on +the screen, if you're porting to such an environment you might want to make +a note of the change in position in the mouse since the last time you asked +the operating system the mouse position, add this change in value to some +saved x and y value, the reposition the pointer back to the centre of the +SNES display window. The saved x and y values will be the values returned +by this function. + +The buttons return value is a bit-wise mask of the two SNES mouse buttons, +bit 0 for button 1 (left) and bit 1 for button 2 (right). + +bool8 S9xReadSuperScopePosition (int &x, int &y, uint32 &buttons) +***************************************************************** + +void S9xSetPalette () +********************* + +void S9xSyncSpeed () +S9xUnixProcessSound +void _makepath(char *, char const *, char const *, char const *, char const *) +void _splitpath(char const *, char *, char *, char *, char *) + + +Sound Generation +---------------- + +Settings +-------- diff --git a/src/2xsai.cpp b/src/2xsai.cpp new file mode 100644 index 0000000..a765d5f --- /dev/null +++ b/src/2xsai.cpp @@ -0,0 +1,1210 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifdef __DJGPP +#include +#endif + +#include "snes9x.h" +#include "port.h" +#include "gfx.h" + + +extern "C" +{ + +#ifdef MMX + void _2xSaILine (uint8 *srcPtr, uint8 *deltaPtr, uint32 srcPitch, + uint32 width, uint8 *dstPtr, uint32 dstPitch); + void _2xSaISuperEagleLine (uint8 *srcPtr, uint8 *deltaPtr, + uint32 srcPitch, uint32 width, + uint8 *dstPtr, uint32 dstPitch); + void _2xSaISuper2xSaILine (uint8 *srcPtr, uint8 *deltaPtr, + uint32 srcPitch, uint32 width, + uint8 *dstPtr, uint32 dstPitch); + void Init_2xSaIMMX (uint32 BitFormat); + void BilinearMMX (uint16 * A, uint16 * B, uint16 * C, uint16 * D, + uint16 * dx, uint16 * dy, uint8 *dP); + void BilinearMMXGrid0 (uint16 * A, uint16 * B, uint16 * C, uint16 * D, + uint16 * dx, uint16 * dy, uint8 *dP); + void BilinearMMXGrid1 (uint16 * A, uint16 * B, uint16 * C, uint16 * D, + uint16 * dx, uint16 * dy, uint8 *dP); + void EndMMX (); + +#endif +} + +bool8 cpu_mmx = 1; + +static uint32 colorMask = 0xF7DEF7DE; +static uint32 lowPixelMask = 0x08210821; +static uint32 qcolorMask = 0xE79CE79C; +static uint32 qlowpixelMask = 0x18631863; +static uint32 redblueMask = 0xF81F; +static uint32 greenMask = 0x7E0; + +int Init_2xSaI (uint32 BitFormat) +{ + if (BitFormat == 565) + { + colorMask = 0xF7DEF7DE; + lowPixelMask = 0x08210821; + qcolorMask = 0xE79CE79C; + qlowpixelMask = 0x18631863; + redblueMask = 0xF81F; + greenMask = 0x7E0; + } + else if (BitFormat == 555) + { + colorMask = 0x7BDE7BDE; + lowPixelMask = 0x04210421; + qcolorMask = 0x739C739C; + qlowpixelMask = 0x0C630C63; + redblueMask = 0x7C1F; + greenMask = 0x3E0; + } + else + { + return 0; + } + +#ifdef MMX + Init_2xSaIMMX (BitFormat); +#endif + + return 1; +} + +static __inline__ int GetResult1 (uint32 A, uint32 B, uint32 C, uint32 D, + uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +static __inline__ int GetResult2 (uint32 A, uint32 B, uint32 C, uint32 D, + uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r -= 1; + if (y <= 1) + r += 1; + return r; +} + +static __inline__ int GetResult (uint32 A, uint32 B, uint32 C, uint32 D) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +static __inline__ uint32 INTERPOLATE (uint32 A, uint32 B) +{ + if (A != B) + { + return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + + (A & B & lowPixelMask)); + } + else + return A; +} + +static __inline__ uint32 Q_INTERPOLATE (uint32 A, uint32 B, uint32 C, uint32 D) +{ + register uint32 x = ((A & qcolorMask) >> 2) + + ((B & qcolorMask) >> 2) + + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); + register uint32 y = (A & qlowpixelMask) + + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); + + y = (y >> 2) & qlowpixelMask; + return x + y; +} + +#define BLUE_MASK565 0x001F001F +#define RED_MASK565 0xF800F800 +#define GREEN_MASK565 0x07E007E0 + +#define BLUE_MASK555 0x001F001F +#define RED_MASK555 0x7C007C00 +#define GREEN_MASK555 0x03E003E0 + +void Super2xSaI (uint8 *srcPtr, uint32 srcPitch, + uint8 *deltaPtr, uint8 *dstPtr, uint32 dstPitch, + int width, int height) +{ + uint16 *bP; + uint8 *dP; + uint32 inc_bP; + +#ifdef MMX + if (cpu_mmx) + { + while (height--) + { + _2xSaISuper2xSaILine (srcPtr, deltaPtr, srcPitch, width, + dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } + else +#endif + + { + uint32 Nextline = srcPitch >> 1; + inc_bP = 1; + + while (height--) + { + bP = (uint16 *) srcPtr; + dP = (uint8 *) dstPtr; + + for (uint32 finish = width; finish; finish -= inc_bP) + { + uint32 color4, color5, color6; + uint32 color1, color2, color3; + uint32 colorA0, colorA1, colorA2, colorA3, + colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; + uint32 product1a, product1b, product2a, product2b; + +//--------------------------------------- B1 B2 +// 4 5 6 S2 +// 1 2 3 S1 +// A1 A2 + + colorB0 = *(bP - Nextline - 1); + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + colorB3 = *(bP - Nextline + 2); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA0 = *(bP + Nextline + Nextline - 1); + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + colorA3 = *(bP + Nextline + Nextline + 2); + +//-------------------------------------- + if (color2 == color6 && color5 != color3) + { + product2b = product1b = color2; + } + else if (color5 == color3 && color2 != color6) + { + product2b = product1b = color5; + } + else if (color5 == color3 && color2 == color6) + { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + product2b = product1b = color6; + else if (r < 0) + product2b = product1b = color5; + else + { + product2b = product1b = INTERPOLATE (color5, color6); + } + } + else + { + if (color6 == color3 && color3 == colorA1 + && color2 != colorA2 && color3 != colorA0) + product2b = + Q_INTERPOLATE (color3, color3, color3, color2); + else if (color5 == color2 && color2 == colorA2 + && colorA1 != color3 && color2 != colorA3) + product2b = + Q_INTERPOLATE (color2, color2, color2, color3); + else + product2b = INTERPOLATE (color2, color3); + + if (color6 == color3 && color6 == colorB1 + && color5 != colorB2 && color6 != colorB0) + product1b = + Q_INTERPOLATE (color6, color6, color6, color5); + else if (color5 == color2 && color5 == colorB2 + && colorB1 != color6 && color5 != colorB3) + product1b = + Q_INTERPOLATE (color6, color5, color5, color5); + else + product1b = INTERPOLATE (color5, color6); + } + + if (color5 == color3 && color2 != color6 && color4 == color5 + && color5 != colorA2) + product2a = INTERPOLATE (color2, color5); + else + if (color5 == color1 && color6 == color5 + && color4 != color2 && color5 != colorA0) + product2a = INTERPOLATE (color2, color5); + else + product2a = color2; + + if (color2 == color6 && color5 != color3 && color1 == color2 + && color2 != colorB2) + product1a = INTERPOLATE (color2, color5); + else + if (color4 == color2 && color3 == color2 + && color1 != color5 && color2 != colorB0) + product1a = INTERPOLATE (color2, color5); + else + product1a = color5; + + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); + + *((uint32 *) dP) = product1a; + *((uint32 *) (dP + dstPitch)) = product2a; + + bP += inc_bP; + dP += sizeof (uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } // while (height--) + } +} + +void SuperEagle (uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, + uint8 *dstPtr, uint32 dstPitch, int width, int height) +{ + uint8 *dP; + uint16 *bP; + uint16 *xP; + uint32 inc_bP; + +#ifdef MMX + if (cpu_mmx) + { + while (height--) + { + _2xSaISuperEagleLine (srcPtr, deltaPtr, srcPitch, width, + dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } + else +#endif + + { + inc_bP = 1; + + uint32 Nextline = srcPitch >> 1; + + while (height--) + { + bP = (uint16 *) srcPtr; + xP = (uint16 *) deltaPtr; + dP = dstPtr; + for (uint32 finish = width; finish; finish -= inc_bP) + { + uint32 color4, color5, color6; + uint32 color1, color2, color3; + uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; + uint32 product1a, product1b, product2a, product2b; + + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + + // -------------------------------------- + if (color2 == color6 && color5 != color3) + { + product1b = product2a = color2; + if ((color1 == color2) || (color6 == colorB2)) + { + product1a = INTERPOLATE (color2, color5); + product1a = INTERPOLATE (color2, product1a); +// product1a = color2; + } + else + { + product1a = INTERPOLATE (color5, color6); + } + + if ((color6 == colorS2) || (color2 == colorA1)) + { + product2b = INTERPOLATE (color2, color3); + product2b = INTERPOLATE (color2, product2b); +// product2b = color2; + } + else + { + product2b = INTERPOLATE (color2, color3); + } + } + else if (color5 == color3 && color2 != color6) + { + product2b = product1a = color5; + + if ((colorB1 == color5) || (color3 == colorS1)) + { + product1b = INTERPOLATE (color5, color6); + product1b = INTERPOLATE (color5, product1b); +// product1b = color5; + } + else + { + product1b = INTERPOLATE (color5, color6); + } + + if ((color3 == colorA2) || (color4 == color5)) + { + product2a = INTERPOLATE (color5, color2); + product2a = INTERPOLATE (color5, product2a); +// product2a = color5; + } + else + { + product2a = INTERPOLATE (color2, color3); + } + + } + else if (color5 == color3 && color2 == color6) + { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + { + product1b = product2a = color2; + product1a = product2b = INTERPOLATE (color5, color6); + } + else if (r < 0) + { + product2b = product1a = color5; + product1b = product2a = INTERPOLATE (color5, color6); + } + else + { + product2b = product1a = color5; + product1b = product2a = color2; + } + } + else + { + product2b = product1a = INTERPOLATE (color2, color6); + product2b = + Q_INTERPOLATE (color3, color3, color3, product2b); + product1a = + Q_INTERPOLATE (color5, color5, color5, product1a); + + product2a = product1b = INTERPOLATE (color5, color3); + product2a = + Q_INTERPOLATE (color2, color2, color2, product2a); + product1b = + Q_INTERPOLATE (color6, color6, color6, product1b); + +// product1a = color5; +// product1b = color6; +// product2a = color2; +// product2b = color3; + } + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); + + *((uint32 *) dP) = product1a; + *((uint32 *) (dP + dstPitch)) = product2a; + *xP = color5; + + bP += inc_bP; + xP += inc_bP; + dP += sizeof (uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } // endof: while (height--) + } +} + +void _2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, + uint8 *dstPtr, uint32 dstPitch, int width, int height) +{ + uint8 *dP; + uint16 *bP; + uint32 inc_bP; + +#ifdef MMX + if (cpu_mmx) + { + while (height--) + { + _2xSaILine (srcPtr, deltaPtr, srcPitch, width, dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } + else +#endif + + { + inc_bP = 1; + + uint32 Nextline = srcPitch >> 1; + + while (height--) + { + bP = (uint16 *) srcPtr; + dP = dstPtr; + + for (uint32 finish = width; finish; finish -= inc_bP) + { + + register uint32 colorA, colorB; + uint32 colorC, colorD, + colorE, colorF, colorG, colorH, + colorI, colorJ, colorK, colorL, + + colorM, colorN, colorO, colorP; + uint32 product, product1, product2; + +//--------------------------------------- +// Map of the pixels: I|E F|J +// G|A B|K +// H|C D|L +// M|N O|P + colorI = *(bP - Nextline - 1); + colorE = *(bP - Nextline); + colorF = *(bP - Nextline + 1); + colorJ = *(bP - Nextline + 2); + + colorG = *(bP - 1); + colorA = *(bP); + colorB = *(bP + 1); + colorK = *(bP + 2); + + colorH = *(bP + Nextline - 1); + colorC = *(bP + Nextline); + colorD = *(bP + Nextline + 1); + colorL = *(bP + Nextline + 2); + + colorM = *(bP + Nextline + Nextline - 1); + colorN = *(bP + Nextline + Nextline); + colorO = *(bP + Nextline + Nextline + 1); + colorP = *(bP + Nextline + Nextline + 2); + + if ((colorA == colorD) && (colorB != colorC)) + { + if (((colorA == colorE) && (colorB == colorL)) || + ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ))) + { + product = colorA; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorA == colorG) && (colorC == colorO)) || + ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM))) + { + product1 = colorA; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorA; + } + else if ((colorB == colorC) && (colorA != colorD)) + { + if (((colorB == colorF) && (colorA == colorH)) || + ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI))) + { + product = colorB; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorC == colorH) && (colorA == colorF)) || + ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI))) + { + product1 = colorC; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorB; + } + else if ((colorA == colorD) && (colorB == colorC)) + { + if (colorA == colorB) + { + product = colorA; + product1 = colorA; + product2 = colorA; + } + else + { + register int r = 0; + + product1 = INTERPOLATE (colorA, colorC); + product = INTERPOLATE (colorA, colorB); + + r += + GetResult1 (colorA, colorB, colorG, colorE, + colorI); + r += + GetResult2 (colorB, colorA, colorK, colorF, + colorJ); + r += + GetResult2 (colorB, colorA, colorH, colorN, + colorM); + r += + GetResult1 (colorA, colorB, colorL, colorO, + colorP); + + if (r > 0) + product2 = colorA; + else if (r < 0) + product2 = colorB; + else + { + product2 = + Q_INTERPOLATE (colorA, colorB, colorC, + colorD); + } + } + } + else + { + product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); + + if ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ)) + { + product = colorA; + } + else + if ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI)) + { + product = colorB; + } + else + { + product = INTERPOLATE (colorA, colorB); + } + + if ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM)) + { + product1 = colorA; + } + else + if ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI)) + { + product1 = colorC; + } + else + { + product1 = INTERPOLATE (colorA, colorC); + } + } + + product = colorA | (product << 16); + product1 = product1 | (product2 << 16); + *((int32 *) dP) = product; + *((uint32 *) (dP + dstPitch)) = product1; + + bP += inc_bP; + dP += sizeof (uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } // endof: while (height--) + } +} + +#ifdef MMX +void Scale_2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 * /* deltaPtr */, + uint8 *dstPtr, uint32 dstPitch, + uint32 dstWidth, uint32 dstHeight, int width, int height) +{ + uint8 *dP; + uint16 *bP; + uint32 w; + uint32 h; + uint32 dw; + uint32 dh; + uint32 hfinish; + uint32 wfinish; + uint32 Nextline; + uint16 colorA[4]; + uint16 colorB[4]; + uint16 colorC[4]; + uint16 colorD[4]; + uint16 dx[4]; + uint16 dy[4]; + + Nextline = srcPitch >> 1; + + wfinish = (width - 1) << 16; // convert to fixed point + hfinish = (height - 1) << 16; // convert to fixed point + dw = wfinish / (dstWidth - 1); + dh = hfinish / (dstHeight - 1); + + for (h = 0; h < hfinish; h += dh) + { + uint32 y1, y2; + + y1 = h & 0xffff; // fraction part of fixed point + y2 = 0x10000 - y1; + bP = (uint16 *) (srcPtr + ((h >> 16) * srcPitch)); + dP = dstPtr; + + for (w = 0; w < wfinish;) + { + uint32 A, B, C, D; + uint32 E, F, G, H; + uint32 I, J, K, L; + uint32 x1, x2, a1, f1, f2; + uint32 position; + + for (int c = 0; c < 4; c++) + { + position = w >> 16; + A = bP[position]; // current pixel + B = bP[position + 1]; // next pixel + C = bP[position + Nextline]; + D = bP[position + Nextline + 1]; + E = bP[position - Nextline]; + F = bP[position - Nextline + 1]; + G = bP[position - 1]; + H = bP[position + Nextline - 1]; + I = bP[position + 2]; + J = bP[position + Nextline + 2]; + K = bP[position + Nextline + Nextline]; + L = bP[position + Nextline + Nextline + 1]; + + x1 = w & 0xffff; // fraction part of fixed point + x2 = 0x10000 - x1; + + /*1*/ + if (A == D && B != C) + { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y1 <= f1 && A == J && A != E) // close to B + { + a1 = f1 - y1; + colorA[c] = A; + colorB[c] = B; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y1 >= f1 && A == G && A != L) // close to C + { + a1 = y1 - f1; + colorA[c] = A; + colorB[c] = C; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (x1 >= f2 && A == E && A != J) // close to B + { + a1 = x1 - f2; + colorA[c] = A; + colorB[c] = B; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (x1 <= f2 && A == L && A != G) // close to C + { + a1 = f2 - x1; + colorA[c] = A; + colorB[c] = C; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y1 >= x1) // close to C + { + a1 = y1 - x1; + colorA[c] = A; + colorB[c] = C; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y1 <= x1) // close to B + { + a1 = x1 - y1; + colorA[c] = A; + colorB[c] = B; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + } + else + /*2*/ + if (B == C && A != D) + { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y2 >= f1 && B == H && B != F) // close to A + { + a1 = y2 - f1; + colorA[c] = B; + colorB[c] = A; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y2 <= f1 && B == I && B != K) // close to D + { + a1 = f1 - y2; + colorA[c] = B; + colorB[c] = D; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (x2 >= f2 && B == F && B != H) // close to A + { + a1 = x2 - f2; + colorA[c] = B; + colorB[c] = A; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (x2 <= f2 && B == K && B != I) // close to D + { + a1 = f2 - x2; + colorA[c] = B; + colorB[c] = D; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y2 >= x1) // close to A + { + a1 = y2 - x1; + colorA[c] = B; + colorB[c] = A; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + else if (y2 <= x1) // close to D + { + a1 = x1 - y2; + colorA[c] = B; + colorB[c] = D; + colorC[c] = 0; + colorD[c] = 0; + dx[c] = a1; + dy[c] = 0; + } + } + /*3*/ + else + { + colorA[c] = A; + colorB[c] = B; + colorC[c] = C; + colorD[c] = D; + dx[c] = x1; + dy[c] = y1; + } + w += dw; + } + BilinearMMX (colorA, colorB, colorC, colorD, dx, dy, dP); + dP += 8; + } + dstPtr += dstPitch; + }; + EndMMX (); + +} + +#else +static uint32 Bilinear (uint32 A, uint32 B, uint32 x) +{ + unsigned long areaA, areaB; + unsigned long result; + + if (A == B) + return A; + + areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits + areaA = 0x20 - areaB; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + + result = ((areaA * A) + (areaB * B)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); + +} + +static uint32 Bilinear4 (uint32 A, uint32 B, uint32 C, uint32 D, uint32 x, + uint32 y) +{ + unsigned long areaA, areaB, areaC, areaD; + unsigned long result, xy; + + x = (x >> 11) & 0x1f; + y = (y >> 11) & 0x1f; + xy = (x * y) >> 5; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + C = (C & redblueMask) | ((C & greenMask) << 16); + D = (D & redblueMask) | ((D & greenMask) << 16); + + areaA = 0x20 + xy - x - y; + areaB = x - xy; + areaC = y - xy; + areaD = xy; + + result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); +} + +void Scale_2xSaI (uint8 *srcPtr, uint32 srcPitch, uint8 * /* deltaPtr */, + uint8 *dstPtr, uint32 dstPitch, + uint32 dstWidth, uint32 dstHeight, int width, int height) +{ + uint8 *dP; + uint16 *bP; + + uint32 w; + uint32 h; + uint32 dw; + uint32 dh; + uint32 hfinish; + uint32 wfinish; + + uint32 Nextline = srcPitch >> 1; + + wfinish = (width - 1) << 16; // convert to fixed point + dw = wfinish / (dstWidth - 1); + hfinish = (height - 1) << 16; // convert to fixed point + dh = hfinish / (dstHeight - 1); + + for (h = 0; h < hfinish; h += dh) + { + uint32 y1, y2; + + y1 = h & 0xffff; // fraction part of fixed point + bP = (uint16 *) (srcPtr + ((h >> 16) * srcPitch)); + dP = dstPtr; + y2 = 0x10000 - y1; + + w = 0; + + for (; w < wfinish;) + { + uint32 A, B, C, D; + uint32 E, F, G, H; + uint32 I, J, K, L; + uint32 x1, x2, a1, f1, f2; + uint32 position, product1; + + position = w >> 16; + A = bP[position]; // current pixel + B = bP[position + 1]; // next pixel + C = bP[position + Nextline]; + D = bP[position + Nextline + 1]; + E = bP[position - Nextline]; + F = bP[position - Nextline + 1]; + G = bP[position - 1]; + H = bP[position + Nextline - 1]; + I = bP[position + 2]; + J = bP[position + Nextline + 2]; + K = bP[position + Nextline + Nextline]; + L = bP[position + Nextline + Nextline + 1]; + + x1 = w & 0xffff; // fraction part of fixed point + x2 = 0x10000 - x1; + + /*0*/ + if (A == B && C == D && A == C) + product1 = A; + else + /*1*/ + if (A == D && B != C) + { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y1 <= f1 && A == J && A != E) // close to B + { + a1 = f1 - y1; + product1 = Bilinear (A, B, a1); + } + else if (y1 >= f1 && A == G && A != L) // close to C + { + a1 = y1 - f1; + product1 = Bilinear (A, C, a1); + } + else if (x1 >= f2 && A == E && A != J) // close to B + { + a1 = x1 - f2; + product1 = Bilinear (A, B, a1); + } + else if (x1 <= f2 && A == L && A != G) // close to C + { + a1 = f2 - x1; + product1 = Bilinear (A, C, a1); + } + else if (y1 >= x1) // close to C + { + a1 = y1 - x1; + product1 = Bilinear (A, C, a1); + } + else if (y1 <= x1) // close to B + { + a1 = x1 - y1; + product1 = Bilinear (A, B, a1); + } + } + else + /*2*/ + if (B == C && A != D) + { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y2 >= f1 && B == H && B != F) // close to A + { + a1 = y2 - f1; + product1 = Bilinear (B, A, a1); + } + else if (y2 <= f1 && B == I && B != K) // close to D + { + a1 = f1 - y2; + product1 = Bilinear (B, D, a1); + } + else if (x2 >= f2 && B == F && B != H) // close to A + { + a1 = x2 - f2; + product1 = Bilinear (B, A, a1); + } + else if (x2 <= f2 && B == K && B != I) // close to D + { + a1 = f2 - x2; + product1 = Bilinear (B, D, a1); + } + else if (y2 >= x1) // close to A + { + a1 = y2 - x1; + product1 = Bilinear (B, A, a1); + } + else if (y2 <= x1) // close to D + { + a1 = x1 - y2; + product1 = Bilinear (B, D, a1); + } + } + /*3*/ + else + { + product1 = Bilinear4 (A, B, C, D, x1, y1); + } + +//end First Pixel + *(uint32 *) dP = product1; + dP += 2; + w += dw; + } + dstPtr += dstPitch; + } +} + +#endif + diff --git a/src/apu.cpp b/src/apu.cpp new file mode 100644 index 0000000..ccfb8d4 --- /dev/null +++ b/src/apu.cpp @@ -0,0 +1,860 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifdef __DJGPP +#include +#undef TRUE +#endif + +#include "snes9x.h" +#include "spc700.h" +#include "apu.h" +#include "soundux.h" +#include "cpuexec.h" + +/* For note-triggered SPC dump support */ +#include "snapshot.h" + +extern "C" {const char *S9xGetFilenameInc (const char *);} + +#ifdef USE_SPC_DUMP +int spc_is_dumping=0; +int spc_is_dumping_temp; +uint8 spc_dump_dsp[0x100]; +#endif + +extern int NoiseFreq [32]; + +static char _IAPU_RAM_[0x10000]; +static char _IAPU_ShadowRAM_[0x10000]; +static char _IAPU_CachedSamples_[0x40000]; +bool8 S9xInitAPU () +{ + IAPU.RAM = (uint8 *) &_IAPU_RAM_; + IAPU.ShadowRAM = (uint8 *) &_IAPU_ShadowRAM_; + IAPU.CachedSamples = (uint8 *) &_IAPU_CachedSamples_; + bzero(IAPU.RAM,sizeof(_IAPU_RAM_)); + bzero(IAPU.ShadowRAM,sizeof(_IAPU_ShadowRAM_)); + bzero(IAPU.ShadowRAM,sizeof(_IAPU_CachedSamples_)); + + if (!IAPU.RAM || !IAPU.ShadowRAM || !IAPU.CachedSamples) + { + S9xDeinitAPU (); + return (FALSE); + } + + memset(IAPU.RAM, 0, 0x10000); + memset(IAPU.ShadowRAM, 0, 0x10000); + memset(IAPU.CachedSamples, 0, 0x40000); + + return (TRUE); +} + +void S9xDeinitAPU () +{ + IAPU.RAM = NULL; + IAPU.ShadowRAM = NULL; + IAPU.CachedSamples = NULL; +} + +EXTERN_C uint8 APUROM [64]; + +void S9xResetAPU () +{ + + int i; + + Settings.APUEnabled = Settings.NextAPUEnabled; + +#ifdef USE_SPC_DUMP + ZeroMemory(spc_dump_dsp, 0x100); +#endif + ZeroMemory(IAPU.RAM, 0x100); + memset(IAPU.RAM+0x20, 0xFF, 0x20); + memset(IAPU.RAM+0x60, 0xFF, 0x20); + memset(IAPU.RAM+0xA0, 0xFF, 0x20); + memset(IAPU.RAM+0xE0, 0xFF, 0x20); + + for(i=1;i<256;i++) + { + memcpy(IAPU.RAM+(i<<8), IAPU.RAM, 0x100); + } + + memcpy (IAPU.ShadowRAM, IAPU.RAM, 0x10000); + + ZeroMemory (IAPU.CachedSamples, 0x40000); + ZeroMemory (APU.OutPorts, 4); + IAPU.DirectPage = IAPU.RAM; + memmove (&IAPU.RAM [0xffc0], APUROM, sizeof (APUROM)); + memmove (APU.ExtraRAM, APUROM, sizeof (APUROM)); + IAPU.PC = IAPU.RAM + IAPU.RAM [0xfffe] + (IAPU.RAM [0xffff] << 8); + APU.Cycles = 0; + APURegisters.YA.W = 0; + APURegisters.X = 0; + APURegisters.S = 0xff; + APURegisters.P = 0; + S9xAPUUnpackStatus (); + APURegisters.PC = 0; + IAPU.APUExecuting = Settings.APUEnabled; +#ifdef SPC700_SHUTDOWN + IAPU.WaitAddress1 = NULL; + IAPU.WaitAddress2 = NULL; + IAPU.WaitCounter = 0; +#endif + IAPU.NextAPUTimerPos = 0; + IAPU.APUTimerCounter = 0; + APU.ShowROM = TRUE; + IAPU.RAM [0xf1] = 0x80; + + for (i = 0; i < 3; i++) + { + APU.TimerEnabled [i] = FALSE; + APU.TimerValueWritten [i] = 0; + APU.TimerTarget [i] = 0; + APU.Timer [i] = 0; + } + for (int j = 0; j < 0x80; j++) + APU.DSP [j] = 0; + + IAPU.TwoCycles = IAPU.OneCycle * 2; + + for (i = 0; i < 256; i++) + S9xAPUCycles [i] = S9xAPUCycleLengths [i] * IAPU.OneCycle; + + APU.DSP [APU_ENDX] = 0; + APU.DSP [APU_KOFF] = 0; + APU.DSP [APU_KON] = 0; + APU.DSP [APU_FLG] = APU_MUTE | APU_ECHO_DISABLED; + APU.KeyedChannels = 0; + + S9xResetSound (TRUE); +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoEnable (0); +#endif +} + +void S9xSetAPUDSP (uint8 byte) +{ + uint8 reg = IAPU.RAM [0xf2]; + static uint8 KeyOn; + static uint8 KeyOnPrev; + int i; + +#ifdef USE_SPC_DUMP + spc_dump_dsp[reg] = byte; +#endif + + switch (reg) + { + case APU_FLG: + if (byte & APU_SOFT_RESET) + { + APU.DSP [reg] = APU_MUTE | APU_ECHO_DISABLED | (byte & 0x1f); + APU.DSP [APU_ENDX] = 0; + APU.DSP [APU_KOFF] = 0; + APU.DSP [APU_KON] = 0; +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoWriteEnable (FALSE); +#endif + // Kill sound + S9xResetSound (FALSE); + } + else + { +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoWriteEnable (!(byte & APU_ECHO_DISABLED)); +#endif + if (byte & APU_MUTE) + { + S9xSetSoundMute (TRUE); + } + else + S9xSetSoundMute (FALSE); + + SoundData.noise_hertz = NoiseFreq [byte & 0x1f]; + for (i = 0; i < 8; i++) + { + if (SoundData.channels [i].type == SOUND_NOISE) + S9xSetSoundFrequency (i, SoundData.noise_hertz); + } + } + break; + case APU_NON: + if (byte != APU.DSP [APU_NON]) + { + uint8 mask = 1; + for (int c = 0; c < 8; c++, mask <<= 1) + { + int type; + if (byte & mask) + { + type = SOUND_NOISE; + } + else + { + type = SOUND_SAMPLE; + } + S9xSetSoundType (c, type); + } + } + break; + case APU_MVOL_LEFT: +#ifdef ENABLE_MASTER_VOLUMEN + if (byte != APU.DSP [APU_MVOL_LEFT]) + { + S9xSetMasterVolume ((signed char) byte, + (signed char) APU.DSP [APU_MVOL_RIGHT]); + } +#endif + break; + case APU_MVOL_RIGHT: +#ifdef ENABLE_MASTER_VOLUMEN + if (byte != APU.DSP [APU_MVOL_RIGHT]) + { + S9xSetMasterVolume ((signed char) APU.DSP [APU_MVOL_LEFT], + (signed char) byte); + } +#endif + break; + case APU_EVOL_LEFT: +#ifdef ENABLE_ECHO_SOUND + if (byte != APU.DSP [APU_EVOL_LEFT]) + { + S9xSetEchoVolume ((signed char) byte, + (signed char) APU.DSP [APU_EVOL_RIGHT]); + } +#endif + break; + case APU_EVOL_RIGHT: +#ifdef ENABLE_ECHO_SOUND + if (byte != APU.DSP [APU_EVOL_RIGHT]) + { + S9xSetEchoVolume ((signed char) APU.DSP [APU_EVOL_LEFT], + (signed char) byte); + } +#endif + break; + case APU_ENDX: + byte = 0; + break; + + case APU_KOFF: + // if (byte) + { + uint8 mask = 1; + for (int c = 0; c < 8; c++, mask <<= 1) + { + if ((byte & mask) != 0) + { + if (APU.KeyedChannels & mask) + { + { + KeyOnPrev&=~mask; + APU.KeyedChannels &= ~mask; + APU.DSP [APU_KON] &= ~mask; + //APU.DSP [APU_KOFF] |= mask; + S9xSetSoundKeyOff (c); + } + } + } + else if((KeyOnPrev&mask)!=0) + { + KeyOnPrev&=~mask; + APU.KeyedChannels |= mask; + //APU.DSP [APU_KON] |= mask; + APU.DSP [APU_KOFF] &= ~mask; + APU.DSP [APU_ENDX] &= ~mask; + S9xPlaySample (c); + } + } + } + //KeyOnPrev=0; + APU.DSP [APU_KOFF] = byte; + return; + case APU_KON: +#ifdef USE_SPC_DUMP + if (spc_is_dumping) + { + if (byte & ~spc_is_dumping_temp) + { + APURegisters.PC = IAPU.PC - IAPU.RAM; + S9xAPUPackStatus(); + S9xSPCDump (S9xGetFilenameInc (".spc")); + spc_is_dumping = 0; + } + } +#endif + if (byte) + { + uint8 mask = 1; + for (int c = 0; c < 8; c++, mask <<= 1) + { + if ((byte & mask) != 0) + { + // Pac-In-Time requires that channels can be key-on + // regardeless of their current state. + if((APU.DSP [APU_KOFF] & mask) ==0) + { + KeyOnPrev&=~mask; + APU.KeyedChannels |= mask; + //APU.DSP [APU_KON] |= mask; + //APU.DSP [APU_KOFF] &= ~mask; + APU.DSP [APU_ENDX] &= ~mask; + S9xPlaySample (c); + } + else KeyOn|=mask; + } + } + } +#ifdef USE_SPC_DUMP + spc_is_dumping_temp = byte; +#endif + return; + + case APU_VOL_LEFT + 0x00: + case APU_VOL_LEFT + 0x10: + case APU_VOL_LEFT + 0x20: + case APU_VOL_LEFT + 0x30: + case APU_VOL_LEFT + 0x40: + case APU_VOL_LEFT + 0x50: + case APU_VOL_LEFT + 0x60: + case APU_VOL_LEFT + 0x70: + // At Shin Megami Tensei suggestion 6/11/00 + // if (byte != APU.DSP [reg]) + { + S9xSetSoundVolume (reg >> 4, (signed char) byte, + (signed char) APU.DSP [reg + 1]); + } + break; + case APU_VOL_RIGHT + 0x00: + case APU_VOL_RIGHT + 0x10: + case APU_VOL_RIGHT + 0x20: + case APU_VOL_RIGHT + 0x30: + case APU_VOL_RIGHT + 0x40: + case APU_VOL_RIGHT + 0x50: + case APU_VOL_RIGHT + 0x60: + case APU_VOL_RIGHT + 0x70: + // At Shin Megami Tensei suggestion 6/11/00 + // if (byte != APU.DSP [reg]) + { + S9xSetSoundVolume (reg >> 4, (signed char) APU.DSP [reg - 1], + (signed char) byte); + } + break; + + case APU_P_LOW + 0x00: + case APU_P_LOW + 0x10: + case APU_P_LOW + 0x20: + case APU_P_LOW + 0x30: + case APU_P_LOW + 0x40: + case APU_P_LOW + 0x50: + case APU_P_LOW + 0x60: + case APU_P_LOW + 0x70: + S9xSetSoundHertz (reg >> 4, ((byte + (APU.DSP [reg + 1] << 8)) & FREQUENCY_MASK) * 8); + break; + + case APU_P_HIGH + 0x00: + case APU_P_HIGH + 0x10: + case APU_P_HIGH + 0x20: + case APU_P_HIGH + 0x30: + case APU_P_HIGH + 0x40: + case APU_P_HIGH + 0x50: + case APU_P_HIGH + 0x60: + case APU_P_HIGH + 0x70: + S9xSetSoundHertz (reg >> 4, + (((byte << 8) + APU.DSP [reg - 1]) & FREQUENCY_MASK) * 8); + break; + + case APU_SRCN + 0x00: + case APU_SRCN + 0x10: + case APU_SRCN + 0x20: + case APU_SRCN + 0x30: + case APU_SRCN + 0x40: + case APU_SRCN + 0x50: + case APU_SRCN + 0x60: + case APU_SRCN + 0x70: + /* if (byte != APU.DSP [reg]) { + S9xSetSoundSample (reg >> 4, byte); + } */ + break; + + case APU_ADSR1 + 0x00: + case APU_ADSR1 + 0x10: + case APU_ADSR1 + 0x20: + case APU_ADSR1 + 0x30: + case APU_ADSR1 + 0x40: + case APU_ADSR1 + 0x50: + case APU_ADSR1 + 0x60: + case APU_ADSR1 + 0x70: + if (byte != APU.DSP [reg]) + { + { + S9xFixEnvelope (reg >> 4, APU.DSP [reg + 2], byte, + APU.DSP [reg + 1]); + } + } + break; + + case APU_ADSR2 + 0x00: + case APU_ADSR2 + 0x10: + case APU_ADSR2 + 0x20: + case APU_ADSR2 + 0x30: + case APU_ADSR2 + 0x40: + case APU_ADSR2 + 0x50: + case APU_ADSR2 + 0x60: + case APU_ADSR2 + 0x70: + if (byte != APU.DSP [reg]) + { + { + S9xFixEnvelope (reg >> 4, APU.DSP [reg + 1], APU.DSP [reg - 1], + byte); + } + } + break; + + case APU_GAIN + 0x00: + case APU_GAIN + 0x10: + case APU_GAIN + 0x20: + case APU_GAIN + 0x30: + case APU_GAIN + 0x40: + case APU_GAIN + 0x50: + case APU_GAIN + 0x60: + case APU_GAIN + 0x70: + if (byte != APU.DSP [reg]) + { + { + S9xFixEnvelope (reg >> 4, byte, APU.DSP [reg - 2], + APU.DSP [reg - 1]); + } + } + break; + + case APU_ENVX + 0x00: + case APU_ENVX + 0x10: + case APU_ENVX + 0x20: + case APU_ENVX + 0x30: + case APU_ENVX + 0x40: + case APU_ENVX + 0x50: + case APU_ENVX + 0x60: + case APU_ENVX + 0x70: + break; + + case APU_OUTX + 0x00: + case APU_OUTX + 0x10: + case APU_OUTX + 0x20: + case APU_OUTX + 0x30: + case APU_OUTX + 0x40: + case APU_OUTX + 0x50: + case APU_OUTX + 0x60: + case APU_OUTX + 0x70: + break; + + case APU_DIR: + break; + + case APU_PMON: + if (byte != APU.DSP [APU_PMON]) + { + S9xSetFrequencyModulationEnable (byte); + } + break; + + case APU_EON: +#ifdef ENABLE_ECHO_SOUND + if (byte != APU.DSP [APU_EON]) + { + S9xSetEchoEnable (byte); + } +#endif + break; + + case APU_EFB: +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoFeedback ((signed char) byte); +#endif + break; + + case APU_ESA: + break; + + case APU_EDL: +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoDelay (byte & 0xf); +#endif + break; + + case APU_C0: + case APU_C1: + case APU_C2: + case APU_C3: + case APU_C4: + case APU_C5: + case APU_C6: + case APU_C7: + S9xSetFilterCoefficient (reg >> 4, (signed char) byte); + break; + default: + // XXX + //printf ("Write %02x to unknown APU register %02x\n", byte, reg); + break; + } + + KeyOnPrev|=KeyOn; + KeyOn=0; + + if (reg < 0x80) + APU.DSP [reg] = byte; +} + +void S9xFixEnvelope (int channel, uint8 gain, uint8 adsr1, uint8 adsr2) +{ + if (adsr1 & 0x80) + { + // ADSR mode + static unsigned long AttackRate [16] = { + 4100, 2600, 1500, 1000, 640, 380, 260, 160, + 96, 64, 40, 24, 16, 10, 6, 1 + }; + static unsigned long DecayRate [8] = { + 1200, 740, 440, 290, 180, 110, 74, 37 + }; + static unsigned long SustainRate [32] = { + ~0, 38000, 28000, 24000, 19000, 14000, 12000, 9400, + 7100, 5900, 4700, 3500, 2900, 2400, 1800, 1500, + 1200, 880, 740, 590, 440, 370, 290, 220, + 180, 150, 110, 92, 74, 55, 37, 18 + }; + // XXX: can DSP be switched to ADSR mode directly from GAIN/INCREASE/ + // DECREASE mode? And if so, what stage of the sequence does it start + // at? + if (S9xSetSoundMode (channel, MODE_ADSR)) + { + // Hack for ROMs that use a very short attack rate, key on a + // channel, then switch to decay mode. e.g. Final Fantasy II. + + int attack = AttackRate [adsr1 & 0xf]; + +#ifdef USE_SOUND_DESYNC + if (attack == 1) + attack = 0; +#endif + + S9xSetSoundADSR (channel, attack, + DecayRate [(adsr1 >> 4) & 7], + SustainRate [adsr2 & 0x1f], + (adsr2 >> 5) & 7, 8); + } + } + else + { + // Gain mode + if ((gain & 0x80) == 0) + { + if (S9xSetSoundMode (channel, MODE_GAIN)) + { + S9xSetEnvelopeRate (channel, 0, 0, gain & 0x7f); + S9xSetEnvelopeHeight (channel, gain & 0x7f); + } + } + else + { + static unsigned long IncreaseRate [32] = { + ~0, 4100, 3100, 2600, 2000, 1500, 1300, 1000, + 770, 640, 510, 380, 320, 260, 190, 160, + 130, 96, 80, 64, 48, 40, 32, 24, + 20, 16, 12, 10, 8, 6, 4, 2 + }; + static unsigned long DecreaseRateExp [32] = { + ~0, 38000, 28000, 24000, 19000, 14000, 12000, 9400, + 7100, 5900, 4700, 3500, 2900, 2400, 1800, 1500, + 1200, 880, 740, 590, 440, 370, 290, 220, + 180, 150, 110, 92, 74, 55, 37, 18 + }; + if (gain & 0x40) + { + // Increase mode + if (S9xSetSoundMode (channel, (gain & 0x20) ? +MODE_INCREASE_BENT_LINE : + MODE_INCREASE_LINEAR)) + { + S9xSetEnvelopeRate (channel, IncreaseRate [gain & 0x1f], + 1, 127); + } + } + else + { + uint32 rate = (gain & 0x20) ? DecreaseRateExp [gain & 0x1f] / 2 : + IncreaseRate [gain & 0x1f]; + int mode = (gain & 0x20) ? MODE_DECREASE_EXPONENTIAL + : MODE_DECREASE_LINEAR; + + if (S9xSetSoundMode (channel, mode)) + S9xSetEnvelopeRate (channel, rate, -1, 0); + } + } + } +} + +void S9xSetAPUControl (uint8 byte) +{ + //if (byte & 0x40) + //printf ("*** Special SPC700 timing enabled\n"); + if ((byte & 1) != 0 && !APU.TimerEnabled [0]) + { + APU.Timer [0] = 0; + IAPU.RAM [0xfd] = 0; + if ((APU.TimerTarget [0] = IAPU.RAM [0xfa]) == 0) + APU.TimerTarget [0] = 0x100; + } + if ((byte & 2) != 0 && !APU.TimerEnabled [1]) + { + APU.Timer [1] = 0; + IAPU.RAM [0xfe] = 0; + if ((APU.TimerTarget [1] = IAPU.RAM [0xfb]) == 0) + APU.TimerTarget [1] = 0x100; + } + if ((byte & 4) != 0 && !APU.TimerEnabled [2]) + { + APU.Timer [2] = 0; + IAPU.RAM [0xff] = 0; + if ((APU.TimerTarget [2] = IAPU.RAM [0xfc]) == 0) + APU.TimerTarget [2] = 0x100; + } + APU.TimerEnabled [0] = byte & 1; + APU.TimerEnabled [1] = (byte & 2) >> 1; + APU.TimerEnabled [2] = (byte & 4) >> 2; + + if (byte & 0x10) + IAPU.RAM [0xF4] = IAPU.RAM [0xF5] = 0; + + if (byte & 0x20) + IAPU.RAM [0xF6] = IAPU.RAM [0xF7] = 0; + + if (byte & 0x80) + { + if (!APU.ShowROM) + { + memmove (&IAPU.RAM [0xffc0], APUROM, sizeof (APUROM)); + APU.ShowROM = TRUE; + } + } + else + { + if (APU.ShowROM) + { + APU.ShowROM = FALSE; + memmove (&IAPU.RAM [0xffc0], APU.ExtraRAM, sizeof (APUROM)); + } + } + IAPU.RAM [0xf1] = byte; +} + +void S9xSetAPUTimer (uint16 Address, uint8 byte) +{ + IAPU.RAM [Address] = byte; + + switch (Address) + { + case 0xfa: + if ((APU.TimerTarget [0] = IAPU.RAM [0xfa]) == 0) + APU.TimerTarget [0] = 0x100; + APU.TimerValueWritten [0] = TRUE; + break; + case 0xfb: + if ((APU.TimerTarget [1] = IAPU.RAM [0xfb]) == 0) + APU.TimerTarget [1] = 0x100; + APU.TimerValueWritten [1] = TRUE; + break; + case 0xfc: + if ((APU.TimerTarget [2] = IAPU.RAM [0xfc]) == 0) + APU.TimerTarget [2] = 0x100; + APU.TimerValueWritten [2] = TRUE; + break; + } +} + + +void S9xUpdateAPUTimer (void) +{ + while (CPU.Cycles * 10000L >= IAPU.NextAPUTimerPos) +// if (CPU.Cycles * 10000L >= IAPU.NextAPUTimerPos) + { + IAPU.NextAPUTimerPos += SNES_APUTIMER2_CYCLEx10000; + if (APU.TimerEnabled [2]) + { + APU.Timer [2] ++; + if (APU.Timer [2] >= APU.TimerTarget [2]) + { + APU.Timer [2] = 0; + IAPU.RAM [0xff] = (IAPU.RAM [0xff] + 1) & 0xf; + #ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; + IAPU.APUExecuting = TRUE; + #endif + } + } + if (++IAPU.APUTimerCounter == 8) + { + IAPU.APUTimerCounter = 0; + if (APU.TimerEnabled [0]) + { + APU.Timer [0]++; + if (APU.Timer [0] >= APU.TimerTarget [0]) + { + APU.Timer [0] = 0; + IAPU.RAM [0xfd] = (IAPU.RAM [0xfd] + 1) & 0xf; + #ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; + IAPU.APUExecuting = TRUE; + #endif + } + } + + if (APU.TimerEnabled [1]) + { + APU.Timer [1]++; + if (APU.Timer [1] >= APU.TimerTarget [1]) + { + IAPU.RAM [0xfe] = (IAPU.RAM [0xfe] + 1) & 0xf; + APU.Timer [1] = 0; + #ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; + IAPU.APUExecuting = TRUE; + #endif + } + } + } + } +} + +uint8 S9xGetAPUDSP () +{ + uint8 reg = IAPU.RAM [0xf2] & 0x7f; + uint8 byte = APU.DSP [reg]; + + switch (reg) + { + case APU_KON: + break; + case APU_KOFF: + break; + case APU_OUTX + 0x00: + case APU_OUTX + 0x10: + case APU_OUTX + 0x20: + case APU_OUTX + 0x30: + case APU_OUTX + 0x40: + case APU_OUTX + 0x50: + case APU_OUTX + 0x60: + case APU_OUTX + 0x70: + if (SoundData.channels [reg >> 4].state == SOUND_SILENT) + return (0); + return ((SoundData.channels [reg >> 4].sample >> 8) | + (SoundData.channels [reg >> 4].sample & 0xff)); + + case APU_ENVX + 0x00: + case APU_ENVX + 0x10: + case APU_ENVX + 0x20: + case APU_ENVX + 0x30: + case APU_ENVX + 0x40: + case APU_ENVX + 0x50: + case APU_ENVX + 0x60: + case APU_ENVX + 0x70: + return 0; +// return ((uint8) S9xGetEnvelopeHeight (reg >> 4)); + + case APU_ENDX: + // To fix speech in Magical Drop 2 6/11/00 + // APU.DSP [APU_ENDX] = 0; + break; + default: + break; + } + return (byte); +} + diff --git a/src/c4.cpp b/src/c4.cpp new file mode 100644 index 0000000..765d842 --- /dev/null +++ b/src/c4.cpp @@ -0,0 +1,235 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include "c4.h" +#include "memmap.h" +extern "C" { + +short C4WFXVal; +short C4WFYVal; +short C4WFZVal; +short C4WFX2Val; +short C4WFY2Val; +short C4WFDist; +short C4WFScale; + +static double tanval; +static double c4x, c4y, c4z; +static double c4x2, c4y2, c4z2; + +void C4TransfWireFrame () +{ + c4x = (double) C4WFXVal; + c4y = (double) C4WFYVal; + c4z = (double) C4WFZVal - 0x95; + + // Rotate X + tanval = -(double) C4WFX2Val * 3.14159265 * 2 / 128; + c4y2 = c4y * cos (tanval) - c4z * sin (tanval); + c4z2 = c4y * sin (tanval) + c4z * cos (tanval); + + // Rotate Y + tanval = -(double)C4WFY2Val*3.14159265*2/128; + c4x2 = c4x * cos (tanval) + c4z2 * sin (tanval); + c4z = c4x * - sin (tanval) + c4z2 * cos (tanval); + + // Rotate Z + tanval = -(double) C4WFDist * 3.14159265*2 / 128; + c4x = c4x2 * cos (tanval) - c4y2 * sin (tanval); + c4y = c4x2 * sin (tanval) + c4y2 * cos (tanval); + + // Scale + C4WFXVal = (short) (c4x*(double)C4WFScale/(0x90*(c4z+0x95))*0x95); + C4WFYVal = (short) (c4y*(double)C4WFScale/(0x90*(c4z+0x95))*0x95); +} + +void C4TransfWireFrame2 () +{ + c4x = (double)C4WFXVal; + c4y = (double)C4WFYVal; + c4z = (double)C4WFZVal; + + // Rotate X + tanval = -(double) C4WFX2Val * 3.14159265 * 2 / 128; + c4y2 = c4y * cos (tanval) - c4z * sin (tanval); + c4z2 = c4y * sin (tanval) + c4z * cos (tanval); + + // Rotate Y + tanval = -(double) C4WFY2Val * 3.14159265 * 2 / 128; + c4x2 = c4x * cos (tanval) + c4z2 * sin (tanval); + c4z = c4x * -sin (tanval) + c4z2 * cos (tanval); + + // Rotate Z + tanval = -(double)C4WFDist * 3.14159265 * 2 / 128; + c4x = c4x2 * cos (tanval) - c4y2 * sin (tanval); + c4y = c4x2 * sin (tanval) + c4y2 * cos (tanval); + + // Scale + C4WFXVal =(short)(c4x * (double)C4WFScale / 0x100); + C4WFYVal =(short)(c4y * (double)C4WFScale / 0x100); +} + +void C4CalcWireFrame () +{ + C4WFXVal = C4WFX2Val - C4WFXVal; + C4WFYVal = C4WFY2Val - C4WFYVal; + if (abs (C4WFXVal) > abs (C4WFYVal)) + { + C4WFDist = abs (C4WFXVal) + 1; + C4WFYVal = (short) (256 * (double) C4WFYVal / abs (C4WFXVal)); + if (C4WFXVal < 0) + C4WFXVal = -256; + else + C4WFXVal = 256; + } + else + { + if (C4WFYVal != 0) + { + C4WFDist = abs(C4WFYVal)+1; + C4WFXVal = (short) (256 * (double)C4WFXVal / abs (C4WFYVal)); + if (C4WFYVal < 0) + C4WFYVal = -256; + else + C4WFYVal = 256; + } + else + C4WFDist = 0; + } +} + +short C41FXVal; +short C41FYVal; +short C41FAngleRes; +short C41FDist; +short C41FDistVal; + +void C4Op1F () +{ + if (C41FXVal == 0) + { + if (C41FYVal > 0) + C41FAngleRes = 0x80; + else + C41FAngleRes = 0x180; + } + else + { + tanval = (double) C41FYVal / C41FXVal; + C41FAngleRes = (short) (atan (tanval) / (3.141592675 * 2) * 512); + C41FAngleRes = C41FAngleRes; + if (C41FXVal< 0) + C41FAngleRes += 0x100; + C41FAngleRes &= 0x1FF; + } +} + +void C4Op15() +{ + tanval = sqrt ((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal); + C41FDist = (short) tanval; +} + +void C4Op0D() +{ + tanval = sqrt ((double) C41FYVal * C41FYVal + (double) C41FXVal * C41FXVal); + tanval = C41FDistVal / tanval; + C41FYVal = (short) (C41FYVal * tanval * 0.99); + C41FXVal = (short) (C41FXVal * tanval * 0.98); +} + +void C4LoaDMem(char *C4RAM) +{ + memmove(C4RAM+(READ_WORD(C4RAM+0x1f45)&0x1fff), + S9xGetMemPointer(READ_3WORD(C4RAM+0x1f40)), + READ_WORD(C4RAM+0x1f43)); +} +}//end extern C + diff --git a/src/c4emu.cpp b/src/c4emu.cpp new file mode 100644 index 0000000..fcfbbd6 --- /dev/null +++ b/src/c4emu.cpp @@ -0,0 +1,889 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifdef HAVE_CONFIG_H + #include +#endif +#include +#include "snes9x.h" +#include "sar.h" +#include "memmap.h" +#include "ppu.h" +#include "c4.h" + +void S9xInitC4 () +{ + // Stupid zsnes code, we can't do the logical thing without breaking + // savestates +// CMemory_C4RAM = &CMemory_FillRAM [0x6000]; + memset(CMemory_C4RAM, 0, 0x2000); +} + +uint8 S9xGetC4 (uint16 Address) +{ + return (CMemory_C4RAM [Address-0x6000]); +} + +static uint8 C4TestPattern [12 * 4] = +{ + 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, + 0x80, 0xff, 0xff, 0x7f, + 0x00, 0x80, 0x00, 0xff, + 0x7f, 0x00, 0xff, 0x7f, + 0xff, 0x7f, 0xff, 0xff, + 0x00, 0x00, 0x01, 0xff, + 0xff, 0xfe, 0x00, 0x01, + 0x00, 0xff, 0xfe, 0x00 +}; + + +static void C4ConvOAM(void){ + uint8 *OAMptr=CMemory_C4RAM+(CMemory_C4RAM[0x626]<<2); + for(uint8 *i=CMemory_C4RAM+0x1fd; i>OAMptr; i-=4){ + // Clear OAM-to-be + *i=0xe0; + } + + uint16 globalX, globalY; + uint8 *OAMptr2; + int16 SprX, SprY; + uint8 SprName, SprAttr; + uint8 SprCount; + + globalX=READ_WORD(CMemory_C4RAM+0x0621); + globalY=READ_WORD(CMemory_C4RAM+0x0623); + OAMptr2=CMemory_C4RAM+0x200+(CMemory_C4RAM[0x626]>>2); + + if(CMemory_C4RAM[0x0620]!=0){ + SprCount=128-CMemory_C4RAM[0x626]; + uint8 offset=(CMemory_C4RAM[0x626]&3)<<1; + for(int prio=0x30; prio>=0; prio-=0x10){ + uint8 *srcptr=CMemory_C4RAM+0x220; + for(int i=CMemory_C4RAM[0x0620]; i>0 && SprCount>0; i--, srcptr+=16){ + if((srcptr[4]&0x30)!=prio) continue; + SprX=READ_WORD(srcptr)-globalX; + SprY=READ_WORD(srcptr+2)-globalY; + SprName=srcptr[5]; + SprAttr=srcptr[4] | srcptr[0x06]; // XXX: mask bits? + + uint8 *sprptr=S9xGetMemPointer(READ_3WORD(srcptr+7)); + if(*sprptr!=0){ + int16 X, Y; + for(int SprCnt=*sprptr++; SprCnt>0 && SprCount>0; SprCnt--, sprptr+=4){ + X=(int8)sprptr[1]; + if(SprAttr&0x40){ // flip X + X=-X-((sprptr[0]&0x20)?16:8); + } + X+=SprX; + if(X>=-16 && X<=272){ + Y=(int8)sprptr[2]; + if(SprAttr&0x80){ + Y=-Y-((sprptr[0]&0x20)?16:8); + } + Y+=SprY; + if(Y>=-16 && Y<=224){ + OAMptr[0]=X&0xff; + OAMptr[1]=(uint8)Y; + OAMptr[2]=SprName+sprptr[3]; + OAMptr[3]=SprAttr^(sprptr[0]&0xc0); // XXX: Carry from SprName addition? + *OAMptr2 &= ~(3<0){ + OAMptr[0]=(uint8)SprX; + OAMptr[1]=(uint8)SprY; + OAMptr[2]=SprName; + OAMptr[3]=SprAttr; + *OAMptr2 &= ~(3<>2))*(h>>1)); + + int32 Cx=(int16)READ_WORD(CMemory_C4RAM+0x1f83); + int32 Cy=(int16)READ_WORD(CMemory_C4RAM+0x1f86); + + // Calculate start position (i.e. (Ox, Oy) = (0, 0)) + // The low 12 bits are fractional, so (Cx<<12) gives us the Cx we want in + // the function. We do Cx*A etc normally because the matrix parameters + // already have the fractional parts. + int32 LineX=(Cx<<12) - Cx*A - Cx*B; + int32 LineY=(Cy<<12) - Cy*C - Cy*D; + + // Start loop + uint32 X, Y; + uint8 byte; + int outidx=0; + uint8 bit=0x80; + for(int y=0; y>12)>=w || (Y>>12)>=h){ + byte=0; + } else { + uint32 addr=(Y>>12)*w+(X>>12); + byte=CMemory_C4RAM[0x600+(addr>>1)]; + if(addr&1) byte>>=4; + } + + // De-bitplanify + if(byte&1) CMemory_C4RAM[outidx]|=bit; + if(byte&2) CMemory_C4RAM[outidx+1]|=bit; + if(byte&4) CMemory_C4RAM[outidx+16]|=bit; + if(byte&8) CMemory_C4RAM[outidx+17]|=bit; + + bit>>=1; + if(bit==0){ + bit=0x80; + outidx+=32; + } + + X+=A; // Add 1 to output x => add an A and a C + Y+=C; + } + outidx+=2+row_padding; + if(outidx&0x10){ + outidx&=~0x10; + } else { + outidx-=(w<<2)+row_padding; + } + LineX+=B; // Add 1 to output y => add a B and a D + LineY+=D; + } +} + +static void C4DrawLine(int32 X1, int32 Y1, int16 Z1, + int32 X2, int32 Y2, int16 Z2, uint8 Color){ + // Transform coordinates + C4WFXVal=(short)X1; + C4WFYVal=(short)Y1; + C4WFZVal=Z1; + C4WFScale=CMemory_C4RAM[0x1f90]; + C4WFX2Val=CMemory_C4RAM[0x1f86]; + C4WFY2Val=CMemory_C4RAM[0x1f87]; + C4WFDist=CMemory_C4RAM[0x1f88]; + C4TransfWireFrame2(); + X1=(C4WFXVal+48)<<8; + Y1=(C4WFYVal+48)<<8; + + C4WFXVal=(short)X2; + C4WFYVal=(short)Y2; + C4WFZVal=Z2; + C4TransfWireFrame2(); + X2=(C4WFXVal+48)<<8; + Y2=(C4WFYVal+48)<<8; + + // get line info + C4WFXVal=(short)(X1>>8); + C4WFYVal=(short)(Y1>>8); + C4WFX2Val=(short)(X2>>8); + C4WFY2Val=(short)(Y2>>8); + C4CalcWireFrame(); + X2=(int16)C4WFXVal; + Y2=(int16)C4WFYVal; + + // render line + for(int i=C4WFDist?C4WFDist:1; i>0; i--) + { //.loop + if(X1>0xff && Y1>0xff && X1<0x6000 && Y1<0x6000) + { + uint16 addr=((X1&~0x7ff) + (Y1&~0x7ff)*12 + (Y1&0x700))>>7; + addr=(((Y1>>8)>>3)<<8)-(((Y1>>8)>>3)<<6)+(((X1>>8)>>3)<<4)+((Y1>>8)&7)<<1; + uint8 bit=0x80>>((X1>>8)&7); + CMemory_C4RAM[addr+0x300]&=~bit; + CMemory_C4RAM[addr+0x301]&=~bit; + if(Color&1) CMemory_C4RAM[addr+0x300]|=bit; + if(Color&2) CMemory_C4RAM[addr+0x301]|=bit; + } + X1+=X2; + Y1+=Y2; + } +} + +static void C4DrawWireFrame(void) +{ + uint8 *line=S9xGetMemPointer(READ_3WORD(CMemory_C4RAM+0x1f80)); + uint8 *point1, *point2; + int16 X1, Y1, Z1; + int16 X2, Y2, Z2; + uint8 Color; + + for(int i=CMemory_C4RAM[0x0295]; i>0; i--, line+=5){ + if(line[0]==0xff && line[1]==0xff){ + uint8 *tmp=line-5; + while(line[2]==0xff && line[3]==0xff) tmp-=5; + point1=S9xGetMemPointer((CMemory_C4RAM[0x1f82]<<16) | (tmp[2]<<8) | tmp[3]); + } else { + point1=S9xGetMemPointer((CMemory_C4RAM[0x1f82]<<16) | (line[0]<<8) | line[1]); + } + point2=S9xGetMemPointer((CMemory_C4RAM[0x1f82]<<16) | (line[2]<<8) | line[3]); + + X1=(point1[0]<<8) | point1[1]; + Y1=(point1[2]<<8) | point1[3]; + Z1=(point1[4]<<8) | point1[5]; + X2=(point2[0]<<8) | point2[1]; + Y2=(point2[2]<<8) | point2[3]; + Z2=(point2[4]<<8) | point2[5]; + Color=line[4]; + C4DrawLine(X1, Y1, Z1, X2, Y2, Z2, Color); + } +} + +static void C4TransformLines(void){ + C4WFX2Val=CMemory_C4RAM[0x1f83]; + C4WFY2Val=CMemory_C4RAM[0x1f86]; + C4WFDist=CMemory_C4RAM[0x1f89]; + C4WFScale=CMemory_C4RAM[0x1f8c]; + + // transform vertices + uint8 *ptr=CMemory_C4RAM; + { + for(int i=READ_WORD(CMemory_C4RAM+0x1f80); i>0; i--, ptr+=0x10) + { + C4WFXVal=READ_WORD(ptr+1); + C4WFYVal=READ_WORD(ptr+5); + C4WFZVal=READ_WORD(ptr+9); + C4TransfWireFrame(); + + // displace + WRITE_WORD(ptr+1, C4WFXVal+0x80); + WRITE_WORD(ptr+5, C4WFYVal+0x50); + } + } + WRITE_WORD(CMemory_C4RAM+0x600, 23); + WRITE_WORD(CMemory_C4RAM+0x602, 0x60); + WRITE_WORD(CMemory_C4RAM+0x605, 0x40); + WRITE_WORD(CMemory_C4RAM+0x600+8, 23); + WRITE_WORD(CMemory_C4RAM+0x602+8, 0x60); + WRITE_WORD(CMemory_C4RAM+0x605+8, 0x40); + + ptr=CMemory_C4RAM+0xb02; + uint8 *ptr2=CMemory_C4RAM; + { + for(int i=READ_WORD(CMemory_C4RAM+0xb00); i>0; i--, ptr+=2, ptr2+=8) + { + C4WFXVal=READ_WORD(CMemory_C4RAM+(ptr[0]<<4)+1); + C4WFYVal=READ_WORD(CMemory_C4RAM+(ptr[0]<<4)+5); + C4WFX2Val=READ_WORD(CMemory_C4RAM+(ptr[1]<<4)+1); + C4WFY2Val=READ_WORD(CMemory_C4RAM+(ptr[1]<<4)+5); + C4CalcWireFrame(); + WRITE_WORD(ptr2+0x600, C4WFDist?C4WFDist:1); + WRITE_WORD(ptr2+0x602, C4WFXVal); + WRITE_WORD(ptr2+0x605, C4WFYVal); + } + } +} +static void C4BitPlaneWave(){ + static uint16 bmpdata[]={ + 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E, + 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020A, 0x020C, 0x020E, + 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040A, 0x040C, 0x040E, + 0x0600, 0x0602, 0x0604, 0x0606, 0x0608, 0x060A, 0x060C, 0x060E, + 0x0800, 0x0802, 0x0804, 0x0806, 0x0808, 0x080A, 0x080C, 0x080E + }; + + uint8 *dst=CMemory_C4RAM; + uint32 waveptr=CMemory_C4RAM[0x1f83]; + uint16 mask1=0xc0c0; + uint16 mask2=0x3f3f; + + for(int j=0; j<0x10; j++){ + do { + int16 height=-((int8)CMemory_C4RAM[waveptr+0xb00])-16; + for(int i=0; i<40; i++){ + uint16 tmp=READ_WORD(dst+bmpdata[i]) & mask2; + if(height>=0){ + if(height<8){ + tmp|=mask1&READ_WORD(CMemory_C4RAM+0xa00+(height<<1)); + } else { + tmp|=mask1&0xff00; + } + } + WRITE_WORD(dst+bmpdata[i], tmp); + height++; + } + waveptr=(waveptr+1)&0x7f; + mask1=(mask1>>2)|(mask1<<6); + mask2=(mask2>>2)|(mask2<<6); + } while(mask1!=0xc0c0); + dst+=16; + + do { + int16 height=-((int8)CMemory_C4RAM[waveptr+0xb00])-16; + for(int i=0; i<40; i++){ + uint16 tmp=READ_WORD(dst+bmpdata[i]) & mask2; + if(height>=0){ + if(height<8){ + tmp|=mask1&READ_WORD(CMemory_C4RAM+0xa10+(height<<1)); + } else { + tmp|=mask1&0xff00; + } + } + WRITE_WORD(dst+bmpdata[i], tmp); + height++; + } + waveptr=(waveptr+1)&0x7f; + mask1=(mask1>>2)|(mask1<<6); + mask2=(mask2>>2)|(mask2<<6); + } while(mask1!=0xc0c0); + dst+=16; + } +} + +static void C4SprDisintegrate() +{ + uint8 width, height; + uint32 StartX, StartY; + uint8 *src; + int32 scaleX, scaleY; + int32 Cx, Cy; + + width=CMemory_C4RAM[0x1f89]; + height=CMemory_C4RAM[0x1f8c]; + Cx=(int16)READ_WORD(CMemory_C4RAM+0x1f80); + Cy=(int16)READ_WORD(CMemory_C4RAM+0x1f83); + + scaleX=(int16)READ_WORD(CMemory_C4RAM+0x1f86); + scaleY=(int16)READ_WORD(CMemory_C4RAM+0x1f8f); + StartX=-Cx*scaleX+(Cx<<8); + StartY=-Cy*scaleY+(Cy<<8); + src=CMemory_C4RAM+0x600; + + memset(CMemory_C4RAM, 0, width*(height>>1)); + + for(uint32 y=StartY, i=0; i>8)>8)>8)*width+(x>>8)<0x2000) + { + uint8 pixel=(j&1)?(*src>>4):*src; + int idx=(y>>11)*(width<<2)+(x>>11)*32+((y>>8)&7)<<1; + uint8 mask=0x80>>((x>>8)&7); + if(pixel&1) CMemory_C4RAM[idx]|=mask; + if(pixel&2) CMemory_C4RAM[idx+1]|=mask; + if(pixel&4) CMemory_C4RAM[idx+16]|=mask; + if(pixel&8) CMemory_C4RAM[idx+17]|=mask; + } + if(j&1) src++; + } + } +} + +static void S9xC4ProcessSprites() +{ + switch(CMemory_C4RAM[0x1f4d]) + { + case 0x00: // Build OAM + C4ConvOAM(); + break; + + case 0x03: // Scale/Rotate + C4DoScaleRotate(0); + break; + + case 0x05: // Transform Lines + C4TransformLines(); + break; + + case 0x07: // Scale/Rotate + C4DoScaleRotate(64); + break; + + case 0x08: // Draw wireframe + C4DrawWireFrame(); + break; + + case 0x0b: // Disintegrate + C4SprDisintegrate(); + break; + + case 0x0c: // Wave + C4BitPlaneWave(); + break; + + default: + break; + } +} + +void S9xSetC4 (uint8 byte, uint16 Address) +{ + int i; + + CMemory_C4RAM [Address-0x6000] = byte; + if (Address == 0x7f4f) + { + if(CMemory_C4RAM[0x1f4d]==0x0e && byte<0x40 && (byte&3)==0) + { + CMemory_C4RAM[0x1f80]=byte>>2; + } + else + { + switch (byte) + { + case 0x00: // Sprite + S9xC4ProcessSprites(); + break; + + case 0x01: // Draw wireframe + memset(CMemory_C4RAM+0x300, 0, 16*12*3*4); + C4DrawWireFrame(); + break; + + case 0x05: // Propulsion (?) + { + int32 tmp=0x10000; + if(READ_WORD(CMemory_C4RAM+0x1f83)){ + tmp=SAR((tmp/READ_WORD(CMemory_C4RAM+0x1f83))*READ_WORD(CMemory_C4RAM+0x1f81), 8); + } + WRITE_WORD(CMemory_C4RAM+0x1f80, (uint16)tmp); + } + break; + + case 0x0d: // Set vector length + C41FXVal=READ_WORD(CMemory_C4RAM+0x1f80); + C41FYVal=READ_WORD(CMemory_C4RAM+0x1f83); + C41FDistVal=READ_WORD(CMemory_C4RAM+0x1f86); + C4Op0D(); + WRITE_WORD(CMemory_C4RAM+0x1f89, C41FXVal); + WRITE_WORD(CMemory_C4RAM+0x1f8c, C41FYVal); + break; + + case 0x10: // Polar to rectangluar + { + int32 tmp=SAR((int32)READ_WORD(CMemory_C4RAM+0x1f83)*C4CosTable[READ_WORD(CMemory_C4RAM+0x1f80)&0x1ff]<<1, 16); + WRITE_3WORD(CMemory_C4RAM+0x1f86, tmp); + tmp=SAR((int32)READ_WORD(CMemory_C4RAM+0x1f83)*C4SinTable[READ_WORD(CMemory_C4RAM+0x1f80)&0x1ff]<<1, 16); + WRITE_3WORD(CMemory_C4RAM+0x1f89, (tmp-SAR(tmp, 6))); + } + break; + + case 0x13: // Polar to rectangluar + { + int32 tmp=SAR((int32)READ_WORD(CMemory_C4RAM+0x1f83)*C4CosTable[READ_WORD(CMemory_C4RAM+0x1f80)&0x1ff]<<1, 8); + WRITE_3WORD(CMemory_C4RAM+0x1f86, tmp); + tmp=SAR((int32)READ_WORD(CMemory_C4RAM+0x1f83)*C4SinTable[READ_WORD(CMemory_C4RAM+0x1f80)&0x1ff]<<1, 8); + WRITE_3WORD(CMemory_C4RAM+0x1f89, tmp); + } + break; + + case 0x15: // Pythagorean + C41FXVal=READ_WORD(CMemory_C4RAM+0x1f80); + C41FYVal=READ_WORD(CMemory_C4RAM+0x1f83); + C41FDist=(int16)sqrt((double)C41FXVal*C41FXVal + (double)C41FYVal*C41FYVal); + WRITE_WORD(CMemory_C4RAM+0x1f80, C41FDist); + break; + + case 0x1f: // atan + C41FXVal=READ_WORD(CMemory_C4RAM+0x1f80); + C41FYVal=READ_WORD(CMemory_C4RAM+0x1f83); + C4Op1F(); + WRITE_WORD(CMemory_C4RAM+0x1f86, C41FAngleRes); + break; + + case 0x22: // Trapezoid + { + int16 angle1=READ_WORD(CMemory_C4RAM+0x1f8c)&0x1ff; + int16 angle2=READ_WORD(CMemory_C4RAM+0x1f8f)&0x1ff; + int32 tan1=(C4CosTable[angle1]!=0)?((((int32)C4SinTable[angle1])<<16)/C4CosTable[angle1]):0x80000000; + int32 tan2=(C4CosTable[angle2]!=0)?((((int32)C4SinTable[angle2])<<16)/C4CosTable[angle2]):0x80000000; + int16 y = READ_WORD(CMemory_C4RAM+0x1f83) - READ_WORD(CMemory_C4RAM+0x1f89); + int16 left, right; + for(int j=0; j<225; j++) + { + if(y>=0) + { + left = SAR((int32)tan1*y, 16) - + READ_WORD(CMemory_C4RAM+0x1f80) + + READ_WORD(CMemory_C4RAM+0x1f86); + right = SAR((int32)tan2*y, 16) - + READ_WORD(CMemory_C4RAM+0x1f80) + + READ_WORD(CMemory_C4RAM+0x1f86) + + READ_WORD(CMemory_C4RAM+0x1f93); + + if(left<0 && right<0){ + left=1; + right=0; + } else if(left<0){ + left=0; + } else if(right<0){ + right=0; + } + if(left>255 && right>255){ + left=255; + right=254; + } else if(left>255){ + left=255; + } else if(right>255){ + right=255; + } + } + else + { + left=1; + right=0; + } + CMemory_C4RAM[j+0x800] = (uint8)left; + CMemory_C4RAM[j+0x900] = (uint8)right; + y++; + } + } + break; + + case 0x25: // Multiply + { + int32 foo=READ_3WORD(CMemory_C4RAM+0x1f80); + int32 bar=READ_3WORD(CMemory_C4RAM+0x1f83); + foo*=bar; + WRITE_3WORD(CMemory_C4RAM+0x1f80, foo); + } + break; + + case 0x2d: // Transform Coords + C4WFXVal=READ_WORD(CMemory_C4RAM+0x1f81); + C4WFYVal=READ_WORD(CMemory_C4RAM+0x1f84); + C4WFZVal=READ_WORD(CMemory_C4RAM+0x1f87); + C4WFX2Val=CMemory_C4RAM[0x1f89]; + C4WFY2Val=CMemory_C4RAM[0x1f8a]; + C4WFDist=CMemory_C4RAM[0x1f8b]; + C4WFScale=READ_WORD(CMemory_C4RAM+0x1f90); + C4TransfWireFrame2(); + WRITE_WORD(CMemory_C4RAM+0x1f80, C4WFXVal); + WRITE_WORD(CMemory_C4RAM+0x1f83, C4WFYVal); + break; + + case 0x40: // Sum + { + uint16 sum=0; + for(int i=0; i<0x800; sum+=CMemory_C4RAM[i++]); + WRITE_WORD(CMemory_C4RAM+0x1f80, sum); + } + break; + + case 0x54: // Square + { + int64 a=SAR((int64)READ_3WORD(CMemory_C4RAM+0x1f80)<<40, 40); + // printf("%08X%08X\n", (uint32)(a>>32), (uint32)(a&0xFFFFFFFF)); + a*=a; + // printf("%08X%08X\n", (uint32)(a>>32), (uint32)(a&0xFFFFFFFF)); + WRITE_3WORD(CMemory_C4RAM+0x1f83, a); + WRITE_3WORD(CMemory_C4RAM+0x1f86, (a>>24)); + } + break; + + case 0x5c: // Immediate Reg + for (i = 0; i < 12 * 4; i++) + CMemory_C4RAM [i] = C4TestPattern [i]; + break; + + case 0x89: // Immediate ROM + CMemory_C4RAM [0x1f80] = 0x36; + CMemory_C4RAM [0x1f81] = 0x43; + CMemory_C4RAM [0x1f82] = 0x05; + break; + + default: + break; + } + } + } else if (Address == 0x7f47) { + memmove(CMemory_C4RAM+(READ_WORD(CMemory_C4RAM+0x1f45)&0x1fff), + S9xGetMemPointer(READ_3WORD(CMemory_C4RAM+0x1f40)), + READ_WORD(CMemory_C4RAM+0x1f43)); + } +} + +int16 C4SinTable[512] = { + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402 +}; + +int16 C4CosTable[512] = { + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402, + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765 +}; + diff --git a/src/cheats.cpp b/src/cheats.cpp new file mode 100644 index 0000000..de0675d --- /dev/null +++ b/src/cheats.cpp @@ -0,0 +1,441 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include +#include "snes9x.h" +#include "cheats.h" +#include "memmap.h" + +static bool8 S9xAllHex (const char *code, int len) +{ + for (int i = 0; i < len; i++) + if ((code [i] < '0' || code [i] > '9') && + (code [i] < 'a' || code [i] > 'f') && + (code [i] < 'A' || code [i] > 'F')) + return (FALSE); + + return (TRUE); +} + +const char *S9xProActionReplayToRaw (const char *code, uint32 *address, uint8 *byte) +{ + uint32 data = 0; + if (strlen (code) != 8 || !S9xAllHex (code, 8) || + sscanf (code, "%x", &data) != 1) + return ("Invalid Pro Action Replay code - should be 8 hex digits in length."); + + *address = data >> 8; + *byte = (uint8) data; + return (NULL); +} + +const char *S9xGoldFingerToRaw (const char *code, uint32 *address, bool8 *sram, + uint8 *num_bytes, uint8 *bytes) +{ + char tmp [15]; + if (strlen (code) != 14) + return ("Invalid Gold Finger code should be 14 hex digits in length."); + + strncpy (tmp, code, 5); + tmp [5] = 0; + if (sscanf (tmp, "%x", address) != 1) + return ("Invalid Gold Finger code."); + + int i; + for (i = 0; i < 3; i++) + { + strncpy (tmp, code + 5 + i * 2, 2); + tmp [2] = 0; + int byte; + if (sscanf (tmp, "%x", &byte) != 1) + break; + bytes [i] = (uint8) byte; + } + *num_bytes = i; + *sram = code [13] == '1'; + return (NULL); +} + +const char *S9xGameGenieToRaw (const char *code, uint32 *_address, uint8 *byte) +{ + char new_code [12]; + + if (strlen (code) != 9 || *(code + 4) != '-' || !S9xAllHex (code, 4) || + !S9xAllHex (code + 5, 4)) + return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'."); + + strcpy (new_code, "0x"); + strncpy (new_code + 2, code, 4); + strcpy (new_code + 6, code + 5); + + static char *real_hex = "0123456789ABCDEF"; + static char *genie_hex = "DF4709156BC8A23E"; + + for (int i = 2; i < 10; i++) + { + if (islower (new_code [i])) + new_code [i] = toupper (new_code [i]); + int j; + for (j = 0; j < 16; j++) + { + if (new_code [i] == genie_hex [j]) + { + new_code [i] = real_hex [j]; + break; + } + } + if (j == 16) + return ("Invalid hex-character in Game Genie(tm) code"); + } + uint32 data = 0; + sscanf (new_code, "%x", &data); + *byte = (uint8)(data >> 24); + uint32 address = data & 0xffffff; + address = ((address & 0x003c00) << 10) + + ((address & 0x00003c) << 14) + + ((address & 0xf00000) >> 8) + + ((address & 0x000003) << 10) + + ((address & 0x00c000) >> 6) + + ((address & 0x0f0000) >> 12) + + ((address & 0x0003c0) >> 6); + + *_address=address; + return (NULL); +} + +void S9xStartCheatSearch (SCheatData *d) +{ + memmove (d->CWRAM, d->RAM, 0x20000); + memmove (d->CSRAM, d->SRAM, 0x10000); + memmove (d->CIRAM, &d->FillRAM [0x3000], 0x2000); + memset ((char *) d->WRAM_BITS, 0xff, 0x20000 >> 3); + memset ((char *) d->SRAM_BITS, 0xff, 0x10000 >> 3); + memset ((char *) d->IRAM_BITS, 0xff, 0x2000 >> 3); +} + +#define BIT_CLEAR(a,v) \ +(a)[(v) >> 5] &= ~(1 << ((v) & 31)) + +#define BIT_SET(a,v) \ +(a)[(v) >> 5] |= 1 << ((v) & 31) + +#define TEST_BIT(a,v) \ +((a)[(v) >> 5] & (1 << ((v) & 31))) + +#define _CC_(c,a,b) \ +((c) == S9X_LESS_THAN ? (a) < (b) : \ + (c) == S9X_GREATER_THAN ? (a) > (b) : \ + (c) == S9X_LESS_THAN_OR_EQUAL ? (a) <= (b) : \ + (c) == S9X_GREATER_THAN_OR_EQUAL ? (a) >= (b) : \ + (c) == S9X_EQUAL ? (a) == (b) : \ + (a) != (b)) + +#define _D(s,m,o) \ +((s) == S9X_8_BITS ? (uint8) (*((m) + (o))) : \ + (s) == S9X_16_BITS ? ((uint16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \ + (s) == S9X_24_BITS ? ((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16))) : \ +((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24)))) + +#define _DS(s,m,o) \ +((s) == S9X_8_BITS ? ((int8) *((m) + (o))) : \ + (s) == S9X_16_BITS ? ((int16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \ + (s) == S9X_24_BITS ? (((int32) ((*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16)) << 8)) >> 8): \ + ((int32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24)))) + +void S9xSearchForChange (SCheatData *d, S9xCheatComparisonType cmp, + S9xCheatDataSize size, bool8 is_signed, bool8 update) +{ + int l; + + switch (size) + { + case S9X_8_BITS: l = 0; break; + case S9X_16_BITS: l = 1; break; + case S9X_24_BITS: l = 2; break; + default: + case S9X_32_BITS: l = 3; break; + } + + int i; + if (is_signed) + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT (d->WRAM_BITS, i) && + _CC_(cmp, _DS(size, d->RAM, i), _DS(size, d->CWRAM, i))) + { + if (update) + d->CWRAM [i] = d->RAM [i]; + } + else + BIT_CLEAR (d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT (d->SRAM_BITS, i) && + _CC_(cmp, _DS(size, d->SRAM, i), _DS(size, d->CSRAM, i))) + { + if (update) + d->CSRAM [i] = d->SRAM [i]; + } + else + BIT_CLEAR (d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT (d->IRAM_BITS, i) && + _CC_(cmp, _DS(size, d->FillRAM + 0x3000, i), _DS(size, d->CIRAM, i))) + { + if (update) + d->CIRAM [i] = d->FillRAM [i + 0x3000]; + } + else + BIT_CLEAR (d->IRAM_BITS, i); + } + } + else + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT (d->WRAM_BITS, i) && + _CC_(cmp, _D(size, d->RAM, i), _D(size, d->CWRAM, i))) + { + if (update) + d->CWRAM [i] = d->RAM [i]; + } + else + BIT_CLEAR (d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT (d->SRAM_BITS, i) && + _CC_(cmp, _D(size, d->SRAM, i), _D(size, d->CSRAM, i))) + { + if (update) + d->CSRAM [i] = d->SRAM [i]; + } + else + BIT_CLEAR (d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT (d->IRAM_BITS, i) && + _CC_(cmp, _D(size, d->FillRAM + 0x3000, i), _D(size, d->CIRAM, i))) + { + if (update) + d->CIRAM [i] = d->FillRAM [i + 0x3000]; + } + else + BIT_CLEAR (d->IRAM_BITS, i); + } + } +} + +void S9xSearchForValue (SCheatData *d, S9xCheatComparisonType cmp, + S9xCheatDataSize size, uint32 value, + bool8 is_signed, bool8 update) +{ + int l; + + switch (size) + { + case S9X_8_BITS: l = 0; break; + case S9X_16_BITS: l = 1; break; + case S9X_24_BITS: l = 2; break; + default: + case S9X_32_BITS: l = 3; break; + } + + int i; + + if (is_signed) + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT (d->WRAM_BITS, i) && + _CC_(cmp, _DS(size, d->RAM, i), (int32) value)) + { + if (update) + d->CWRAM [i] = d->RAM [i]; + } + else + BIT_CLEAR (d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT (d->SRAM_BITS, i) && + _CC_(cmp, _DS(size, d->SRAM, i), (int32) value)) + { + if (update) + d->CSRAM [i] = d->SRAM [i]; + } + else + BIT_CLEAR (d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT (d->IRAM_BITS, i) && + _CC_(cmp, _DS(size, d->FillRAM + 0x3000, i), (int32) value)) + { + if (update) + d->CIRAM [i] = d->FillRAM [i + 0x3000]; + } + else + BIT_CLEAR (d->IRAM_BITS, i); + } + } + else + { + for (i = 0; i < 0x20000 - l; i++) + { + if (TEST_BIT (d->WRAM_BITS, i) && + _CC_(cmp, _D(size, d->RAM, i), value)) + { + if (update) + d->CWRAM [i] = d->RAM [i]; + } + else + BIT_CLEAR (d->WRAM_BITS, i); + } + + for (i = 0; i < 0x10000 - l; i++) + { + if (TEST_BIT (d->SRAM_BITS, i) && + _CC_(cmp, _D(size, d->SRAM, i), value)) + { + if (update) + d->CSRAM [i] = d->SRAM [i]; + } + else + BIT_CLEAR (d->SRAM_BITS, i); + } + + for (i = 0; i < 0x2000 - l; i++) + { + if (TEST_BIT (d->IRAM_BITS, i) && + _CC_(cmp, _D(size, d->FillRAM + 0x3000, i), value)) + { + if (update) + d->CIRAM [i] = d->FillRAM [i + 0x3000]; + } + else + BIT_CLEAR (d->IRAM_BITS, i); + } + } +} + +void S9xOutputCheatSearchResults (SCheatData *d) +{ + int i; + for (i = 0; i < 0x20000; i++) + { + if (TEST_BIT (d->WRAM_BITS, i)) + printf ("WRAM: %05x: %02x\n", i, d->RAM [i]); + } + + for (i = 0; i < 0x10000; i++) + { + if (TEST_BIT (d->SRAM_BITS, i)) + printf ("SRAM: %04x: %02x\n", i, d->SRAM [i]); + } + + for (i = 0; i < 0x2000; i++) + { + if (TEST_BIT (d->IRAM_BITS, i)) + printf ("IRAM: %05x: %02x\n", i, d->FillRAM [i + 0x3000]); + } +} + diff --git a/src/cheats2.cpp b/src/cheats2.cpp new file mode 100644 index 0000000..dc8393a --- /dev/null +++ b/src/cheats2.cpp @@ -0,0 +1,279 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include +#include "snes9x.h" +#include "cheats.h" +#include "memmap.h" + +extern SCheatData Cheat; + +void S9xInitCheatData () +{ + Cheat.RAM = CMemory_RAM; + Cheat.SRAM = CMemory_SRAM; + Cheat.FillRAM = CMemory_FillRAM; +} + +void S9xAddCheat (bool8 enable, bool8 save_current_value, + uint32 address, uint8 byte) +{ + if (Cheat.num_cheats < sizeof (Cheat.c) / sizeof (Cheat. c [0])) + { + Cheat.c [Cheat.num_cheats].address = address; + Cheat.c [Cheat.num_cheats].byte = byte; + Cheat.c [Cheat.num_cheats].enabled = TRUE; + if (save_current_value) + { + Cheat.c [Cheat.num_cheats].saved_byte = S9xGetByte (address); + Cheat.c [Cheat.num_cheats].saved = TRUE; + } + Cheat.num_cheats++; + } +} + +void S9xDeleteCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats) + { + if (Cheat.c [which1].enabled) + S9xRemoveCheat (which1); + + memmove (&Cheat.c [which1], &Cheat.c [which1 + 1], + sizeof (Cheat.c [0]) * (Cheat.num_cheats - which1 - 1)); + Cheat.num_cheats--; //MK: This used to set it to 0?? + } +} + +void S9xDeleteCheats () +{ + S9xRemoveCheats (); + Cheat.num_cheats = 0; +} + +void S9xEnableCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats && !Cheat.c [which1].enabled) + { + Cheat.c [which1].enabled = TRUE; + S9xApplyCheat (which1); + } +} + +void S9xDisableCheat (uint32 which1) +{ + if (which1 < Cheat.num_cheats && Cheat.c [which1].enabled) + { + S9xRemoveCheat (which1); + Cheat.c [which1].enabled = FALSE; + } +} + +void S9xRemoveCheat (uint32 which1) +{ + if (Cheat.c [which1].saved) + { + uint32 address = Cheat.c [which1].address; + + int block = (address >> MEMMAP_SHIFT) & MEMMAP_MASK; + uint8 *ptr = CMemory_Map [block]; + + if (ptr >= (uint8 *) CMemory_MAP_LAST) + *(ptr + (address & 0xffff)) = Cheat.c [which1].saved_byte; + else + S9xSetByte (Cheat.c [which1].saved_byte, address); + } +} + +void S9xApplyCheat (uint32 which1) +{ + uint32 address = Cheat.c [which1].address; + + if (!Cheat.c [which1].saved) + Cheat.c [which1].saved_byte = S9xGetByte (address); + + int block = (address >> MEMMAP_SHIFT) & MEMMAP_MASK; + uint8 *ptr = CMemory_Map [block]; + + if (ptr >= (uint8 *) CMemory_MAP_LAST) + *(ptr + (address & 0xffff)) = Cheat.c [which1].byte; + else + S9xSetByte (Cheat.c [which1].byte, address); + Cheat.c [which1].saved = TRUE; +} + +void S9xApplyCheats () +{ + if (Settings.ApplyCheats) + { + for (uint32 i = 0; i < Cheat.num_cheats; i++) + if (Cheat.c [i].enabled) + S9xApplyCheat (i); + } +} + +void S9xRemoveCheats () +{ + for (uint32 i = 0; i < Cheat.num_cheats; i++) + if (Cheat.c [i].enabled) + S9xRemoveCheat (i); +} + +bool8 S9xLoadCheatFile (const char *filename) +{ + Cheat.num_cheats = 0; + + FILE *fs = fopen (filename, "rb"); + uint8 data [28]; + + if (!fs) + return (FALSE); + + while (fread ((void *) data, 1, 28, fs) == 28) + { + Cheat.c [Cheat.num_cheats].enabled = (data [0] & 4) == 0; + Cheat.c [Cheat.num_cheats].byte = data [1]; + Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16); + Cheat.c [Cheat.num_cheats].saved_byte = data [5]; + Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0; + memmove (Cheat.c [Cheat.num_cheats].name, &data [8], 20); + Cheat.c [Cheat.num_cheats++].name [20] = 0; + } + fclose (fs); + + return (TRUE); +} + +bool8 S9xSaveCheatFile (const char *filename) +{ + if (Cheat.num_cheats == 0) + { + (void) remove (filename); + return (TRUE); + } + + FILE *fs = fopen (filename, "wb"); + uint8 data [28]; + + if (!fs) + return (FALSE); + + uint32 i; + for (i = 0; i < Cheat.num_cheats; i++) + { + memset (data, 0, 28); + if (i == 0) + { + data [6] = 254; + data [7] = 252; + } + if (!Cheat.c [i].enabled) + data [0] |= 4; + + if (Cheat.c [i].saved) + data [0] |= 8; + + data [1] = Cheat.c [i].byte; + data [2] = (uint8) Cheat.c [i].address; + data [3] = (uint8) (Cheat.c [i].address >> 8); + data [4] = (uint8) (Cheat.c [i].address >> 16); + data [5] = Cheat.c [i].saved_byte; + + memmove (&data [8], Cheat.c [i].name, 19); + if (fwrite (data, 28, 1, fs) != 1) + { + fclose (fs); + return (FALSE); + } + } + return (fclose (fs) == 0); +} + + diff --git a/src/clip.cpp b/src/clip.cpp new file mode 100644 index 0000000..fc0ba7d --- /dev/null +++ b/src/clip.cpp @@ -0,0 +1,764 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include + +#include "snes9x.h" +#include "memmap.h" +#include "ppu.h" + +struct Band +{ + uint32 Left; + uint32 Right; +}; + +#undef MIN +#undef MAX +#define MIN(A,B) ((A) < (B) ? (A) : (B)) +#define MAX(A,B) ((A) > (B) ? (A) : (B)) +#define BAND_EMPTY(B) (B.Left >= B.Right) +#define BANDS_INTERSECT(A,B) ((A.Left >= B.Left && A.Left < B.Right) || \ + (B.Left >= A.Left && B.Left < A.Right)) +#define OR_BANDS(R,A,B) {\ + R.Left = MIN(A.Left, B.Left); \ + R.Right = MAX(A.Right, B.Right);} + +#define AND_BANDS(R,A,B) {\ + R.Left = MAX(A.Left, B.Left); \ + R.Right = MIN(A.Right, B.Right);} + +static int IntCompare (const void *d1, const void *d2) +{ + if (*(uint32 *) d1 > *(uint32 *) d2) + return (1); + else + if (*(uint32 *) d1 < *(uint32 *) d2) + return (-1); + return (0); +} + +static int BandCompare (const void *d1, const void *d2) +{ + if (((struct Band *) d1)->Left > ((struct Band *) d2)->Left) + return (1); + else + if (((struct Band *) d1)->Left < ((struct Band *) d2)->Left) + return (-1); + return (0); +} + +void ComputeClipWindows () +{ + struct ClipData *pClip = &IPPU.Clip [0]; + + // Loop around the main screen then the sub-screen. + for (int c = 0; c < 2; c++, pClip++) + { + // Loop around the colour window then a clip window for each of the + // background layers. + for (int w = 5; w >= 0; w--) + { + pClip->Count[w] = 0; + + if (w == 5) // The colour window... + { + if (c == 0) // ... on the main screen + { + if ((CMemory_FillRAM [0x2130] & 0xc0) == 0xc0) + { + // The whole of the main screen is switched off, + // completely clip everything. + for (int i = 0; i < 6; i++) + { + IPPU.Clip [c].Count [i] = 1; + IPPU.Clip [c].Left [0][i] = 1; + IPPU.Clip [c].Right [0][i] = 0; + } + continue; + } + else + if ((CMemory_FillRAM [0x2130] & 0xc0) == 0x00) + continue; + } + else + { + // .. colour window on the sub-screen. + if ((CMemory_FillRAM [0x2130] & 0x30) == 0x30) + { + // The sub-screen is switched off, completely + // clip everything. + for (int i = 0; i < 6; i++) + { + IPPU.Clip [1].Count [i] = 1; + IPPU.Clip [1].Left [0][i] = 1; + IPPU.Clip [1].Right [0][i] = 0; + } + return; + } + else + if ((CMemory_FillRAM [0x2130] & 0x30) == 0x00) + continue; + } + } +#ifdef ENABLE_GRAPHIC_WINDOWS + if (w == 5 || pClip->Count [5] || + (CMemory_FillRAM [0x212c + c] & + CMemory_FillRAM [0x212e + c] & (1 << w))) + { + struct Band Win1[3]; + struct Band Win2[3]; + uint32 Window1Enabled = 0; + uint32 Window2Enabled = 0; + bool8 invert = (w == 5 && + ((c == 1 && (CMemory_FillRAM [0x2130] & 0x30) == 0x10) || + (c == 0 && (CMemory_FillRAM [0x2130] & 0xc0) == 0x40))); + + if (w == 5 || + (CMemory_FillRAM [0x212c + c] & CMemory_FillRAM [0x212e + c] & (1 << w))) + { + if (PPU.ClipWindow1Enable [w]) + { + if (!PPU.ClipWindow1Inside [w]) + { + Win1[Window1Enabled].Left = PPU.Window1Left; + Win1[Window1Enabled++].Right = PPU.Window1Right + 1; + } + else + { + if (PPU.Window1Left <= PPU.Window1Right) + { + if (PPU.Window1Left > 0) + { + Win1[Window1Enabled].Left = 0; + Win1[Window1Enabled++].Right = PPU.Window1Left; + } + if (PPU.Window1Right < 255) + { + Win1[Window1Enabled].Left = PPU.Window1Right + 1; + Win1[Window1Enabled++].Right = 256; + } + if (Window1Enabled == 0) + { + Win1[Window1Enabled].Left = 1; + Win1[Window1Enabled++].Right = 0; + } + } + else + { + // 'outside' a window with no range - + // appears to be the whole screen. + Win1[Window1Enabled].Left = 0; + Win1[Window1Enabled++].Right = 256; + } + } + } + if (PPU.ClipWindow2Enable [w]) + { + if (!PPU.ClipWindow2Inside [w]) + { + Win2[Window2Enabled].Left = PPU.Window2Left; + Win2[Window2Enabled++].Right = PPU.Window2Right + 1; + } + else + { + if (PPU.Window2Left <= PPU.Window2Right) + { + if (PPU.Window2Left > 0) + { + Win2[Window2Enabled].Left = 0; + Win2[Window2Enabled++].Right = PPU.Window2Left; + } + if (PPU.Window2Right < 255) + { + Win2[Window2Enabled].Left = PPU.Window2Right + 1; + Win2[Window2Enabled++].Right = 256; + } + if (Window2Enabled == 0) + { + Win2[Window2Enabled].Left = 1; + Win2[Window2Enabled++].Right = 0; + } + } + else + { + Win2[Window2Enabled].Left = 0; + Win2[Window2Enabled++].Right = 256; + } + } + } + } + if (Window1Enabled && Window2Enabled) + { + // Overlap logic + // + // Each window will be in one of three states: + // 1. (Left > Right. One band) + // 2. | ---------------- | (Left >= 0, Right <= 255, Left <= Right. One band) + // 3. |------------ ----------| (Left1 == 0, Right1 < Left2; Left2 > Right1, Right2 == 255. Two bands) + + struct Band Bands [6]; + int B = 0; + switch (PPU.ClipWindowOverlapLogic [w] ^ 1) + { + case CLIP_OR: + if (Window1Enabled == 1) + { + if (BAND_EMPTY(Win1[0])) + { + B = Window2Enabled; + memmove (Bands, Win2, + sizeof(Win2[0]) * Window2Enabled); + } + else + { + if (Window2Enabled == 1) + { + if (BAND_EMPTY (Win2[0])) + Bands[B++] = Win1[0]; + else + { + if (BANDS_INTERSECT (Win1[0], Win2[0])) + { + OR_BANDS(Bands[0],Win1[0], Win2[0]) + B = 1; + } + else + { + Bands[B++] = Win1[0]; + Bands[B++] = Win2[0]; + } + } + } + else + { + if (BANDS_INTERSECT(Win1[0], Win2[0])) + { + OR_BANDS(Bands[0], Win1[0], Win2[0]) + if (BANDS_INTERSECT(Win1[0], Win2[1])) + OR_BANDS(Bands[1], Win1[0], Win2[1]) + else + Bands[1] = Win2[1]; + B = 1; + if (BANDS_INTERSECT(Bands[0], Bands[1])) + OR_BANDS(Bands[0], Bands[0], Bands[1]) + else + B = 2; + } + else + if (BANDS_INTERSECT(Win1[0], Win2[1])) + { + Bands[B++] = Win2[0]; + OR_BANDS(Bands[B], Win1[0], Win2[1]); + B++; + } + else + { + Bands[0] = Win2[0]; + Bands[1] = Win1[0]; + Bands[2] = Win2[1]; + B = 3; + } + } + } + } + else + if (Window2Enabled == 1) + { + if (BAND_EMPTY(Win2[0])) + { + // Window 2 defines an empty range - just + // use window 1 as the clipping (which + // could also be empty). + B = Window1Enabled; + memmove (Bands, Win1, + sizeof(Win1[0]) * Window1Enabled); + } + else + { + // Window 1 has two bands and Window 2 has one. + // Neither is an empty region. + if (BANDS_INTERSECT(Win2[0], Win1[0])) + { + OR_BANDS(Bands[0], Win2[0], Win1[0]) + if (BANDS_INTERSECT(Win2[0], Win1[1])) + OR_BANDS(Bands[1], Win2[0], Win1[1]) + else + Bands[1] = Win1[1]; + B = 1; + if (BANDS_INTERSECT(Bands[0], Bands[1])) + OR_BANDS(Bands[0], Bands[0], Bands[1]) + else + B = 2; + } + else + if (BANDS_INTERSECT(Win2[0], Win1[1])) + { + Bands[B++] = Win1[0]; + OR_BANDS(Bands[B], Win2[0], Win1[1]); + B++; + } + else + { + Bands[0] = Win1[0]; + Bands[1] = Win2[0]; + Bands[2] = Win1[1]; + B = 3; + } + } + } + else + { + // Both windows have two bands + OR_BANDS(Bands[0], Win1[0], Win2[0]); + OR_BANDS(Bands[1], Win1[1], Win2[1]); + B = 1; + if (BANDS_INTERSECT(Bands[0], Bands[1])) + OR_BANDS(Bands[0], Bands[0], Bands[1]) + else + B = 2; + } + break; + + case CLIP_AND: + if (Window1Enabled == 1) + { + // Window 1 has one band + if (BAND_EMPTY(Win1[0])) + Bands [B++] = Win1[0]; + else + if (Window2Enabled == 1) + { + if (BAND_EMPTY (Win2[0])) + Bands [B++] = Win2[0]; + else + { + AND_BANDS(Bands[0], Win1[0], Win2[0]); + B = 1; + } + } + else + { + AND_BANDS(Bands[0], Win1[0], Win2[0]); + AND_BANDS(Bands[1], Win1[0], Win2[1]); + B = 2; + } + } + else + if (Window2Enabled == 1) + { + if (BAND_EMPTY(Win2[0])) + Bands[B++] = Win2[0]; + else + { + // Window 1 has two bands. + AND_BANDS(Bands[0], Win1[0], Win2[0]); + AND_BANDS(Bands[1], Win1[1], Win2[0]); + B = 2; + } + } + else + { + // Both windows have two bands. + AND_BANDS(Bands[0], Win1[0], Win2[0]); + AND_BANDS(Bands[1], Win1[1], Win2[1]); + B = 2; + if (BANDS_INTERSECT(Win1[0], Win2[1])) + { + AND_BANDS(Bands[2], Win1[0], Win2[1]); + B = 3; + } + else + if (BANDS_INTERSECT(Win1[1], Win2[0])) + { + AND_BANDS(Bands[2], Win1[1], Win2[0]); + B = 3; + } + } + break; + case CLIP_XNOR: + invert = !invert; + // Fall... + + case CLIP_XOR: + if (Window1Enabled == 1 && BAND_EMPTY(Win1[0])) + { + B = Window2Enabled; + memmove (Bands, Win2, + sizeof(Win2[0]) * Window2Enabled); + } + else + if (Window2Enabled == 1 && BAND_EMPTY(Win2[0])) + { + B = Window1Enabled; + memmove (Bands, Win1, + sizeof(Win1[0]) * Window1Enabled); + } + else + { + uint32 p = 0; + uint32 points [10]; + uint32 i; + + invert = !invert; + // Build an array of points (window edges) + points [p++] = 0; + for (i = 0; i < Window1Enabled; i++) + { + points [p++] = Win1[i].Left; + points [p++] = Win1[i].Right; + } + for (i = 0; i < Window2Enabled; i++) + { + points [p++] = Win2[i].Left; + points [p++] = Win2[i].Right; + } + points [p++] = 256; + // Sort them + qsort ((void *) points, p, sizeof (points [0]), + IntCompare); + for (i = 0; i < p; i += 2) + { + if (points [i] == points [i + 1]) + continue; + Bands [B].Left = points [i]; + while (i + 2 < p && + points [i + 1] == points [i + 2]) + { + i += 2; + } + Bands [B++].Right = points [i + 1]; + } + } + break; + } + if (invert) + { + int b; + int j = 0; + int empty_band_count = 0; + + // First remove all empty bands from the list. + for (b = 0; b < B; b++) + { + if (!BAND_EMPTY(Bands[b])) + { + if (b != j) + Bands[j] = Bands[b]; + j++; + } + else + empty_band_count++; + } + + if (j > 0) + { + if (j == 1) + { + j = 0; + // Easy case to deal with, so special case it. + + if (Bands[0].Left > 0) + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = Bands[0].Left + 1; + } + if (Bands[0].Right < 256) + { + pClip->Left[j][w] = Bands[0].Right; + pClip->Right[j++][w] = 256; + } + if (j == 0) + { + pClip->Left[j][w] = 1; + pClip->Right[j++][w] = 0; + } + } + else + { + // Now sort the bands into order + B = j; + qsort ((void *) Bands, B, + sizeof (Bands [0]), BandCompare); + + // Now invert the area the bands cover + j = 0; + for (b = 0; b < B; b++) + { + if (b == 0 && Bands[b].Left > 0) + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = Bands[b].Left + 1; + } + else + if (b == B - 1 && Bands[b].Right < 256) + { + pClip->Left[j][w] = Bands[b].Right; + pClip->Right[j++][w] = 256; + } + if (b < B - 1) + { + pClip->Left[j][w] = Bands[b].Right; + pClip->Right[j++][w] = Bands[b + 1].Left + 1; + } + } + } + } + else + { + // Inverting a window that consisted of only + // empty bands is the whole width of the screen. + // Needed for Mario Kart's rear-view mirror display. + if (empty_band_count) + { + pClip->Left[j][w] = 0; + pClip->Right[j][w] = 256; + j++; + } + } + pClip->Count[w] = j; + } + else + { + for (int j = 0; j < B; j++) + { + pClip->Left[j][w] = Bands[j].Left; + pClip->Right[j][w] = Bands[j].Right; + } + pClip->Count [w] = B; + } + } + else + { + // Only one window enabled so no need to perform + // complex overlap logic... + + if (Window1Enabled) + { + if (invert) + { + int j = 0; + + if (Window1Enabled == 1) + { + if (Win1[0].Left <= Win1[0].Right) + { + if (Win1[0].Left > 0) + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = Win1[0].Left; + } + if (Win1[0].Right < 256) + { + pClip->Left[j][w] = Win1[0].Right; + pClip->Right[j++][w] = 256; + } + if (j == 0) + { + pClip->Left[j][w] = 1; + pClip->Right[j++][w] = 0; + } + } + else + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = 256; + } + } + else + { + pClip->Left [j][w] = Win1[0].Right; + pClip->Right[j++][w] = Win1[1].Left; + } + pClip->Count [w] = j; + } + else + { + for (uint32 j = 0; j < Window1Enabled; j++) + { + pClip->Left [j][w] = Win1[j].Left; + pClip->Right [j][w] = Win1[j].Right; + } + pClip->Count [w] = Window1Enabled; + } + } + else + if (Window2Enabled) + { + if (invert) + { + int j = 0; + if (Window2Enabled == 1) + { + if (Win2[0].Left <= Win2[0].Right) + { + if (Win2[0].Left > 0) + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = Win2[0].Left; + } + if (Win2[0].Right < 256) + { + pClip->Left[j][w] = Win2[0].Right; + pClip->Right[j++][w] = 256; + } + if (j == 0) + { + pClip->Left[j][w] = 1; + pClip->Right[j++][w] = 0; + } + } + else + { + pClip->Left[j][w] = 0; + pClip->Right[j++][w] = 256; + } + } + else + { + pClip->Left [j][w] = Win2[0].Right; + pClip->Right[j++][w] = Win2[1].Left + 1; + } + pClip->Count [w] = j; + } + else + { + for (uint32 j = 0; j < Window2Enabled; j++) + { + pClip->Left [j][w] = Win2[j].Left; + pClip->Right [j][w] = Win2[j].Right; + } + pClip->Count [w] = Window2Enabled; + } + } + } + + if (w != 5 && pClip->Count [5]) + { + // Colour window enabled. Set the + // clip windows for all remaining backgrounds to be + // the same as the colour window. + if (pClip->Count [w] == 0) + { + pClip->Count [w] = pClip->Count [5]; + for (uint32 i = 0; i < pClip->Count [w]; i++) + { + pClip->Left [i][w] = pClip->Left [i][5]; + pClip->Right [i][w] = pClip->Right [i][5]; + } + } + else + { + // Intersect the colour window with the bg's + // own clip window. + for (uint32 i = 0; i < pClip->Count [w]; i++) + { + uint32 j; + for (j = 0; j < pClip->Count [5]; j++) + { + if((pClip->Left[i][w] >= pClip->Left[j][5] && pClip->Left[i][w] < pClip->Right[j][5]) || (pClip->Left[j][5] >= pClip->Left[i][w] && pClip->Left[j][5] < pClip->Right[i][w])){ + // Found an intersection! + pClip->Left[i][w]=MAX(pClip->Left[i][w], pClip->Left[j][5]); + pClip->Right[i][w]=MIN(pClip->Right[i][w], pClip->Right[j][5]); + goto Clip_ok; + } + } + // no intersection, nullify it + pClip->Left[i][w]=1; + pClip->Right[i][w]=0; +Clip_ok: + j=0; // dummy statement + } + } + } + } // if (w == 5 | ... +#endif + } // for (int w... + } // for (int c... +} + diff --git a/src/cpu.cpp b/src/cpu.cpp new file mode 100644 index 0000000..cdc2177 --- /dev/null +++ b/src/cpu.cpp @@ -0,0 +1,268 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "ppu.h" +#include "dsp1.h" +#include "cpuexec.h" +#include "debug.h" +#include "apu.h" +#include "dma.h" +#include "sa1.h" +#include "cheats.h" +#include "srtc.h" +#include "sdd1.h" +#include "spc7110.h" +#include "obc1.h" + + +#ifndef ZSNES_FX +#include "fxemu.h" + +extern struct FxInit_s SuperFX; + +void S9xResetSuperFX () +{ + SuperFX.vFlags = 0; //FX_FLAG_ROM_BUFFER;// | FX_FLAG_ADDRESS_CHECKING; + FxReset (&SuperFX); +} +#endif + +void S9xResetCPU () +{ + Registers.PB = 0; + Registers.PC = S9xGetWord (0xFFFC); + Registers.D.W = 0; + Registers.DB = 0; + Registers.SH = 1; + Registers.SL = 0xFF; + Registers.XH = 0; + Registers.YH = 0; + Registers.P.W = 0; + + ICPU.ShiftedPB = 0; + ICPU.ShiftedDB = 0; + SetFlags (MemoryFlag | IndexFlag | IRQ | Emulation); + ClearFlags (Decimal); + + CPU.Flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); + CPU.BranchSkip = FALSE; + CPU.NMIActive = FALSE; + CPU.IRQActive = FALSE; + CPU.WaitingForInterrupt = FALSE; + CPU.InDMA = FALSE; + CPU.WhichEvent = HBLANK_START_EVENT; + CPU.PC = NULL; + CPU.PCBase = NULL; + CPU.PCAtOpcodeStart = NULL; + CPU.WaitAddress = NULL; + CPU.WaitCounter = 0; + CPU.Cycles = 0; + CPU.NextEvent = Settings.HBlankStart; + CPU.V_Counter = 0; + CPU.MemSpeed = SLOW_ONE_CYCLE; + CPU.MemSpeedx2 = SLOW_ONE_CYCLE * 2; + CPU.FastROMSpeed = SLOW_ONE_CYCLE; + CPU.AutoSaveTimer = 0; + CPU.SRAMModified = FALSE; + // CPU.NMITriggerPoint = 4; // Set when ROM image loaded + CPU.BRKTriggered = FALSE; + //CPU.TriedInterleavedMode2 = FALSE; // Reset when ROM image loaded + CPU.NMICycleCount = 0; + CPU.IRQCycleCount = 0; + S9xSetPCBase (Registers.PC); + + ICPU.S9xOpcodes = S9xOpcodesE1; + ICPU.CPUExecuting = TRUE; + + S9xUnpackStatus(); +} + +#ifdef ZSNES_FX +START_EXTERN_C +void S9xResetSuperFX (); +bool8 WinterGold = 0; +extern uint8 *C4Ram; +END_EXTERN_C +#endif + +#ifdef USE_MMU +void set_mmu_mappings(void); +#endif + +void S9xReset (void) +{ +#ifdef USE_MMU + set_mmu_mappings(); +#endif + if (Settings.SuperFX) + S9xResetSuperFX (); + +#ifdef ZSNES_FX + WinterGold = Settings.WinterGold; +#endif + ZeroMemory (CMemory_FillRAM, 0x8000); + memset (CMemory_VRAM, 0x00, 0x10000); + memset (CMemory_RAM, 0x55, 0x20000); +#ifdef USE_MMU + dcache_flush_range((unsigned)&CMemory_FillRAM[0],0x8000); + dcache_flush_range((unsigned)&CMemory_VRAM[0],0x10000); + dcache_flush_range((unsigned)&CMemory_RAM[0],0x20000); + memcpy((void *)0x7e0000,(void *)&CMemory_RAM[0],0x20000); +#endif + + if(Settings.SPC7110) + S9xSpc7110Reset(); + S9xResetCPU (); + S9xResetPPU (); + S9xResetSRTC (); + if (Settings.SDD1) + S9xResetSDD1 (); + + S9xResetDMA (); + S9xResetAPU (); + S9xResetDSP1 (); + S9xSA1Init (); + if (Settings.C4) + S9xInitC4 (); + S9xInitCheatData (); + if(Settings.OBC1) + ResetOBC1(); + +// Settings.Paused = FALSE; +#ifdef USE_MMU +// set_mmu_mappings(); +#endif +} +void S9xSoftReset (void) +{ +#ifdef USE_MMU + set_mmu_mappings(); +#endif + if (Settings.SuperFX) + S9xResetSuperFX (); + +#ifdef ZSNES_FX + WinterGold = Settings.WinterGold; +#endif + ZeroMemory (CMemory_FillRAM, 0x8000); + memset (CMemory_VRAM, 0x00, 0x10000); + // memset (CMemory_RAM, 0x55, 0x20000); +#ifdef USE_MMU + dcache_flush_range((unsigned)&CMemory_FillRAM[0],0x8000); + dcache_flush_range((unsigned)&CMemory_VRAM[0],0x10000); + dcache_flush_range((unsigned)&CMemory_RAM[0],0x20000); + memcpy((void *)0x7e0000,(void *)&CMemory_RAM[0],0x20000); +#endif + + if(Settings.SPC7110) + S9xSpc7110Reset(); + S9xResetCPU (); + S9xSoftResetPPU (); + S9xResetSRTC (); + if (Settings.SDD1) + S9xResetSDD1 (); + + S9xResetDMA (); + S9xResetAPU (); + S9xResetDSP1 (); + if(Settings.OBC1) + ResetOBC1(); + S9xSA1Init (); + if (Settings.C4) + S9xInitC4 (); + S9xInitCheatData (); + +// Settings.Paused = FALSE; +#ifdef USE_MMU +// set_mmu_mappings(); +#endif +} + diff --git a/src/cpuexec.cpp b/src/cpuexec.cpp new file mode 100644 index 0000000..1bd3eef --- /dev/null +++ b/src/cpuexec.cpp @@ -0,0 +1,407 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "cpuops.h" +#include "ppu.h" +#include "cpuexec.h" +#include "debug.h" +#include "snapshot.h" +#include "gfx.h" +#include "missing.h" +#include "apu.h" +#include "dma.h" +#include "fxemu.h" +#include "sa1.h" +#include "spc7110.h" +#include "snes4all.h" + +extern "C" void S9xSaveStateProcess(); + +#ifdef DEBUG_CPU +extern int cpu_debugging; +#endif + +#ifndef USE_OPC_ASM_MIXTO +void S9xMainLoop (void) +{ + for (;;) + { +#ifdef DEBUG_MAXCOUNT + CPU.GlobalLoopCount++; + if(Settings.MaxCount && CPU.GlobalLoopCount == Settings.MaxCount) { + fprintf(stderr, "Max loop count reached: %ld \n", Settings.MaxCount); + S9xExit(); + } +#endif + +#ifdef USE_ALWAYS_APU_SYNC + APU_EXECUTE (); +#else + if (snes4all_sound_enable>1) { + APU_EXECUTE (); + } +#endif + if (CPU.Flags) + { + if (CPU.Flags & NMI_FLAG) + { + if (--CPU.NMICycleCount == 0) + { + CPU.Flags &= ~NMI_FLAG; + if (CPU.WaitingForInterrupt) + { + CPU.WaitingForInterrupt = FALSE; + CPU.PC++; + } + S9xOpcode_NMI (); + } + } + + CHECK_SOUND (); + + if (CPU.Flags & IRQ_PENDING_FLAG) + { + if (CPU.IRQCycleCount == 0) + { + if (CPU.WaitingForInterrupt) + { + CPU.WaitingForInterrupt = FALSE; + CPU.PC++; + } + if (CPU.IRQActive && !Settings.DisableIRQ) + { + if (!CheckFlag (IRQ)) + S9xOpcode_IRQ (); + } + else + CPU.Flags &= ~IRQ_PENDING_FLAG; + } + else + { + if(--CPU.IRQCycleCount==0 && CheckFlag (IRQ)) + CPU.IRQCycleCount=1; + } + } + } +#ifdef DEBUG_CPU + if (cpu_debugging) + puts("/"); +#endif + { + unsigned timeslice=snes4all_timeslice; + if (CPU.Flags) timeslice=1; + while(timeslice--) { +#ifdef CPU_SHUTDOWN + CPU.PCAtOpcodeStart = CPU.PC; +#endif +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif + +#ifdef DEBUG_CPU + if (cpu_debugging) { + S9xPackStatus (); + printf("PC=%.4X, Opcode=%.2X %s\n",CPU.PC - CPU.PCBase,*CPU.PC,ICPU.S9xOpcodes==S9xOpcodesE1?"E1":ICPU.S9xOpcodes==S9xOpcodesM1X1?"M1X1":ICPU.S9xOpcodes==S9xOpcodesM1X0?"M1X0":ICPU.S9xOpcodes==S9xOpcodesM0X0?"M0X0":ICPU.S9xOpcodes==S9xOpcodesM0X1?"M0X1":"???"); + printf("\tPB=%.2X DB=%.2X P=%.4X A=%.4X D=%.4X S=%.4X X=%.4X Y=%.4X\n",Registers.PB,Registers.DB,Registers.P.W,Registers.A.W,Registers.D.W,Registers.S.W,Registers.X.W,Registers.Y.W); + } +#endif + (*ICPU.S9xOpcodes [*CPU.PC++].S9xOpcode) (); +#ifdef DEBUG_CPU + if (cpu_debugging) + puts("."); +#endif + } + } +#ifdef DEBUG_CPU + if (cpu_debugging) + puts("\\"); +#endif + + if (SA1.Executing) { +#ifdef DEBUG_CPU + if (cpu_debugging) { +// S9xSA1PackStatus(); + printf("/SA1 PC=%.4X, Opcode=%.2X %s\n",SA1.PC - SA1.PCBase,*SA1.PC,SA1.S9xOpcodes==S9xSA1OpcodesM1X1?"M1X1":SA1.S9xOpcodes==S9xSA1OpcodesM1X0?"M1X0":SA1.S9xOpcodes==S9xSA1OpcodesM0X0?"M0X0":SA1.S9xOpcodes==S9xSA1OpcodesM0X1?"M0X1":"???"); + printf("\tPB=%.2X DB=%.2X P=%.4X A=%.4X D=%.4X S=%.4X X=%.4X Y=%.4X\n",SA1Registers.PB,SA1Registers.DB,SA1Registers.P.W,SA1Registers.A.W,SA1Registers.D.W,SA1Registers.S.W,SA1Registers.X.W,SA1Registers.Y.W); + } +#endif + S9xSA1MainLoop (); +#ifdef DEBUG_CPU + if (cpu_debugging) + printf("SA1\\ PC=%.4X\n",SA1.PC - SA1.PCBase); +#endif + } + DO_HBLANK_CHECK(); + } +} + +void S9xSetIRQ (uint32 source) +{ + CPU.IRQActive |= source; + CPU.Flags |= IRQ_PENDING_FLAG; + CPU.IRQCycleCount = 3; + if (CPU.WaitingForInterrupt) + { + // Force IRQ to trigger immediately after WAI - + // Final Fantasy Mystic Quest crashes without this. + CPU.IRQCycleCount = 0; + CPU.WaitingForInterrupt = FALSE; + CPU.PC++; + } +} + +void S9xClearIRQ (uint32 source) +{ + CLEAR_IRQ_SOURCE (source); +} + + +void S9xDoHBlankProcessing () +{ + snes4all_prof_start(1); +#ifdef CPU_SHUTDOWN + CPU.WaitCounter++; +#endif +#ifndef USE_OPC_ASM_MIXTO + S9xUpdateAPUTimer(); +#endif + switch (CPU.WhichEvent) + { + case HBLANK_START_EVENT: +// .hblank_start: + if (IPPU.HDMA && CPU.V_Counter <= PPU.ScreenHeight) + IPPU.HDMA = S9xDoHDMA (IPPU.HDMA); + + break; + + case HBLANK_END_EVENT: +// .hblank_end: + S9xSuperFXExec (); + +#ifndef USE_SOUND_DESYNC + { + static int valor=0; + valor++; + if (valor>=snes4all_sound_throttle) { + S9xGenerateSound (); + valor=0; + } + } +#endif + + CPU.Cycles -= Settings.H_Max; + IAPU.NextAPUTimerPos -= snes4all_apu_hmax; + if (IAPU.APUExecuting) + { + APU.Cycles -= Settings.H_Max; +#ifdef MK_APU + S9xCatchupCount(); +#endif + } + else + APU.Cycles = 0; + + CPU.NextEvent = -1; + ICPU.Scanline++; + + CPU.V_Counter=snes4all_vcounter[CPU.V_Counter]; + if (CPU.V_Counter >= snes4all_max_vcounter) + { +#ifdef USE_OLD_SYNC_SPEED + CPU.V_Counter = 0; + CMemory_FillRAM[0x213F]^=0x80; + PPU.RangeTimeOver = 0; + CPU.NMIActive = FALSE; + ICPU.Frame++; + PPU.HVBeamCounterLatched = 0; +#endif + S9xSyncSpeed (); + } + else +// L162: + if (CPU.V_Counter == PPU.ScreenHeight + FIRST_VISIBLE_LINE) + { + // Start of V-blank + S9xEndScreenRefresh (); +#ifdef USE_OLD_END_REFRESH + IPPU.HDMA = 0; + // Bits 7 and 6 of $4212 are computed when read in S9xGetPPU. + IPPU.MaxBrightness = PPU.Brightness; + PPU.ForcedBlanking = (CMemory_FillRAM [0x2100] >> 7) & 1; + + if(!PPU.ForcedBlanking){ + PPU.OAMAddr = PPU.SavedOAMAddr; + { + uint8 tmp = 0; + if(PPU.OAMPriorityRotation) + tmp = (PPU.OAMAddr&0xFE)>>1; + if((PPU.OAMFlip&1) || PPU.FirstSprite!=tmp){ + PPU.FirstSprite=tmp; + IPPU.OBJChanged=TRUE; + } + } + PPU.OAMFlip = 0; + } + + CMemory_FillRAM[0x4210] = 0x80 |Model->_5A22; + if (CMemory_FillRAM[0x4200] & 0x80) + { + CPU.NMIActive = TRUE; + CPU.Flags |= NMI_FLAG; + CPU.NMICycleCount = CPU.NMITriggerPoint; + } +#endif + +#ifdef OLD_SNAPSHOT_CODE + if (CPU.Flags & SAVE_SNAPSHOT_FLAG) + { + CPU.Flags &= ~SAVE_SNAPSHOT_FLAG; + Registers.PC = CPU.PC - CPU.PCBase; + S9xPackStatus (); + S9xAPUPackStatus (); + Snapshot (NULL); + } +#else + { + extern int savestate_state; + if (savestate_state) + S9xSaveStateProcess(); + } +#endif + } + +// L161: + if (PPU.VTimerEnabled && !PPU.HTimerEnabled && + CPU.V_Counter == PPU.IRQVBeamPos) + { +// L163: + S9xSetIRQ (PPU_V_BEAM_IRQ_SOURCE); + } + +// L165: + if (CPU.V_Counter == FIRST_VISIBLE_LINE) + { +#ifdef USE_OLD_START_REFRESH + S9xUpdateJoypads (); + CMemory_FillRAM[0x4210] = Model->_5A22; + CPU.Flags &= ~NMI_FLAG; +#endif + S9xStartScreenRefresh (); + } +// L177: + if (CPU.V_Counter >= FIRST_VISIBLE_LINE && + CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE) + { + RenderLine (CPU.V_Counter - FIRST_VISIBLE_LINE); + } + break; + + case HTIMER_BEFORE_EVENT: + case HTIMER_AFTER_EVENT: + if (PPU.HTimerEnabled && + (!PPU.VTimerEnabled || CPU.V_Counter == PPU.IRQVBeamPos)) + { + S9xSetIRQ (PPU_H_BEAM_IRQ_SOURCE); + } + break; + } + S9xReschedule (); +#ifdef DEBUG_CPU + if (cpu_debugging) { + printf("HSYNC, APU Cyles=%u, PC=%.4X\n\tS=%.2X, X=%.2X, P=%.2X, A=%.2X, Y=%.2X\n",APU.Cycles,APURegisters.PC,APURegisters.S,APURegisters.X,APURegisters.P,APURegisters.YA.B.A,APURegisters.YA.B.Y); + } +#endif + snes4all_prof_end(1); +} + +#endif // USE_OPC_ASM_MIXTO diff --git a/src/cpuops.cpp b/src/cpuops.cpp new file mode 100644 index 0000000..b2fb75c --- /dev/null +++ b/src/cpuops.cpp @@ -0,0 +1,4428 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +/*****************************************************************************/ +/* CPU-S9xOpcodes.CPP */ +/* This file contains all the opcodes */ +/*****************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "debug.h" +#include "missing.h" +#include "apu.h" +#include "sa1.h" +#include "spc7110.h" +#include "dsp1.h" + +START_EXTERN_C +extern uint8 A1, A2, A3, A4, W1, W2, W3, W4; +extern uint8 Ans8; +extern uint16 Ans16; +extern uint32 Ans32; +extern uint8 Work8; +extern uint16 Work16; +extern uint32 Work32; +extern signed char Int8; +extern short Int16; +extern long Int32; +END_EXTERN_C + +#ifdef USE_MEMORY_SPEED +#define MEMSPEED CPU.MemSpeed +#define MEM2XSPEED CPU.MemSpeed2x +#else +#define MEMSPEED 8 +#define MEM2XSPEED 16 +#endif + +#include "cpuexec.h" +#include "cpuaddr.h" +#include "cpuops.h" +#include "cpumacro.h" +#include "apu.h" + +//#if defined(ZSNES_FX) || !defined(USE_OPC_ASM) +#if 1 + +/* ADC *************************************************************************************** */ +static void Op69M1 (void) +{ + Immediate8 (READ); + ADC8 (); +} + +static void Op69M0 (void) +{ + Immediate16 (READ); + ADC16 (); +} + +static void Op65M1 (void) +{ + Direct (READ); + ADC8 (); +} + +static void Op65M0 (void) +{ + Direct (READ); + ADC16 (); +} + +static void Op75M1 (void) +{ + DirectIndexedX (READ); + ADC8 (); +} + +static void Op75M0 (void) +{ + DirectIndexedX (READ); + ADC16 (); +} + +static void Op72M1 (void) +{ + DirectIndirect (READ); + ADC8 (); +} + +static void Op72M0 (void) +{ + DirectIndirect (READ); + ADC16 (); +} + +static void Op61M1 (void) +{ + DirectIndexedIndirect (READ); + ADC8 (); +} + +static void Op61M0 (void) +{ + DirectIndexedIndirect (READ); + ADC16 (); +} + +static void Op71M1 (void) +{ + DirectIndirectIndexed (READ); + ADC8 (); +} + +static void Op71M0 (void) +{ + DirectIndirectIndexed (READ); + ADC16 (); +} + +static void Op67M1 (void) +{ + DirectIndirectLong (READ); + ADC8 (); +} + +static void Op67M0 (void) +{ + DirectIndirectLong (READ); + ADC16 (); +} + +static void Op77M1 (void) +{ + DirectIndirectIndexedLong (READ); + ADC8 (); +} + +static void Op77M0 (void) +{ + DirectIndirectIndexedLong (READ); + ADC16 (); +} + +static void Op6DM1 (void) +{ + Absolute (READ); + ADC8 (); +} + +static void Op6DM0 (void) +{ + Absolute (READ); + ADC16 (); +} + +static void Op7DM1 (void) +{ + AbsoluteIndexedX (READ); + ADC8 (); +} + +static void Op7DM0 (void) +{ + AbsoluteIndexedX (READ); + ADC16 (); +} + +static void Op79M1 (void) +{ + AbsoluteIndexedY (READ); + ADC8 (); +} + +static void Op79M0 (void) +{ + AbsoluteIndexedY (READ); + ADC16 (); +} + +static void Op6FM1 (void) +{ + AbsoluteLong (READ); + ADC8 (); +} + +static void Op6FM0 (void) +{ + AbsoluteLong (READ); + ADC16 (); +} + +static void Op7FM1 (void) +{ + AbsoluteLongIndexedX (READ); + ADC8 (); +} + +static void Op7FM0 (void) +{ + AbsoluteLongIndexedX (READ); + ADC16 (); +} + +static void Op63M1 (void) +{ + StackRelative (READ); + ADC8 (); +} + +static void Op63M0 (void) +{ + StackRelative (READ); + ADC16 (); +} + +static void Op73M1 (void) +{ + StackRelativeIndirectIndexed (READ); + ADC8 (); +} + +static void Op73M0 (void) +{ + StackRelativeIndirectIndexed (READ); + ADC16 (); +} + +/**********************************************************************************************/ + +/* AND *************************************************************************************** */ +static void Op29M1 (void) +{ + Registers.AL &= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.AL); +} + +static void Op29M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.A.W &= *(uint16 *) CPU.PC; +#else + Registers.A.W &= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.A.W); +} + +static void Op25M1 (void) +{ + Direct (READ); + AND8 (); +} + +static void Op25M0 (void) +{ + Direct (READ); + AND16 (); +} + +static void Op35M1 (void) +{ + DirectIndexedX (READ); + AND8 (); +} + +static void Op35M0 (void) +{ + DirectIndexedX (READ); + AND16 (); +} + +static void Op32M1 (void) +{ + DirectIndirect (READ); + AND8 (); +} + +static void Op32M0 (void) +{ + DirectIndirect (READ); + AND16 (); +} + +static void Op21M1 (void) +{ + DirectIndexedIndirect (READ); + AND8 (); +} + +static void Op21M0 (void) +{ + DirectIndexedIndirect (READ); + AND16 (); +} + +static void Op31M1 (void) +{ + DirectIndirectIndexed (READ); + AND8 (); +} + +static void Op31M0 (void) +{ + DirectIndirectIndexed (READ); + AND16 (); +} + +static void Op27M1 (void) +{ + DirectIndirectLong (READ); + AND8 (); +} + +static void Op27M0 (void) +{ + DirectIndirectLong (READ); + AND16 (); +} + +static void Op37M1 (void) +{ + DirectIndirectIndexedLong (READ); + AND8 (); +} + +static void Op37M0 (void) +{ + DirectIndirectIndexedLong (READ); + AND16 (); +} + +static void Op2DM1 (void) +{ + Absolute (READ); + AND8 (); +} + +static void Op2DM0 (void) +{ + Absolute (READ); + AND16 (); +} + +static void Op3DM1 (void) +{ + AbsoluteIndexedX (READ); + AND8 (); +} + +static void Op3DM0 (void) +{ + AbsoluteIndexedX (READ); + AND16 (); +} + +static void Op39M1 (void) +{ + AbsoluteIndexedY (READ); + AND8 (); +} + +static void Op39M0 (void) +{ + AbsoluteIndexedY (READ); + AND16 (); +} + +static void Op2FM1 (void) +{ + AbsoluteLong (READ); + AND8 (); +} + +static void Op2FM0 (void) +{ + AbsoluteLong (READ); + AND16 (); +} + +static void Op3FM1 (void) +{ + AbsoluteLongIndexedX (READ); + AND8 (); +} + +static void Op3FM0 (void) +{ + AbsoluteLongIndexedX (READ); + AND16 (); +} + +static void Op23M1 (void) +{ + StackRelative (READ); + AND8 (); +} + +static void Op23M0 (void) +{ + StackRelative (READ); + AND16 (); +} + +static void Op33M1 (void) +{ + StackRelativeIndirectIndexed (READ); + AND8 (); +} + +static void Op33M0 (void) +{ + StackRelativeIndirectIndexed (READ); + AND16 (); +} +/**********************************************************************************************/ + +/* ASL *************************************************************************************** */ +static void Op0AM1 (void) +{ + A_ASL8 (); +} + +static void Op0AM0 (void) +{ + A_ASL16 (); +} + +static void Op06M1 (void) +{ + Direct (MODIFY); + ASL8 (); +} + +static void Op06M0 (void) +{ + Direct (MODIFY); + ASL16 (); +} + +static void Op16M1 (void) +{ + DirectIndexedX (MODIFY); + ASL8 (); +} + +static void Op16M0 (void) +{ + DirectIndexedX (MODIFY); + ASL16 (); +} + +static void Op0EM1 (void) +{ + Absolute (MODIFY); + ASL8 (); +} + +static void Op0EM0 (void) +{ + Absolute (MODIFY); + ASL16 (); +} + +static void Op1EM1 (void) +{ + AbsoluteIndexedX (MODIFY); + ASL8 (); +} + +static void Op1EM0 (void) +{ + AbsoluteIndexedX (MODIFY); + ASL16 (); +} +/**********************************************************************************************/ + +/* BIT *************************************************************************************** */ +static void Op89M1 (void) +{ + ICPU._Zero = Registers.AL & *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif +} + +static void Op89M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + ICPU._Zero = (Registers.A.W & *(uint16 *) CPU.PC) != 0; +#else + ICPU._Zero = (Registers.A.W & (*CPU.PC + (*(CPU.PC + 1) << 8))) != 0; +#endif +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + CPU.PC += 2; +} + +static void Op24M1 (void) +{ + Direct (READ); + BIT8 (); +} + +static void Op24M0 (void) +{ + Direct (READ); + BIT16 (); +} + +static void Op34M1 (void) +{ + DirectIndexedX (READ); + BIT8 (); +} + +static void Op34M0 (void) +{ + DirectIndexedX (READ); + BIT16 (); +} + +static void Op2CM1 (void) +{ + Absolute (READ); + BIT8 (); +} + +static void Op2CM0 (void) +{ + Absolute (READ); + BIT16 (); +} + +static void Op3CM1 (void) +{ + AbsoluteIndexedX (READ); + BIT8 (); +} + +static void Op3CM0 (void) +{ + AbsoluteIndexedX (READ); + BIT16 (); +} +/**********************************************************************************************/ + +/* CMP *************************************************************************************** */ +static void OpC9M1 (void) +{ + Int32 = (int) Registers.AL - (int) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif +} + +static void OpC9M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) Registers.A.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) Registers.A.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif +} + +static void OpC5M1 (void) +{ + Direct (READ); + CMP8 (); +} + +static void OpC5M0 (void) +{ + Direct (READ); + CMP16 (); +} + +static void OpD5M1 (void) +{ + DirectIndexedX (READ); + CMP8 (); +} + +static void OpD5M0 (void) +{ + DirectIndexedX (READ); + CMP16 (); +} + +static void OpD2M1 (void) +{ + DirectIndirect (READ); + CMP8 (); +} + +static void OpD2M0 (void) +{ + DirectIndirect (READ); + CMP16 (); +} + +static void OpC1M1 (void) +{ + DirectIndexedIndirect (READ); + CMP8 (); +} + +static void OpC1M0 (void) +{ + DirectIndexedIndirect (READ); + CMP16 (); +} + +static void OpD1M1 (void) +{ + DirectIndirectIndexed (READ); + CMP8 (); +} + +static void OpD1M0 (void) +{ + DirectIndirectIndexed (READ); + CMP16 (); +} + +static void OpC7M1 (void) +{ + DirectIndirectLong (READ); + CMP8 (); +} + +static void OpC7M0 (void) +{ + DirectIndirectLong (READ); + CMP16 (); +} + +static void OpD7M1 (void) +{ + DirectIndirectIndexedLong (READ); + CMP8 (); +} + +static void OpD7M0 (void) +{ + DirectIndirectIndexedLong (READ); + CMP16 (); +} + +static void OpCDM1 (void) +{ + Absolute (READ); + CMP8 (); +} + +static void OpCDM0 (void) +{ + Absolute (READ); + CMP16 (); +} + +static void OpDDM1 (void) +{ + AbsoluteIndexedX (READ); + CMP8 (); +} + +static void OpDDM0 (void) +{ + AbsoluteIndexedX (READ); + CMP16 (); +} + +static void OpD9M1 (void) +{ + AbsoluteIndexedY (READ); + CMP8 (); +} + +static void OpD9M0 (void) +{ + AbsoluteIndexedY (READ); + CMP16 (); +} + +static void OpCFM1 (void) +{ + AbsoluteLong (READ); + CMP8 (); +} + +static void OpCFM0 (void) +{ + AbsoluteLong (READ); + CMP16 (); +} + +static void OpDFM1 (void) +{ + AbsoluteLongIndexedX (READ); + CMP8 (); +} + +static void OpDFM0 (void) +{ + AbsoluteLongIndexedX (READ); + CMP16 (); +} + +static void OpC3M1 (void) +{ + StackRelative (READ); + CMP8 (); +} + +static void OpC3M0 (void) +{ + StackRelative (READ); + CMP16 (); +} + +static void OpD3M1 (void) +{ + StackRelativeIndirectIndexed (READ); + CMP8 (); +} + +static void OpD3M0 (void) +{ + StackRelativeIndirectIndexed (READ); + CMP16 (); +} + +/**********************************************************************************************/ + +/* CMX *************************************************************************************** */ +static void OpE0X1 (void) +{ + Int32 = (int) Registers.XL - (int) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif +} + +static void OpE0X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) Registers.X.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) Registers.X.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif +} + +static void OpE4X1 (void) +{ + Direct (READ); + CMX8 (); +} + +static void OpE4X0 (void) +{ + Direct (READ); + CMX16 (); +} + +static void OpECX1 (void) +{ + Absolute (READ); + CMX8 (); +} + +static void OpECX0 (void) +{ + Absolute (READ); + CMX16 (); +} + +/**********************************************************************************************/ + +/* CMY *************************************************************************************** */ +static void OpC0X1 (void) +{ + Int32 = (int) Registers.YL - (int) *CPU.PC++; + ICPU._Carry = Int32 >= 0; + SetZN8 ((uint8) Int32); +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif +} + +static void OpC0X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Int32 = (long) Registers.Y.W - (long) *(uint16 *) CPU.PC; +#else + Int32 = (long) Registers.Y.W - + (long) (*CPU.PC + (*(CPU.PC + 1) << 8)); +#endif + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif +} + +static void OpC4X1 (void) +{ + Direct (READ); + CMY8 (); +} + +static void OpC4X0 (void) +{ + Direct (READ); + CMY16 (); +} + +static void OpCCX1 (void) +{ + Absolute (READ); + CMY8 (); +} + +static void OpCCX0 (void) +{ + Absolute (READ); + CMY16 (); +} + +/**********************************************************************************************/ + +/* DEC *************************************************************************************** */ +static void Op3AM1 (void) +{ + A_DEC8 (); +} + +static void Op3AM0 (void) +{ + A_DEC16 (); +} + +static void OpC6M1 (void) +{ + Direct (MODIFY); + DEC8 (); +} + +static void OpC6M0 (void) +{ + Direct (MODIFY); + DEC16 (); +} + +static void OpD6M1 (void) +{ + DirectIndexedX (MODIFY); + DEC8 (); +} + +static void OpD6M0 (void) +{ + DirectIndexedX (MODIFY); + DEC16 (); +} + +static void OpCEM1 (void) +{ + Absolute (MODIFY); + DEC8 (); +} + +static void OpCEM0 (void) +{ + Absolute (MODIFY); + DEC16 (); +} + +static void OpDEM1 (void) +{ + AbsoluteIndexedX (MODIFY); + DEC8 (); +} + +static void OpDEM0 (void) +{ + AbsoluteIndexedX (MODIFY); + DEC16 (); +} + +/**********************************************************************************************/ + +/* EOR *************************************************************************************** */ +static void Op49M1 (void) +{ + Registers.AL ^= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.AL); +} + +static void Op49M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.A.W ^= *(uint16 *) CPU.PC; +#else + Registers.A.W ^= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.A.W); +} + +static void Op45M1 (void) +{ + Direct (READ); + EOR8 (); +} + +static void Op45M0 (void) +{ + Direct (READ); + EOR16 (); +} + +static void Op55M1 (void) +{ + DirectIndexedX (READ); + EOR8 (); +} + +static void Op55M0 (void) +{ + DirectIndexedX (READ); + EOR16 (); +} + +static void Op52M1 (void) +{ + DirectIndirect (READ); + EOR8 (); +} + +static void Op52M0 (void) +{ + DirectIndirect (READ); + EOR16 (); +} + +static void Op41M1 (void) +{ + DirectIndexedIndirect (READ); + EOR8 (); +} + +static void Op41M0 (void) +{ + DirectIndexedIndirect (READ); + EOR16 (); +} + +static void Op51M1 (void) +{ + DirectIndirectIndexed (READ); + EOR8 (); +} + +static void Op51M0 (void) +{ + DirectIndirectIndexed (READ); + EOR16 (); +} + +static void Op47M1 (void) +{ + DirectIndirectLong (READ); + EOR8 (); +} + +static void Op47M0 (void) +{ + DirectIndirectLong (READ); + EOR16 (); +} + +static void Op57M1 (void) +{ + DirectIndirectIndexedLong (READ); + EOR8 (); +} + +static void Op57M0 (void) +{ + DirectIndirectIndexedLong (READ); + EOR16 (); +} + +static void Op4DM1 (void) +{ + Absolute (READ); + EOR8 (); +} + +static void Op4DM0 (void) +{ + Absolute (READ); + EOR16 (); +} + +static void Op5DM1 (void) +{ + AbsoluteIndexedX (READ); + EOR8 (); +} + +static void Op5DM0 (void) +{ + AbsoluteIndexedX (READ); + EOR16 (); +} + +static void Op59M1 (void) +{ + AbsoluteIndexedY (READ); + EOR8 (); +} + +static void Op59M0 (void) +{ + AbsoluteIndexedY (READ); + EOR16 (); +} + +static void Op4FM1 (void) +{ + AbsoluteLong (READ); + EOR8 (); +} + +static void Op4FM0 (void) +{ + AbsoluteLong (READ); + EOR16 (); +} + +static void Op5FM1 (void) +{ + AbsoluteLongIndexedX (READ); + EOR8 (); +} + +static void Op5FM0 (void) +{ + AbsoluteLongIndexedX (READ); + EOR16 (); +} + +static void Op43M1 (void) +{ + StackRelative (READ); + EOR8 (); +} + +static void Op43M0 (void) +{ + StackRelative (READ); + EOR16 (); +} + +static void Op53M1 (void) +{ + StackRelativeIndirectIndexed (READ); + EOR8 (); +} + +static void Op53M0 (void) +{ + StackRelativeIndirectIndexed (READ); + EOR16 (); +} + +/**********************************************************************************************/ + +/* INC *************************************************************************************** */ +static void Op1AM1 (void) +{ + A_INC8 (); +} + +static void Op1AM0 (void) +{ + A_INC16 (); +} + +static void OpE6M1 (void) +{ + Direct (MODIFY); + INC8 (); +} + +static void OpE6M0 (void) +{ + Direct (MODIFY); + INC16 (); +} + +static void OpF6M1 (void) +{ + DirectIndexedX (MODIFY); + INC8 (); +} + +static void OpF6M0 (void) +{ + DirectIndexedX (MODIFY); + INC16 (); +} + +static void OpEEM1 (void) +{ + Absolute (MODIFY); + INC8 (); +} + +static void OpEEM0 (void) +{ + Absolute (MODIFY); + INC16 (); +} + +static void OpFEM1 (void) +{ + AbsoluteIndexedX (MODIFY); + INC8 (); +} + +static void OpFEM0 (void) +{ + AbsoluteIndexedX (MODIFY); + INC16 (); +} + +/**********************************************************************************************/ +/* LDA *************************************************************************************** */ +static void OpA9M1 (void) +{ + Registers.AL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.AL); +} + +static void OpA9M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.A.W = *(uint16 *) CPU.PC; +#else + Registers.A.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.A.W); +} + +static void OpA5M1 (void) +{ + Direct (READ); + LDA8 (); +} + +static void OpA5M0 (void) +{ + Direct (READ); + LDA16 (); +} + +static void OpB5M1 (void) +{ + DirectIndexedX (READ); + LDA8 (); +} + +static void OpB5M0 (void) +{ + DirectIndexedX (READ); + LDA16 (); +} + +static void OpB2M1 (void) +{ + DirectIndirect (READ); + LDA8 (); +} + +static void OpB2M0 (void) +{ + DirectIndirect (READ); + LDA16 (); +} + +static void OpA1M1 (void) +{ + DirectIndexedIndirect (READ); + LDA8 (); +} + +static void OpA1M0 (void) +{ + DirectIndexedIndirect (READ); + LDA16 (); +} + +static void OpB1M1 (void) +{ + DirectIndirectIndexed (READ); + LDA8 (); +} + +static void OpB1M0 (void) +{ + DirectIndirectIndexed (READ); + LDA16 (); +} + +static void OpA7M1 (void) +{ + DirectIndirectLong (READ); + LDA8 (); +} + +static void OpA7M0 (void) +{ + DirectIndirectLong (READ); + LDA16 (); +} + +static void OpB7M1 (void) +{ + DirectIndirectIndexedLong (READ); + LDA8 (); +} + +static void OpB7M0 (void) +{ + DirectIndirectIndexedLong (READ); + LDA16 (); +} + +static void OpADM1 (void) +{ + Absolute (READ); + LDA8 (); +} + +static void OpADM0 (void) +{ + Absolute (READ); + LDA16 (); +} + +static void OpBDM1 (void) +{ + AbsoluteIndexedX (READ); + LDA8 (); +} + +static void OpBDM0 (void) +{ + AbsoluteIndexedX (READ); + LDA16 (); +} + +static void OpB9M1 (void) +{ + AbsoluteIndexedY (READ); + LDA8 (); +} + +static void OpB9M0 (void) +{ + AbsoluteIndexedY (READ); + LDA16 (); +} + +static void OpAFM1 (void) +{ + AbsoluteLong (READ); + LDA8 (); +} + +static void OpAFM0 (void) +{ + AbsoluteLong (READ); + LDA16 (); +} + +static void OpBFM1 (void) +{ + AbsoluteLongIndexedX (READ); + LDA8 (); +} + +static void OpBFM0 (void) +{ + AbsoluteLongIndexedX (READ); + LDA16 (); +} + +static void OpA3M1 (void) +{ + StackRelative (READ); + LDA8 (); +} + +static void OpA3M0 (void) +{ + StackRelative (READ); + LDA16 (); +} + +static void OpB3M1 (void) +{ + StackRelativeIndirectIndexed (READ); + LDA8 (); +} + +static void OpB3M0 (void) +{ + StackRelativeIndirectIndexed (READ); + LDA16 (); +} + +/**********************************************************************************************/ + +/* LDX *************************************************************************************** */ +static void OpA2X1 (void) +{ + Registers.XL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.XL); +} + +static void OpA2X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.X.W = *(uint16 *) CPU.PC; +#else + Registers.X.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.X.W); +} + +static void OpA6X1 (void) +{ + Direct (READ); + LDX8 (); +} + +static void OpA6X0 (void) +{ + Direct (READ); + LDX16 (); +} + +static void OpB6X1 (void) +{ + DirectIndexedY (READ); + LDX8 (); +} + +static void OpB6X0 (void) +{ + DirectIndexedY (READ); + LDX16 (); +} + +static void OpAEX1 (void) +{ + Absolute (READ); + LDX8 (); +} + +static void OpAEX0 (void) +{ + Absolute (READ); + LDX16 (); +} + +static void OpBEX1 (void) +{ + AbsoluteIndexedY (READ); + LDX8 (); +} + +static void OpBEX0 (void) +{ + AbsoluteIndexedY (READ); + LDX16 (); +} +/**********************************************************************************************/ + +/* LDY *************************************************************************************** */ +static void OpA0X1 (void) +{ + Registers.YL = *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.YL); +} + +static void OpA0X0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.Y.W = *(uint16 *) CPU.PC; +#else + Registers.Y.W = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.Y.W); +} + +static void OpA4X1 (void) +{ + Direct (READ); + LDY8 (); +} + +static void OpA4X0 (void) +{ + Direct (READ); + LDY16 (); +} + +static void OpB4X1 (void) +{ + DirectIndexedX (READ); + LDY8 (); +} + +static void OpB4X0 (void) +{ + DirectIndexedX (READ); + LDY16 (); +} + +static void OpACX1 (void) +{ + Absolute (READ); + LDY8 (); +} + +static void OpACX0 (void) +{ + Absolute (READ); + LDY16 (); +} + +static void OpBCX1 (void) +{ + AbsoluteIndexedX (READ); + LDY8 (); +} + +static void OpBCX0 (void) +{ + AbsoluteIndexedX (READ); + LDY16 (); +} +/**********************************************************************************************/ + +/* LSR *************************************************************************************** */ +static void Op4AM1 (void) +{ + A_LSR8 (); +} + +static void Op4AM0 (void) +{ + A_LSR16 (); +} + +static void Op46M1 (void) +{ + Direct (MODIFY); + LSR8 (); +} + +static void Op46M0 (void) +{ + Direct (MODIFY); + LSR16 (); +} + +static void Op56M1 (void) +{ + DirectIndexedX (MODIFY); + LSR8 (); +} + +static void Op56M0 (void) +{ + DirectIndexedX (MODIFY); + LSR16 (); +} + +static void Op4EM1 (void) +{ + Absolute (MODIFY); + LSR8 (); +} + +static void Op4EM0 (void) +{ + Absolute (MODIFY); + LSR16 (); +} + +static void Op5EM1 (void) +{ + AbsoluteIndexedX (MODIFY); + LSR8 (); +} + +static void Op5EM0 (void) +{ + AbsoluteIndexedX (MODIFY); + LSR16 (); +} + +/**********************************************************************************************/ + +/* ORA *************************************************************************************** */ +static void Op09M1 (void) +{ + Registers.AL |= *CPU.PC++; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED; +#endif + SetZN8 (Registers.AL); +} + +static void Op09M0 (void) +{ +#ifdef FAST_LSB_WORD_ACCESS + Registers.A.W |= *(uint16 *) CPU.PC; +#else + Registers.A.W |= *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + CPU.PC += 2; +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED; +#endif + SetZN16 (Registers.A.W); +} + +static void Op05M1 (void) +{ + Direct (READ); + ORA8 (); +} + +static void Op05M0 (void) +{ + Direct (READ); + ORA16 (); +} + +static void Op15M1 (void) +{ + DirectIndexedX (READ); + ORA8 (); +} + +static void Op15M0 (void) +{ + DirectIndexedX (READ); + ORA16 (); +} + +static void Op12M1 (void) +{ + DirectIndirect (READ); + ORA8 (); +} + +static void Op12M0 (void) +{ + DirectIndirect (READ); + ORA16 (); +} + +static void Op01M1 (void) +{ + DirectIndexedIndirect (READ); + ORA8 (); +} + +static void Op01M0 (void) +{ + DirectIndexedIndirect (READ); + ORA16 (); +} + +static void Op11M1 (void) +{ + DirectIndirectIndexed (READ); + ORA8 (); +} + +static void Op11M0 (void) +{ + DirectIndirectIndexed (READ); + ORA16 (); +} + +static void Op07M1 (void) +{ + DirectIndirectLong (READ); + ORA8 (); +} + +static void Op07M0 (void) +{ + DirectIndirectLong (READ); + ORA16 (); +} + +static void Op17M1 (void) +{ + DirectIndirectIndexedLong (READ); + ORA8 (); +} + +static void Op17M0 (void) +{ + DirectIndirectIndexedLong (READ); + ORA16 (); +} + +static void Op0DM1 (void) +{ + Absolute (READ); + ORA8 (); +} + +static void Op0DM0 (void) +{ + Absolute (READ); + ORA16 (); +} + +static void Op1DM1 (void) +{ + AbsoluteIndexedX (READ); + ORA8 (); +} + +static void Op1DM0 (void) +{ + AbsoluteIndexedX (READ); + ORA16 (); +} + +static void Op19M1 (void) +{ + AbsoluteIndexedY (READ); + ORA8 (); +} + +static void Op19M0 (void) +{ + AbsoluteIndexedY (READ); + ORA16 (); +} + +static void Op0FM1 (void) +{ + AbsoluteLong (READ); + ORA8 (); +} + +static void Op0FM0 (void) +{ + AbsoluteLong (READ); + ORA16 (); +} + +static void Op1FM1 (void) +{ + AbsoluteLongIndexedX (READ); + ORA8 (); +} + +static void Op1FM0 (void) +{ + AbsoluteLongIndexedX (READ); + ORA16 (); +} + +static void Op03M1 (void) +{ + StackRelative (READ); + ORA8 (); +} + +static void Op03M0 (void) +{ + StackRelative (READ); + ORA16 (); +} + +static void Op13M1 (void) +{ + StackRelativeIndirectIndexed (READ); + ORA8 (); +} + +static void Op13M0 (void) +{ + StackRelativeIndirectIndexed (READ); + ORA16 (); +} + +/**********************************************************************************************/ + +/* ROL *************************************************************************************** */ +static void Op2AM1 (void) +{ + A_ROL8 (); +} + +static void Op2AM0 (void) +{ + A_ROL16 (); +} + +static void Op26M1 (void) +{ + Direct (MODIFY); + ROL8 (); +} + +static void Op26M0 (void) +{ + Direct (MODIFY); + ROL16 (); +} + +static void Op36M1 (void) +{ + DirectIndexedX (MODIFY); + ROL8 (); +} + +static void Op36M0 (void) +{ + DirectIndexedX (MODIFY); + ROL16 (); +} + +static void Op2EM1 (void) +{ + Absolute (MODIFY); + ROL8 (); +} + +static void Op2EM0 (void) +{ + Absolute (MODIFY); + ROL16 (); +} + +static void Op3EM1 (void) +{ + AbsoluteIndexedX (MODIFY); + ROL8 (); +} + +static void Op3EM0 (void) +{ + AbsoluteIndexedX (MODIFY); + ROL16 (); +} +/**********************************************************************************************/ + +/* ROR *************************************************************************************** */ +static void Op6AM1 (void) +{ + A_ROR8 (); +} + +static void Op6AM0 (void) +{ + A_ROR16 (); +} + +static void Op66M1 (void) +{ + Direct (MODIFY); + ROR8 (); +} + +static void Op66M0 (void) +{ + Direct (MODIFY); + ROR16 (); +} + +static void Op76M1 (void) +{ + DirectIndexedX (MODIFY); + ROR8 (); +} + +static void Op76M0 (void) +{ + DirectIndexedX (MODIFY); + ROR16 (); +} + +static void Op6EM1 (void) +{ + Absolute (MODIFY); + ROR8 (); +} + +static void Op6EM0 (void) +{ + Absolute (MODIFY); + ROR16 (); +} + +static void Op7EM1 (void) +{ + AbsoluteIndexedX (MODIFY); + ROR8 (); +} + +static void Op7EM0 (void) +{ + AbsoluteIndexedX (MODIFY); + ROR16 (); +} +/**********************************************************************************************/ + +/* SBC *************************************************************************************** */ +static void OpE9M1 (void) +{ + Immediate8 (READ); + SBC8 (); +} + +static void OpE9M0 (void) +{ + Immediate16 (READ); + SBC16 (); +} + +static void OpE5M1 (void) +{ + Direct (READ); + SBC8 (); +} + +static void OpE5M0 (void) +{ + Direct (READ); + SBC16 (); +} + +static void OpF5M1 (void) +{ + DirectIndexedX (READ); + SBC8 (); +} + +static void OpF5M0 (void) +{ + DirectIndexedX (READ); + SBC16 (); +} + +static void OpF2M1 (void) +{ + DirectIndirect (READ); + SBC8 (); +} + +static void OpF2M0 (void) +{ + DirectIndirect (READ); + SBC16 (); +} + +static void OpE1M1 (void) +{ + DirectIndexedIndirect (READ); + SBC8 (); +} + +static void OpE1M0 (void) +{ + DirectIndexedIndirect (READ); + SBC16 (); +} + +static void OpF1M1 (void) +{ + DirectIndirectIndexed (READ); + SBC8 (); +} + +static void OpF1M0 (void) +{ + DirectIndirectIndexed (READ); + SBC16 (); +} + +static void OpE7M1 (void) +{ + DirectIndirectLong (READ); + SBC8 (); +} + +static void OpE7M0 (void) +{ + DirectIndirectLong (READ); + SBC16 (); +} + +static void OpF7M1 (void) +{ + DirectIndirectIndexedLong (READ); + SBC8 (); +} + +static void OpF7M0 (void) +{ + DirectIndirectIndexedLong (READ); + SBC16 (); +} + +static void OpEDM1 (void) +{ + Absolute (READ); + SBC8 (); +} + +static void OpEDM0 (void) +{ + Absolute (READ); + SBC16 (); +} + +static void OpFDM1 (void) +{ + AbsoluteIndexedX (READ); + SBC8 (); +} + +static void OpFDM0 (void) +{ + AbsoluteIndexedX (READ); + SBC16 (); +} + +static void OpF9M1 (void) +{ + AbsoluteIndexedY (READ); + SBC8 (); +} + +static void OpF9M0 (void) +{ + AbsoluteIndexedY (READ); + SBC16 (); +} + +static void OpEFM1 (void) +{ + AbsoluteLong (READ); + SBC8 (); +} + +static void OpEFM0 (void) +{ + AbsoluteLong (READ); + SBC16 (); +} + +static void OpFFM1 (void) +{ + AbsoluteLongIndexedX (READ); + SBC8 (); +} + +static void OpFFM0 (void) +{ + AbsoluteLongIndexedX (READ); + SBC16 (); +} + +static void OpE3M1 (void) +{ + StackRelative (READ); + SBC8 (); +} + +static void OpE3M0 (void) +{ + StackRelative (READ); + SBC16 (); +} + +static void OpF3M1 (void) +{ + StackRelativeIndirectIndexed (READ); + SBC8 (); +} + +static void OpF3M0 (void) +{ + StackRelativeIndirectIndexed (READ); + SBC16 (); +} +/**********************************************************************************************/ + +/* STA *************************************************************************************** */ +static void Op85M1 (void) +{ + Direct (WRITE); + STA8 (); +} + +static void Op85M0 (void) +{ + Direct (WRITE); + STA16 (); +} + +static void Op95M1 (void) +{ + DirectIndexedX (WRITE); + STA8 (); +} + +static void Op95M0 (void) +{ + DirectIndexedX (WRITE); + STA16 (); +} + +static void Op92M1 (void) +{ + DirectIndirect (WRITE); + STA8 (); +} + +static void Op92M0 (void) +{ + DirectIndirect (WRITE); + STA16 (); +} + +static void Op81M1 (void) +{ + DirectIndexedIndirect (WRITE); + STA8 (); +#ifdef noVAR_CYCLES + if (CheckIndex ()) + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op81M0 (void) +{ + DirectIndexedIndirect (WRITE); + STA16 (); +#ifdef noVAR_CYCLES + if (CheckIndex ()) + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op91M1 (void) +{ + DirectIndirectIndexed (WRITE); + STA8 (); +} + +static void Op91M0 (void) +{ + DirectIndirectIndexed (WRITE); + STA16 (); +} + +static void Op87M1 (void) +{ + DirectIndirectLong (WRITE); + STA8 (); +} + +static void Op87M0 (void) +{ + DirectIndirectLong (WRITE); + STA16 (); +} + +static void Op97M1 (void) +{ + DirectIndirectIndexedLong (WRITE); + STA8 (); +} + +static void Op97M0 (void) +{ + DirectIndirectIndexedLong (WRITE); + STA16 (); +} + +static void Op8DM1 (void) +{ + Absolute (WRITE); + STA8 (); +} + +static void Op8DM0 (void) +{ + Absolute (WRITE); + STA16 (); +} + +static void Op9DM1 (void) +{ + AbsoluteIndexedX (WRITE); + STA8 (); +} + +static void Op9DM0 (void) +{ + AbsoluteIndexedX (WRITE); + STA16 (); +} + +static void Op99M1 (void) +{ + AbsoluteIndexedY (WRITE); + STA8 (); +} + +static void Op99M0 (void) +{ + AbsoluteIndexedY (WRITE); + STA16 (); +} + +static void Op8FM1 (void) +{ + AbsoluteLong (WRITE); + STA8 (); +} + +static void Op8FM0 (void) +{ + AbsoluteLong (WRITE); + STA16 (); +} + +static void Op9FM1 (void) +{ + AbsoluteLongIndexedX (WRITE); + STA8 (); +} + +static void Op9FM0 (void) +{ + AbsoluteLongIndexedX (WRITE); + STA16 (); +} + +static void Op83M1 (void) +{ + StackRelative (WRITE); + STA8 (); +} + +static void Op83M0 (void) +{ + StackRelative (WRITE); + STA16 (); +} + +static void Op93M1 (void) +{ + StackRelativeIndirectIndexed (WRITE); + STA8 (); +} + +static void Op93M0 (void) +{ + StackRelativeIndirectIndexed (WRITE); + STA16 (); +} +/**********************************************************************************************/ + +/* STX *************************************************************************************** */ +static void Op86X1 (void) +{ + Direct (WRITE); + STX8 (); +} + +static void Op86X0 (void) +{ + Direct (WRITE); + STX16 (); +} + +static void Op96X1 (void) +{ + DirectIndexedY (WRITE); + STX8 (); +} + +static void Op96X0 (void) +{ + DirectIndexedY (WRITE); + STX16 (); +} + +static void Op8EX1 (void) +{ + Absolute (WRITE); + STX8 (); +} + +static void Op8EX0 (void) +{ + Absolute (WRITE); + STX16 (); +} +/**********************************************************************************************/ + +/* STY *************************************************************************************** */ +static void Op84X1 (void) +{ + Direct (WRITE); + STY8 (); +} + +static void Op84X0 (void) +{ + Direct (WRITE); + STY16 (); +} + +static void Op94X1 (void) +{ + DirectIndexedX (WRITE); + STY8 (); +} + +static void Op94X0 (void) +{ + DirectIndexedX (WRITE); + STY16 (); +} + +static void Op8CX1 (void) +{ + Absolute (WRITE); + STY8 (); +} + +static void Op8CX0 (void) +{ + Absolute (WRITE); + STY16 (); +} +/**********************************************************************************************/ + +/* STZ *************************************************************************************** */ +static void Op64M1 (void) +{ + Direct (WRITE); + STZ8 (); +} + +static void Op64M0 (void) +{ + Direct (WRITE); + STZ16 (); +} + +static void Op74M1 (void) +{ + DirectIndexedX (WRITE); + STZ8 (); +} + +static void Op74M0 (void) +{ + DirectIndexedX (WRITE); + STZ16 (); +} + +static void Op9CM1 (void) +{ + Absolute (WRITE); + STZ8 (); +} + +static void Op9CM0 (void) +{ + Absolute (WRITE); + STZ16 (); +} + +static void Op9EM1 (void) +{ + AbsoluteIndexedX (WRITE); + STZ8 (); +} + +static void Op9EM0 (void) +{ + AbsoluteIndexedX (WRITE); + STZ16 (); +} + +/**********************************************************************************************/ + +/* TRB *************************************************************************************** */ +static void Op14M1 (void) +{ + Direct (MODIFY); + TRB8 (); +} + +static void Op14M0 (void) +{ + Direct (MODIFY); + TRB16 (); +} + +static void Op1CM1 (void) +{ + Absolute (MODIFY); + TRB8 (); +} + +static void Op1CM0 (void) +{ + Absolute (MODIFY); + TRB16 (); +} +/**********************************************************************************************/ + +/* TSB *************************************************************************************** */ +static void Op04M1 (void) +{ + Direct (MODIFY); + TSB8 (); +} + +static void Op04M0 (void) +{ + Direct (MODIFY); + TSB16 (); +} + +static void Op0CM1 (void) +{ + Absolute (MODIFY); + TSB8 (); +} + +static void Op0CM0 (void) +{ + Absolute (MODIFY); + TSB16 (); +} + +/**********************************************************************************************/ + +/* Branch Instructions *********************************************************************** */ +#ifndef SA1_OPCODES +#define BranchCheck0()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } + +#define BranchCheck1()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } + +#define BranchCheck2()\ + if( CPU.BranchSkip)\ + {\ + CPU.BranchSkip = FALSE;\ + if( CPU.PC - CPU.PCBase > OpAddress)\ + return;\ + } +#else +#define BranchCheck0() +#define BranchCheck1() +#define BranchCheck2() +#endif + +#ifdef CPU_SHUTDOWN +#ifndef SA1_OPCODES +__inline__ void CPUShutdown() +{ + if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) + { + // Don't skip cycles with a pending NMI or IRQ - could cause delayed + // interrupt. Interrupts are delayed for a few cycles already, but + // the delay could allow the shutdown code to cycle skip again. + // Was causing screen flashing on Top Gear 3000. + + if (CPU.WaitCounter == 0 && + !(CPU.Flags & (IRQ_PENDING_FLAG | NMI_FLAG))) + { + CPU.WaitAddress = NULL; + if (Settings.SA1) + S9xSA1ExecuteDuringSleep (); + CPU.Cycles = CPU.NextEvent; + S9xUpdateAPUTimer(); + if (IAPU.APUExecuting) + { + ICPU.CPUExecuting = FALSE; + do + { + APU_EXECUTE1(); + } while (APU.Cycles < CPU.NextEvent); + ICPU.CPUExecuting = TRUE; + } + } + else + if (CPU.WaitCounter >= 2) + CPU.WaitCounter = 1; + else + CPU.WaitCounter--; + } +} +#else +__inline__ void CPUShutdown() +{ + if (Settings.Shutdown && CPU.PC == CPU.WaitAddress) + { + if (CPU.WaitCounter >= 1) + { + SA1.Executing = FALSE; + SA1.CPUExecuting = FALSE; + } + else + CPU.WaitCounter++; + } +} +#endif +#else +#define CPUShutdown() +#endif + +/* BCC */ +static void Op90 (void) +{ + Relative (JUMP); + BranchCheck0 (); + if (!CheckCarry ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BCS */ +static void OpB0 (void) +{ + Relative (JUMP); + BranchCheck0 (); + if (CheckCarry ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BEQ */ +static void OpF0 (void) +{ + Relative (JUMP); + BranchCheck2 (); + if (CheckZero ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BMI */ +static void Op30 (void) +{ + Relative (JUMP); + BranchCheck1 (); + if (CheckNegative ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BNE */ +static void OpD0 (void) +{ + Relative (JUMP); + BranchCheck1 (); + if (!CheckZero ()) + { + CPU.PC = CPU.PCBase + OpAddress; + +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BPL */ +static void Op10 (void) +{ + Relative (JUMP); + BranchCheck1 (); + if (!CheckNegative ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BRA */ +static void Op80 (void) +{ + Relative (JUMP); + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); +} + +/* BVC */ +static void Op50 (void) +{ + Relative (JUMP); + BranchCheck0 (); + if (!CheckOverflow ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} + +/* BVS */ +static void Op70 (void) +{ + Relative (JUMP); + BranchCheck0 (); + if (CheckOverflow ()) + { + CPU.PC = CPU.PCBase + OpAddress; +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + CPUShutdown (); + } +} +/**********************************************************************************************/ + +/* ClearFlag Instructions ******************************************************************** */ +/* CLC */ +static void Op18 (void) +{ + ClearCarry (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* CLD */ +static void OpD8 (void) +{ + ClearDecimal (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* CLI */ +static void Op58 (void) +{ + ClearIRQ (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +/* CHECK_FOR_IRQ(); */ +} + +/* CLV */ +static void OpB8 (void) +{ + ClearOverflow (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* DEX/DEY *********************************************************************************** */ +static void OpCAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.XL--; + SetZN8 (Registers.XL); +} + +static void OpCAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.X.W--; + SetZN16 (Registers.X.W); +} + +static void Op88X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.YL--; + SetZN8 (Registers.YL); +} + +static void Op88X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.Y.W--; + SetZN16 (Registers.Y.W); +} +/**********************************************************************************************/ + +/* INX/INY *********************************************************************************** */ +static void OpE8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.XL++; + SetZN8 (Registers.XL); +} + +static void OpE8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.X.W++; + SetZN16 (Registers.X.W); +} + +static void OpC8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.YL++; + SetZN8 (Registers.YL); +} + +static void OpC8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.Y.W++; + SetZN16 (Registers.Y.W); +} + +/**********************************************************************************************/ + +/* NOP *************************************************************************************** */ +static void OpEA (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + +} +/**********************************************************************************************/ + +/* PUSH Instructions ************************************************************************* */ +/* #define PushW(w) \ + * S9xSetWord (w, Registers.S.W - 1);\ + * Registers.S.W -= 2; + */ +#define PushB(b)\ + S9xSetByte (b, Registers.S.W--); + +#define PushBE(b)\ + S9xSetByte (b, Registers.S.W--);\ + Registers.SH=0x01; + + +#define PushW(w) \ + S9xSetByte ((w)>>8, Registers.S.W);\ + S9xSetByte ((w)&0xff, (Registers.S.W - 1)&0xFFFF);\ + Registers.S.W -= 2; + +#define PushWE(w) \ + S9xSetByte ((w)>>8, Registers.S.W--);\ + Registers.SH=0x01;\ + S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ + Registers.SH = 0x01; + +#define PushWENew(w) \ + S9xSetByte ((w)>>8, Registers.S.W--);\ + S9xSetByte ((w)&0xff, (Registers.S.W--)&0xFFFF);\ + Registers.SH = 0x01; + +//PEA NL +static void OpF4E1 (void) +{ + Absolute (NONE); + PushWENew ((unsigned short)OpAddress); +} + +static void OpF4 (void) +{ + Absolute (NONE); + PushW ((unsigned short)OpAddress); +} + +//PEI NL +static void OpD4E1 (void) +{ + DirectIndirect (NONE); + PushWENew ((unsigned short)OpAddress); +} + +static void OpD4 (void) +{ + DirectIndirect (NONE); + PushW ((unsigned short)OpAddress); +} + +//PER NL +static void Op62E1 (void) +{ + RelativeLong (NONE); + PushWENew ((unsigned short)OpAddress); +} + +static void Op62 (void) +{ + RelativeLong (NONE); + PushW ((unsigned short)OpAddress); +} + + +//PHA +static void Op48E1 (void) +{ + PushBE (Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op48M1 (void) +{ + PushB (Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op48M0 (void) +{ + PushW (Registers.A.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHB +static void Op8BE1 (void) +{ + PushBE (Registers.DB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +static void Op8B (void) +{ + PushB (Registers.DB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHD NL +static void Op0BE1 (void) +{ + PushWENew (Registers.D.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op0B (void) +{ + PushW (Registers.D.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHK +static void Op4BE1 (void) +{ + PushBE (Registers.PB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op4B (void) +{ + PushB (Registers.PB); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHP +static void Op08E1 (void) +{ + S9xPackStatus (); + PushBE (Registers.PL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op08 (void) +{ + S9xPackStatus (); + PushB (Registers.PL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHX +static void OpDAE1 (void) +{ + PushBE (Registers.XL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpDAX1 (void) +{ + PushB (Registers.XL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpDAX0 (void) +{ + PushW (Registers.X.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//PHY +static void Op5AE1 (void) +{ + PushBE (Registers.YL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op5AX1 (void) +{ + PushB (Registers.YL); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op5AX0 (void) +{ + PushW (Registers.Y.W); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* PULL Instructions ************************************************************************* */ +#define PullW(w) \ + w = S9xGetByte (++Registers.S.W); \ + w |= (S9xGetByte (++Registers.S.W)<<8); + +/* w = S9xGetWord (Registers.S.W + 1); \ + Registers.S.W += 2; +*/ + +#define PullB(b)\ + b = S9xGetByte (++Registers.S.W); + +#define PullBE(b)\ + Registers.S.W++;\ + Registers.SH=0x01;\ + b = S9xGetByte (Registers.S.W); + +#define PullWE(w) \ + Registers.S.W++;\ + Registers.SH=0x01;\ + w = S9xGetByte (Registers.S.W); \ + Registers.S.W++; \ + Registers.SH=0x01;\ + w |= (S9xGetByte (Registers.S.W)<<8); + +#define PullWENew(w) \ + PullW(w);\ + Registers.SH=0x01; + +//PLA +static void Op68E1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (Registers.AL); + SetZN8 (Registers.AL); +} + +static void Op68M1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (Registers.AL); + SetZN8 (Registers.AL); +} + +static void Op68M0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (Registers.A.W); + SetZN16 (Registers.A.W); +} + +//PLB +static void OpABE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (Registers.DB); + SetZN8 (Registers.DB); + ICPU.ShiftedDB = Registers.DB << 16; +} + +static void OpAB (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (Registers.DB); + SetZN8 (Registers.DB); + ICPU.ShiftedDB = Registers.DB << 16; +} + +/* PHP */ +//PLD NL +static void Op2BE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullWENew (Registers.D.W); + SetZN16 (Registers.D.W); +} + +static void Op2B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (Registers.D.W); + SetZN16 (Registers.D.W); +} + +/* PLP */ +/* // NOT USED ??? +static void Op28E1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (Registers.PL); + S9xUnpackStatus (); + + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } + S9xFixCycles(); +// CHECK_FOR_IRQ(); +} +*/ + +static void Op28 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (Registers.PL); + S9xUnpackStatus (); + + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } + S9xFixCycles(); +/* CHECK_FOR_IRQ();*/ +} + +//PLX +static void OpFAE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (Registers.XL); + SetZN8 (Registers.XL); +} + +static void OpFAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (Registers.XL); + SetZN8 (Registers.XL); +} + +static void OpFAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (Registers.X.W); + SetZN16 (Registers.X.W); +} + +//PLY +static void Op7AE1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullBE (Registers.YL); + SetZN8 (Registers.YL); +} + +static void Op7AX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullB (Registers.YL); + SetZN8 (Registers.YL); +} + +static void Op7AX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + PullW (Registers.Y.W); + SetZN16 (Registers.Y.W); +} + +/**********************************************************************************************/ + +/* SetFlag Instructions ********************************************************************** */ +/* SEC */ +static void Op38 (void) +{ + SetCarry (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* SED */ +static void OpF8 (void) +{ + SetDecimal (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +/* SEI */ +static void Op78 (void) +{ + SetIRQ (); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* Transfer Instructions ********************************************************************* */ +/* TAX8 */ +static void OpAAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.XL = Registers.AL; + SetZN8 (Registers.XL); +} + +/* TAX16 */ +static void OpAAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.X.W = Registers.A.W; + SetZN16 (Registers.X.W); +} + +/* TAY8 */ +static void OpA8X1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.YL = Registers.AL; + SetZN8 (Registers.YL); +} + +/* TAY16 */ +static void OpA8X0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.Y.W = Registers.A.W; + SetZN16 (Registers.Y.W); +} + +static void Op5B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.D.W = Registers.A.W; + SetZN16 (Registers.D.W); +} + +static void Op1B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.S.W = Registers.A.W; + if (CheckEmulation()) + Registers.SH = 1; +} + +static void Op7B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.A.W = Registers.D.W; + SetZN16 (Registers.A.W); +} + +static void Op3B (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.A.W = Registers.S.W; + SetZN16 (Registers.A.W); +} + +static void OpBAX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.XL = Registers.SL; + SetZN8 (Registers.XL); +} + +static void OpBAX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.X.W = Registers.S.W; + SetZN16 (Registers.X.W); +} + +static void Op8AM1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.AL = Registers.XL; + SetZN8 (Registers.AL); +} + +static void Op8AM0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.A.W = Registers.X.W; + SetZN16 (Registers.A.W); +} + +static void Op9A (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.S.W = Registers.X.W; + if (CheckEmulation()) + Registers.SH = 1; +} + +static void Op9BX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.YL = Registers.XL; + SetZN8 (Registers.YL); +} + +static void Op9BX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.Y.W = Registers.X.W; + SetZN16 (Registers.Y.W); +} + +static void Op98M1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.AL = Registers.YL; + SetZN8 (Registers.AL); +} + +static void Op98M0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.A.W = Registers.Y.W; + SetZN16 (Registers.A.W); +} + +static void OpBBX1 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.XL = Registers.YL; + SetZN8 (Registers.XL); +} + +static void OpBBX0 (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Registers.X.W = Registers.Y.W; + SetZN16 (Registers.X.W); +} + +/**********************************************************************************************/ + +/* XCE *************************************************************************************** */ +static void OpFB (void) +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + + A1 = ICPU._Carry; + A2 = Registers.PH; + ICPU._Carry = A2 & 1; + Registers.PH = A1; + + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + Registers.SH = 1; + } + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } + S9xFixCycles(); +} +/**********************************************************************************************/ + +/* BRK *************************************************************************************** */ +static void Op00 (void) +{ +#ifndef SA1_OPCODES + CPU.BRKTriggered = TRUE; +#endif + + if (!CheckEmulation()) + { + PushB (Registers.PB); + PushW (CPU.PC - CPU.PCBase + 1); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFE6)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFFE)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* BRL ************************************************************************************** */ +static void Op82 (void) +{ + RelativeLong (JUMP); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +} +/**********************************************************************************************/ + +/* IRQ *************************************************************************************** */ +void S9xOpcode_IRQ (void) +{ + if (!CheckEmulation()) + { + PushB (Registers.PB); + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (CMemory_FillRAM [0x2207] | + (CMemory_FillRAM [0x2208] << 8)); +#else + if (Settings.SA1 && (CMemory_FillRAM [0x2209] & 0x40)) + S9xSetPCBase (CMemory_FillRAM [0x220e] | + (CMemory_FillRAM [0x220f] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFEE)); +#endif +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (CMemory_FillRAM [0x2207] | + (CMemory_FillRAM [0x2208] << 8)); +#else + if (Settings.SA1 && (CMemory_FillRAM [0x2209] & 0x40)) + S9xSetPCBase (CMemory_FillRAM [0x220e] | + (CMemory_FillRAM [0x220f] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFFE)); +#endif +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} + +/**********************************************************************************************/ + +/* NMI *************************************************************************************** */ +void S9xOpcode_NMI (void) +{ + if (!CheckEmulation()) + { + PushB (Registers.PB); + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (CMemory_FillRAM [0x2205] | + (CMemory_FillRAM [0x2206] << 8)); +#else + if (Settings.SA1 && (CMemory_FillRAM [0x2209] & 0x20)) + S9xSetPCBase (CMemory_FillRAM [0x220c] | + (CMemory_FillRAM [0x220d] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFEA)); +#endif +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; +#ifdef SA1_OPCODES + S9xSA1SetPCBase (CMemory_FillRAM [0x2205] | + (CMemory_FillRAM [0x2206] << 8)); +#else + if (Settings.SA1 && (CMemory_FillRAM [0x2209] & 0x20)) + S9xSetPCBase (CMemory_FillRAM [0x220c] | + (CMemory_FillRAM [0x220d] << 8)); + else + S9xSetPCBase (S9xGetWord (0xFFFA)); +#endif +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* COP *************************************************************************************** */ +static void Op02 (void) +{ + if (!CheckEmulation()) + { + PushB (Registers.PB); + PushW (CPU.PC - CPU.PCBase + 1); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFE4)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } + else + { + PushW (CPU.PC - CPU.PCBase); + S9xPackStatus (); + PushB (Registers.PL); + OpenBus = Registers.PL; + ClearDecimal (); + SetIRQ (); + + Registers.PB = 0; + ICPU.ShiftedPB = 0; + S9xSetPCBase (S9xGetWord (0xFFF4)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + } +} +/**********************************************************************************************/ + +/* JML *************************************************************************************** */ +static void OpDC (void) +{ + AbsoluteIndirectLong (JUMP); + Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} + +static void Op5C (void) +{ + AbsoluteLong (JUMP); + Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} +/**********************************************************************************************/ + +/* JMP *************************************************************************************** */ +static void Op4C (void) +{ + Absolute (JUMP); + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +#if defined(CPU_SHUTDOWN) && defined(SA1_OPCODES) + CPUShutdown (); +#endif +} + +static void Op6C (void) +{ + AbsoluteIndirect (JUMP); + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +} + +static void Op7C (void) +{ + AbsoluteIndexedIndirect (JUMP); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} +/**********************************************************************************************/ + +/* JSL/RTL *********************************************************************************** */ +static void Op22E1 (void) +{ + AbsoluteLong (JUMP); + PushB (Registers.PB); + PushWENew (CPU.PC - CPU.PCBase - 1); + Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} + +static void Op22 (void) +{ + AbsoluteLong (JUMP); + PushB (Registers.PB); + PushW (CPU.PC - CPU.PCBase - 1); + Registers.PB = (uint8) (OpAddress >> 16); + ICPU.ShiftedPB = OpAddress & 0xff0000; + S9xSetPCBase (OpAddress); +} + +static void Op6BE1 (void) +{ + PullWENew (Registers.PC); + PullB (Registers.PB); + ICPU.ShiftedPB = Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} + +static void Op6B (void) +{ + PullW (Registers.PC); + PullB (Registers.PB); + ICPU.ShiftedPB = Registers.PB << 16; + S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* JSR/RTS *********************************************************************************** */ +static void Op20 (void) +{ + Absolute (JUMP); + PushW (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + (OpAddress & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +//JSR a,x +static void OpFCE1 (void) +{ + AbsoluteIndexedIndirect (JUMP); + PushWENew (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void OpFC (void) +{ + AbsoluteIndexedIndirect (JUMP); + PushW (CPU.PC - CPU.PCBase - 1); + S9xSetPCBase (ICPU.ShiftedPB + OpAddress); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +} + +static void Op60 (void) +{ + PullW (Registers.PC); + S9xSetPCBase (ICPU.ShiftedPB + ((Registers.PC + 1) & 0xffff)); +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE * 3; +#endif +} + +/**********************************************************************************************/ + +/* MVN/MVP *********************************************************************************** */ +static void Op54X1 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED + TWO_CYCLES; +#endif + + Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + + S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), + ICPU.ShiftedDB + Registers.Y.W); + + Registers.XL++; + Registers.YL++; + Registers.A.W--; + if (Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op54X0 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED + TWO_CYCLES; +#endif + + Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + + S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), + ICPU.ShiftedDB + Registers.Y.W); + + Registers.X.W++; + Registers.Y.W++; + Registers.A.W--; + if (Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op44X1 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED + TWO_CYCLES; +#endif + Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), + ICPU.ShiftedDB + Registers.Y.W); + + Registers.XL--; + Registers.YL--; + Registers.A.W--; + if (Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +static void Op44X0 (void) +{ + uint32 SrcBank; + +#ifndef SA1_OPCODES + CPU.Cycles += MEM2XSPEED + TWO_CYCLES; +#endif + Registers.DB = *CPU.PC++; + ICPU.ShiftedDB = Registers.DB << 16; + OpenBus = SrcBank = *CPU.PC++; + S9xSetByte (S9xGetByte ((SrcBank << 16) + Registers.X.W), + ICPU.ShiftedDB + Registers.Y.W); + + Registers.X.W--; + Registers.Y.W--; + Registers.A.W--; + if (Registers.A.W != 0xffff) + CPU.PC -= 3; +} + +/**********************************************************************************************/ + +/* REP/SEP *********************************************************************************** */ +static void OpC2 (void) +{ + Work8 = ~*CPU.PC++; + Registers.PL &= Work8; + ICPU._Carry &= Work8; + ICPU._Overflow &= (Work8 >> 6); + ICPU._Negative &= Work8; + ICPU._Zero |= ~Work8 & Zero; + +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED + ONE_CYCLE; +#endif + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + } + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } + S9xFixCycles(); +/* CHECK_FOR_IRQ(); */ +} + +static void OpE2 (void) +{ + Work8 = *CPU.PC++; + Registers.PL |= Work8; + ICPU._Carry |= Work8 & 1; + ICPU._Overflow |= (Work8 >> 6) & 1; + ICPU._Negative |= Work8; + if (Work8 & Zero) + ICPU._Zero = 0; +#ifndef SA1_OPCODES + CPU.Cycles += MEMSPEED + ONE_CYCLE; +#endif + if (CheckEmulation()) + { + SetFlags (MemoryFlag | IndexFlag); + } + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } + S9xFixCycles(); +} +/**********************************************************************************************/ + +/* XBA *************************************************************************************** */ +static void OpEB (void) +{ + Work8 = Registers.AL; + Registers.AL = Registers.AH; + Registers.AH = Work8; + + SetZN8 (Registers.AL); +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif +} +/**********************************************************************************************/ + +/* RTI *************************************************************************************** */ +static void Op40 (void) +{ + PullB (Registers.PL); + S9xUnpackStatus (); + PullW (Registers.PC); + if (!CheckEmulation()) + { + PullB (Registers.PB); + ICPU.ShiftedPB = Registers.PB << 16; + } + else + { + SetFlags (MemoryFlag | IndexFlag); + } + S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + + if (CheckIndex ()) + { + Registers.XH = 0; + Registers.YH = 0; + } +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + S9xFixCycles(); +/* CHECK_FOR_IRQ(); */ +} + +/**********************************************************************************************/ + +/* STP/WAI/DB ******************************************************************************** */ +// WAI +static void OpCB (void) +{ + +// Ok, let's just C-ify the ASM versions separately. +#ifdef SA1_OPCODES + SA1.WaitingForInterrupt = TRUE; + SA1.PC--; +#if 0 +// XXX: FIXME + if(Settings.Shutdown){ + SA1.Cycles = SA1.NextEvent; + if (IAPU.APUExecuting) + { + SA1.Executing = FALSE; + do + { + APU_EXECUTE1 (); + } while (APU.Cycles < SA1.NextEvent); + SA1.Executing = TRUE; + } + } +#endif +#else // SA1_OPCODES +#if USE_NO_WAIT_WHEN_IRQ + if (CPU.IRQActive) + { +#if !defined(SA1_OPCODES) || defined(VAR_CYCLES) + CPU.Cycles += TWO_CYCLES; +#endif + } + else +#endif + { +#ifndef USE_OLD_DSP1 + if (DSP1.version == 3) return; +#endif + + CPU.WaitingForInterrupt = TRUE; + CPU.PC--; +#ifdef CPU_SHUTDOWN + if (Settings.Shutdown) + { + CPU.Cycles = CPU.NextEvent; + S9xUpdateAPUTimer(); + if (IAPU.APUExecuting) + { + ICPU.CPUExecuting = FALSE; + do + { + APU_EXECUTE1 (); + } while (APU.Cycles < CPU.NextEvent); + ICPU.CPUExecuting = TRUE; + } + } + else + { +#ifndef SA1_OPCODES + CPU.Cycles += TWO_CYCLES; +#endif + } +#endif + } +#endif // SA1_OPCODES +} + +// STP +static void OpDB (void) +{ + CPU.PC--; + CPU.Flags |= DEBUG_MODE_FLAG; +} + +// Reserved S9xOpcode +static void Op42 (void) +{ +} + + + +/*****************************************************************************/ + +/*****************************************************************************/ +/* CPU-S9xOpcodes Definitions */ +/*****************************************************************************/ +struct SOpcodes S9xOpcodesM1X1[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, // 0 - 4 + {Op05M1}, {Op06M1}, {Op07M1}, {Op08}, {Op09M1}, // 5 - 9 + {Op0AM1}, {Op0B}, {Op0CM1}, {Op0DM1}, {Op0EM1}, // 10 - 14 + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, // 15 - 19 + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, // 20 - 24 + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, // 25 - 29 + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22}, // 30 - 34 + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, // 35 - 39 + {Op28}, {Op29M1}, {Op2AM1}, {Op2B}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X1}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48M1}, {Op49M1}, {Op4AM1}, + {Op4B}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X1}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AX1}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68M1}, + {Op69M1}, {Op6AM1}, {Op6B}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AX1}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X1}, {Op85M1}, {Op86X1}, + {Op87M1}, {Op88X1}, {Op89M1}, {Op8AM1}, {Op8B}, + {Op8CX1}, {Op8DM1}, {Op8EX1}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X1}, {Op95M1}, + {Op96X1}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX1}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X1}, {OpA1M1}, {OpA2X1}, {OpA3M1}, {OpA4X1}, + {OpA5M1}, {OpA6X1}, {OpA7M1}, {OpA8X1}, {OpA9M1}, + {OpAAX1}, {OpAB}, {OpACX1}, {OpADM1}, {OpAEX1}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X1}, {OpB5M1}, {OpB6X1}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM1}, + {OpBEX1}, {OpBFM1}, {OpC0X1}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X1}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X1}, {OpC9M1}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAX1}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X1}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X1}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X1}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAX1}, {OpFB}, {OpFC}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; + + +struct SOpcodes S9xOpcodesM1X0[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, + {Op05M1}, {Op06M1}, {Op07M1}, {Op08}, {Op09M1}, + {Op0AM1}, {Op0B}, {Op0CM1}, {Op0DM1}, {Op0EM1}, + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22}, + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, + {Op28}, {Op29M1}, {Op2AM1}, {Op2B}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X0}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48M1}, {Op49M1}, {Op4AM1}, + {Op4B}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X0}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AX0}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68M1}, + {Op69M1}, {Op6AM1}, {Op6B}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AX0}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X0}, {Op85M1}, {Op86X0}, + {Op87M1}, {Op88X0}, {Op89M1}, {Op8AM1}, {Op8B}, + {Op8CX0}, {Op8DM1}, {Op8EX0}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X0}, {Op95M1}, + {Op96X0}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX0}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X0}, {OpA1M1}, {OpA2X0}, {OpA3M1}, {OpA4X0}, + {OpA5M1}, {OpA6X0}, {OpA7M1}, {OpA8X0}, {OpA9M1}, + {OpAAX0}, {OpAB}, {OpACX0}, {OpADM1}, {OpAEX0}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X0}, {OpB5M1}, {OpB6X0}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX0}, {OpBBX0}, {OpBCX0}, {OpBDM1}, + {OpBEX0}, {OpBFM1}, {OpC0X0}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X0}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X0}, {OpC9M1}, {OpCAX0}, {OpCB}, {OpCCX0}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAX0}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X0}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X0}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X0}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX0}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAX0}, {OpFB}, {OpFC}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; + + +struct SOpcodes S9xOpcodesM0X0[256] = +{ + {Op00}, {Op01M0}, {Op02}, {Op03M0}, {Op04M0}, + {Op05M0}, {Op06M0}, {Op07M0}, {Op08}, {Op09M0}, + {Op0AM0}, {Op0B}, {Op0CM0}, {Op0DM0}, {Op0EM0}, + {Op0FM0}, {Op10}, {Op11M0}, {Op12M0}, {Op13M0}, + {Op14M0}, {Op15M0}, {Op16M0}, {Op17M0}, {Op18}, + {Op19M0}, {Op1AM0}, {Op1B}, {Op1CM0}, {Op1DM0}, + {Op1EM0}, {Op1FM0}, {Op20}, {Op21M0}, {Op22}, + {Op23M0}, {Op24M0}, {Op25M0}, {Op26M0}, {Op27M0}, + {Op28}, {Op29M0}, {Op2AM0}, {Op2B}, {Op2CM0}, + {Op2DM0}, {Op2EM0}, {Op2FM0}, {Op30}, {Op31M0}, + {Op32M0}, {Op33M0}, {Op34M0}, {Op35M0}, {Op36M0}, + {Op37M0}, {Op38}, {Op39M0}, {Op3AM0}, {Op3B}, + {Op3CM0}, {Op3DM0}, {Op3EM0}, {Op3FM0}, {Op40}, + {Op41M0}, {Op42}, {Op43M0}, {Op44X0}, {Op45M0}, + {Op46M0}, {Op47M0}, {Op48M0}, {Op49M0}, {Op4AM0}, + {Op4B}, {Op4C}, {Op4DM0}, {Op4EM0}, {Op4FM0}, + {Op50}, {Op51M0}, {Op52M0}, {Op53M0}, {Op54X0}, + {Op55M0}, {Op56M0}, {Op57M0}, {Op58}, {Op59M0}, + {Op5AX0}, {Op5B}, {Op5C}, {Op5DM0}, {Op5EM0}, + {Op5FM0}, {Op60}, {Op61M0}, {Op62}, {Op63M0}, + {Op64M0}, {Op65M0}, {Op66M0}, {Op67M0}, {Op68M0}, + {Op69M0}, {Op6AM0}, {Op6B}, {Op6C}, {Op6DM0}, + {Op6EM0}, {Op6FM0}, {Op70}, {Op71M0}, {Op72M0}, + {Op73M0}, {Op74M0}, {Op75M0}, {Op76M0}, {Op77M0}, + {Op78}, {Op79M0}, {Op7AX0}, {Op7B}, {Op7C}, + {Op7DM0}, {Op7EM0}, {Op7FM0}, {Op80}, {Op81M0}, + {Op82}, {Op83M0}, {Op84X0}, {Op85M0}, {Op86X0}, + {Op87M0}, {Op88X0}, {Op89M0}, {Op8AM0}, {Op8B}, + {Op8CX0}, {Op8DM0}, {Op8EX0}, {Op8FM0}, {Op90}, + {Op91M0}, {Op92M0}, {Op93M0}, {Op94X0}, {Op95M0}, + {Op96X0}, {Op97M0}, {Op98M0}, {Op99M0}, {Op9A}, + {Op9BX0}, {Op9CM0}, {Op9DM0}, {Op9EM0}, {Op9FM0}, + {OpA0X0}, {OpA1M0}, {OpA2X0}, {OpA3M0}, {OpA4X0}, + {OpA5M0}, {OpA6X0}, {OpA7M0}, {OpA8X0}, {OpA9M0}, + {OpAAX0}, {OpAB}, {OpACX0}, {OpADM0}, {OpAEX0}, + {OpAFM0}, {OpB0}, {OpB1M0}, {OpB2M0}, {OpB3M0}, + {OpB4X0}, {OpB5M0}, {OpB6X0}, {OpB7M0}, {OpB8}, + {OpB9M0}, {OpBAX0}, {OpBBX0}, {OpBCX0}, {OpBDM0}, + {OpBEX0}, {OpBFM0}, {OpC0X0}, {OpC1M0}, {OpC2}, + {OpC3M0}, {OpC4X0}, {OpC5M0}, {OpC6M0}, {OpC7M0}, + {OpC8X0}, {OpC9M0}, {OpCAX0}, {OpCB}, {OpCCX0}, + {OpCDM0}, {OpCEM0}, {OpCFM0}, {OpD0}, {OpD1M0}, + {OpD2M0}, {OpD3M0}, {OpD4}, {OpD5M0}, {OpD6M0}, + {OpD7M0}, {OpD8}, {OpD9M0}, {OpDAX0}, {OpDB}, + {OpDC}, {OpDDM0}, {OpDEM0}, {OpDFM0}, {OpE0X0}, + {OpE1M0}, {OpE2}, {OpE3M0}, {OpE4X0}, {OpE5M0}, + {OpE6M0}, {OpE7M0}, {OpE8X0}, {OpE9M0}, {OpEA}, + {OpEB}, {OpECX0}, {OpEDM0}, {OpEEM0}, {OpEFM0}, + {OpF0}, {OpF1M0}, {OpF2M0}, {OpF3M0}, {OpF4}, + {OpF5M0}, {OpF6M0}, {OpF7M0}, {OpF8}, {OpF9M0}, + {OpFAX0}, {OpFB}, {OpFC}, {OpFDM0}, {OpFEM0}, + {OpFFM0} +}; + +struct SOpcodes S9xOpcodesM0X1[256] = +{ + {Op00}, {Op01M0}, {Op02}, {Op03M0}, {Op04M0}, // 0 - 4 + {Op05M0}, {Op06M0}, {Op07M0}, {Op08}, {Op09M0}, // 5 - 9 + {Op0AM0}, {Op0B}, {Op0CM0}, {Op0DM0}, {Op0EM0}, // 10 + {Op0FM0}, {Op10}, {Op11M0}, {Op12M0}, {Op13M0}, // 15 + {Op14M0}, {Op15M0}, {Op16M0}, {Op17M0}, {Op18}, // 20 + {Op19M0}, {Op1AM0}, {Op1B}, {Op1CM0}, {Op1DM0}, // 25 + {Op1EM0}, {Op1FM0}, {Op20}, {Op21M0}, {Op22}, // 30 + {Op23M0}, {Op24M0}, {Op25M0}, {Op26M0}, {Op27M0}, // 35 + {Op28}, {Op29M0}, {Op2AM0}, {Op2B}, {Op2CM0}, // 40 + {Op2DM0}, {Op2EM0}, {Op2FM0}, {Op30}, {Op31M0}, // 45 + {Op32M0}, {Op33M0}, {Op34M0}, {Op35M0}, {Op36M0}, // 50 + {Op37M0}, {Op38}, {Op39M0}, {Op3AM0}, {Op3B}, // 55 + {Op3CM0}, {Op3DM0}, {Op3EM0}, {Op3FM0}, {Op40}, // 60 + {Op41M0}, {Op42}, {Op43M0}, {Op44X1}, {Op45M0}, // 65 + {Op46M0}, {Op47M0}, {Op48M0}, {Op49M0}, {Op4AM0}, // 70 + {Op4B}, {Op4C}, {Op4DM0}, {Op4EM0}, {Op4FM0}, // 75 + {Op50}, {Op51M0}, {Op52M0}, {Op53M0}, {Op54X1}, // 80 + {Op55M0}, {Op56M0}, {Op57M0}, {Op58}, {Op59M0}, // 85 + {Op5AX1}, {Op5B}, {Op5C}, {Op5DM0}, {Op5EM0}, // 90 + {Op5FM0}, {Op60}, {Op61M0}, {Op62}, {Op63M0}, // 95 + {Op64M0}, {Op65M0}, {Op66M0}, {Op67M0}, {Op68M0}, // 100 + {Op69M0}, {Op6AM0}, {Op6B}, {Op6C}, {Op6DM0}, // 105 + {Op6EM0}, {Op6FM0}, {Op70}, {Op71M0}, {Op72M0}, // 110 + {Op73M0}, {Op74M0}, {Op75M0}, {Op76M0}, {Op77M0}, // 115 + {Op78}, {Op79M0}, {Op7AX1}, {Op7B}, {Op7C}, // 120 + {Op7DM0}, {Op7EM0}, {Op7FM0}, {Op80}, {Op81M0}, // 125 + {Op82}, {Op83M0}, {Op84X1}, {Op85M0}, {Op86X1}, // 130 + {Op87M0}, {Op88X1}, {Op89M0}, {Op8AM0}, {Op8B}, // 135 + {Op8CX1}, {Op8DM0}, {Op8EX1}, {Op8FM0}, {Op90}, // 140 + {Op91M0}, {Op92M0}, {Op93M0}, {Op94X1}, {Op95M0}, // 145 + {Op96X1}, {Op97M0}, {Op98M0}, {Op99M0}, {Op9A}, + {Op9BX1}, {Op9CM0}, {Op9DM0}, {Op9EM0}, {Op9FM0}, + {OpA0X1}, {OpA1M0}, {OpA2X1}, {OpA3M0}, {OpA4X1}, + {OpA5M0}, {OpA6X1}, {OpA7M0}, {OpA8X1}, {OpA9M0}, + {OpAAX1}, {OpAB}, {OpACX1}, {OpADM0}, {OpAEX1}, + {OpAFM0}, {OpB0}, {OpB1M0}, {OpB2M0}, {OpB3M0}, + {OpB4X1}, {OpB5M0}, {OpB6X1}, {OpB7M0}, {OpB8}, + {OpB9M0}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM0}, + {OpBEX1}, {OpBFM0}, {OpC0X1}, {OpC1M0}, {OpC2}, + {OpC3M0}, {OpC4X1}, {OpC5M0}, {OpC6M0}, {OpC7M0}, + {OpC8X1}, {OpC9M0}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM0}, {OpCEM0}, {OpCFM0}, {OpD0}, {OpD1M0}, + {OpD2M0}, {OpD3M0}, {OpD4}, {OpD5M0}, {OpD6M0}, + {OpD7M0}, {OpD8}, {OpD9M0}, {OpDAX1}, {OpDB}, + {OpDC}, {OpDDM0}, {OpDEM0}, {OpDFM0}, {OpE0X1}, + {OpE1M0}, {OpE2}, {OpE3M0}, {OpE4X1}, {OpE5M0}, + {OpE6M0}, {OpE7M0}, {OpE8X1}, {OpE9M0}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM0}, {OpEEM0}, {OpEFM0}, + {OpF0}, {OpF1M0}, {OpF2M0}, {OpF3M0}, {OpF4}, + {OpF5M0}, {OpF6M0}, {OpF7M0}, {OpF8}, {OpF9M0}, + {OpFAX1}, {OpFB}, {OpFC}, {OpFDM0}, {OpFEM0}, + {OpFFM0} +}; +/* +#endif + +#if defined(ZSNES_FX) +*/ +struct SOpcodes S9xOpcodesE1[256] = +{ + {Op00}, {Op01M1}, {Op02}, {Op03M1}, {Op04M1}, + {Op05M1}, {Op06M1}, {Op07M1}, {Op08E1}, {Op09M1}, + {Op0AM1}, {Op0BE1}, {Op0CM1}, {Op0DM1}, {Op0EM1}, + {Op0FM1}, {Op10}, {Op11M1}, {Op12M1}, {Op13M1}, + {Op14M1}, {Op15M1}, {Op16M1}, {Op17M1}, {Op18}, + {Op19M1}, {Op1AM1}, {Op1B}, {Op1CM1}, {Op1DM1}, + {Op1EM1}, {Op1FM1}, {Op20}, {Op21M1}, {Op22E1}, + {Op23M1}, {Op24M1}, {Op25M1}, {Op26M1}, {Op27M1}, + {Op28}, {Op29M1}, {Op2AM1}, {Op2BE1}, {Op2CM1}, + {Op2DM1}, {Op2EM1}, {Op2FM1}, {Op30}, {Op31M1}, + {Op32M1}, {Op33M1}, {Op34M1}, {Op35M1}, {Op36M1}, + {Op37M1}, {Op38}, {Op39M1}, {Op3AM1}, {Op3B}, + {Op3CM1}, {Op3DM1}, {Op3EM1}, {Op3FM1}, {Op40}, + {Op41M1}, {Op42}, {Op43M1}, {Op44X1}, {Op45M1}, + {Op46M1}, {Op47M1}, {Op48E1}, {Op49M1}, {Op4AM1}, + {Op4BE1}, {Op4C}, {Op4DM1}, {Op4EM1}, {Op4FM1}, + {Op50}, {Op51M1}, {Op52M1}, {Op53M1}, {Op54X1}, + {Op55M1}, {Op56M1}, {Op57M1}, {Op58}, {Op59M1}, + {Op5AE1}, {Op5B}, {Op5C}, {Op5DM1}, {Op5EM1}, + {Op5FM1}, {Op60}, {Op61M1}, {Op62E1}, {Op63M1}, + {Op64M1}, {Op65M1}, {Op66M1}, {Op67M1}, {Op68E1}, + {Op69M1}, {Op6AM1}, {Op6BE1}, {Op6C}, {Op6DM1}, + {Op6EM1}, {Op6FM1}, {Op70}, {Op71M1}, {Op72M1}, + {Op73M1}, {Op74M1}, {Op75M1}, {Op76M1}, {Op77M1}, + {Op78}, {Op79M1}, {Op7AE1}, {Op7B}, {Op7C}, + {Op7DM1}, {Op7EM1}, {Op7FM1}, {Op80}, {Op81M1}, + {Op82}, {Op83M1}, {Op84X1}, {Op85M1}, {Op86X1}, + {Op87M1}, {Op88X1}, {Op89M1}, {Op8AM1}, {Op8BE1}, + {Op8CX1}, {Op8DM1}, {Op8EX1}, {Op8FM1}, {Op90}, + {Op91M1}, {Op92M1}, {Op93M1}, {Op94X1}, {Op95M1}, + {Op96X1}, {Op97M1}, {Op98M1}, {Op99M1}, {Op9A}, + {Op9BX1}, {Op9CM1}, {Op9DM1}, {Op9EM1}, {Op9FM1}, + {OpA0X1}, {OpA1M1}, {OpA2X1}, {OpA3M1}, {OpA4X1}, + {OpA5M1}, {OpA6X1}, {OpA7M1}, {OpA8X1}, {OpA9M1}, + {OpAAX1}, {OpABE1}, {OpACX1}, {OpADM1}, {OpAEX1}, + {OpAFM1}, {OpB0}, {OpB1M1}, {OpB2M1}, {OpB3M1}, + {OpB4X1}, {OpB5M1}, {OpB6X1}, {OpB7M1}, {OpB8}, + {OpB9M1}, {OpBAX1}, {OpBBX1}, {OpBCX1}, {OpBDM1}, + {OpBEX1}, {OpBFM1}, {OpC0X1}, {OpC1M1}, {OpC2}, + {OpC3M1}, {OpC4X1}, {OpC5M1}, {OpC6M1}, {OpC7M1}, + {OpC8X1}, {OpC9M1}, {OpCAX1}, {OpCB}, {OpCCX1}, + {OpCDM1}, {OpCEM1}, {OpCFM1}, {OpD0}, {OpD1M1}, + {OpD2M1}, {OpD3M1}, {OpD4E1}, {OpD5M1}, {OpD6M1}, + {OpD7M1}, {OpD8}, {OpD9M1}, {OpDAE1}, {OpDB}, + {OpDC}, {OpDDM1}, {OpDEM1}, {OpDFM1}, {OpE0X1}, + {OpE1M1}, {OpE2}, {OpE3M1}, {OpE4X1}, {OpE5M1}, + {OpE6M1}, {OpE7M1}, {OpE8X1}, {OpE9M1}, {OpEA}, + {OpEB}, {OpECX1}, {OpEDM1}, {OpEEM1}, {OpEFM1}, + {OpF0}, {OpF1M1}, {OpF2M1}, {OpF3M1}, {OpF4E1}, + {OpF5M1}, {OpF6M1}, {OpF7M1}, {OpF8}, {OpF9M1}, + {OpFAE1}, {OpFB}, {OpFCE1}, {OpFDM1}, {OpFEM1}, + {OpFFM1} +}; +#endif diff --git a/src/data.cpp b/src/data.cpp new file mode 100644 index 0000000..c103723 --- /dev/null +++ b/src/data.cpp @@ -0,0 +1,540 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +/* +uint8 add32_32 [32][32] = { +{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, + 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, + 0x1e,0x1f}, +{ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e, + 0x1f,0x1f}, +{ 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, + 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, + 0x1f,0x1f}, +{ 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11, + 0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12, + 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13, + 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15, + 0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16, + 0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, + 0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, + 0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, + 0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b, + 0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c, + 0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, + 0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1b,0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1c,0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1d,0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1e,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f}, +{ 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, + 0x1f,0x1f} +}; + +uint8 add32_32_half [32][32] = { +{ 0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07, + 0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e, + 0x0f,0x0f}, +{ 0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07, + 0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f, + 0x0f,0x10}, +{ 0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08, + 0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f, + 0x10,0x10}, +{ 0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08, + 0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10, + 0x10,0x11}, +{ 0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09, + 0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10, + 0x11,0x11}, +{ 0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09, + 0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11, + 0x11,0x12}, +{ 0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a, + 0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11, + 0x12,0x12}, +{ 0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a, + 0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12, + 0x12,0x13}, +{ 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b, + 0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12, + 0x13,0x13}, +{ 0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b, + 0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13, + 0x13,0x14}, +{ 0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, + 0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13, + 0x14,0x14}, +{ 0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c, + 0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14, + 0x14,0x15}, +{ 0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d, + 0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14, + 0x15,0x15}, +{ 0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d, + 0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15, + 0x15,0x16}, +{ 0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e, + 0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15, + 0x16,0x16}, +{ 0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e, + 0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16, + 0x16,0x17}, +{ 0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f, + 0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16, + 0x17,0x17}, +{ 0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f, + 0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17, + 0x17,0x18}, +{ 0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10, + 0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17, + 0x18,0x18}, +{ 0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10, + 0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18, + 0x18,0x19}, +{ 0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11, + 0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18, + 0x19,0x19}, +{ 0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11, + 0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19, + 0x19,0x1a}, +{ 0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12, + 0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19, + 0x1a,0x1a}, +{ 0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12, + 0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a, + 0x1a,0x1b}, +{ 0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13, + 0x13,0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a, + 0x1b,0x1b}, +{ 0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13, + 0x14,0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b, + 0x1b,0x1c}, +{ 0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14, + 0x14,0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b, + 0x1c,0x1c}, +{ 0x0d,0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14, + 0x15,0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c, + 0x1c,0x1d}, +{ 0x0e,0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15, + 0x15,0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c, + 0x1d,0x1d}, +{ 0x0e,0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15, + 0x16,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d, + 0x1d,0x1e}, +{ 0x0f,0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16, + 0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d, + 0x1e,0x1e}, +{ 0x0f,0x10,0x10,0x11,0x11,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x16,0x16, + 0x17,0x17,0x18,0x18,0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1d,0x1d,0x1e, + 0x1e,0x1f} +}; +uint8 sub32_32 [32][32] = { +{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, + 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, + 0x1e,0x1f}, +{ 0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, + 0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c, + 0x1d,0x1e}, +{ 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c, + 0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b, + 0x1c,0x1d}, +{ 0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, + 0x1b,0x1c}, +{ 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a, + 0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, + 0x1a,0x1b}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, + 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, + 0x19,0x1a}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + 0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16, + 0x17,0x18}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06, + 0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15, + 0x16,0x17}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05, + 0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14, + 0x15,0x16}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04, + 0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13, + 0x14,0x15}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03, + 0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12, + 0x13,0x14}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11, + 0x12,0x13}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, + 0x11,0x12}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, + 0x10,0x11}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, + 0x0f,0x10}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, + 0x0e,0x0f}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c, + 0x0d,0x0e}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b, + 0x0c,0x0d}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a, + 0x0b,0x0c}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, + 0x0a,0x0b}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + 0x09,0x0a}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06, + 0x07,0x08}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05, + 0x06,0x07}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04, + 0x05,0x06}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03, + 0x04,0x05}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00} +}; + +uint8 sub32_32_half [32][32] = { +{ 0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07, + 0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e, + 0x0f,0x0f}, +{ 0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06, + 0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e, + 0x0e,0x0f}, +{ 0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06, + 0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d, + 0x0e,0x0e}, +{ 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05, + 0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d, + 0x0d,0x0e}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05, + 0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c, + 0x0d,0x0d}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04, + 0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, + 0x0c,0x0d}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04, + 0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b, + 0x0c,0x0c}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03, + 0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b, + 0x0b,0x0c}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03, + 0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a, + 0x0b,0x0b}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02, + 0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09,0x0a, + 0x0a,0x0b}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02, + 0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09,0x09, + 0x0a,0x0a}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, + 0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08,0x09, + 0x09,0x0a}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,0x08, + 0x09,0x09}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08, + 0x08,0x09}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07, + 0x08,0x08}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07, + 0x07,0x08}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06, + 0x07,0x07}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06, + 0x06,0x07}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05, + 0x06,0x06}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05, + 0x05,0x06}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04, + 0x05,0x05}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04, + 0x04,0x05}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03, + 0x04,0x04}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x03, + 0x03,0x04}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02, + 0x03,0x03}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02, + 0x02,0x03}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01, + 0x02,0x02}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x01,0x02}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x01}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00} +}; +*/ + + +uint8 mul_brightness [16][32] = { +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}, +{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x02, + 0x02,0x02}, +{ 0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02, + 0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04, + 0x04,0x04}, +{ 0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03, + 0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06, + 0x06,0x06}, +{ 0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04, + 0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x08, + 0x08,0x08}, +{ 0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05, + 0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x09,0x09,0x09,0x0a, + 0x0a,0x0a}, +{ 0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x06, + 0x06,0x06,0x07,0x07,0x08,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0c, + 0x0c,0x0c}, +{ 0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07, + 0x07,0x07,0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e, + 0x0e,0x0e}, +{ 0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07, + 0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f, + 0x10,0x11}, +{ 0x00,0x01,0x01,0x02,0x02,0x03,0x04,0x04,0x05,0x05,0x06,0x07,0x07,0x08,0x08, + 0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x10,0x10,0x11,0x11, + 0x12,0x13}, +{ 0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x07,0x07,0x08,0x09,0x09, + 0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0e,0x0f,0x0f,0x10,0x11,0x11,0x12,0x13,0x13, + 0x14,0x15}, +{ 0x00,0x01,0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x08,0x09,0x0a,0x0a, + 0x0b,0x0c,0x0c,0x0d,0x0e,0x0f,0x0f,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x15, + 0x16,0x17}, +{ 0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x09,0x0a,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0e,0x0f,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16,0x16,0x17, + 0x18,0x19}, +{ 0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0a,0x0b,0x0c, + 0x0d,0x0e,0x0f,0x10,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x17,0x18,0x19, + 0x1a,0x1b}, +{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, + 0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b, + 0x1c,0x1d}, +{ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, + 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, + 0x1e,0x1f} +}; + + diff --git a/src/dma.cpp b/src/dma.cpp new file mode 100644 index 0000000..301839a --- /dev/null +++ b/src/dma.cpp @@ -0,0 +1,1299 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "snes9x.h" + +#include "memmap.h" +#include "ppu.h" +#include "cpuexec.h" +#include "missing.h" +#include "dma.h" +#include "apu.h" +#include "gfx.h" +#include "sa1.h" +#include "spc7110.h" + +#ifdef SDD1_DECOMP +#include "sdd1emu.h" +#endif + +#ifdef SDD1_DECOMP +static uint8 buffer[0x10000]; +#endif + +extern int HDMA_ModeByteCounts [8]; +extern uint8 *HDMAMemPointers [8]; +extern uint8 *HDMABasePointers [8]; + +// #define SETA010_HDMA_FROM_CART + +#ifdef SETA010_HDMA_FROM_CART +uint32 HDMARawPointers[8]; // Cart address space pointer +#endif + +#if defined(__linux__) || defined(__WIN32__) || defined(__MACOSX__) || defined(DREAMCAST) +static int S9xCompareSDD1IndexEntries (const void *p1, const void *p2) +{ + return (*(uint32 *) p1 - *(uint32 *) p2); +} +#endif + +/**********************************************************************************************/ +/* S9xDoDMA() */ +/* This function preforms the general dma transfer */ +/**********************************************************************************************/ + +void S9xDoDMA (uint8 Channel) +{ +#ifdef SHOW_DMA + uint32 suma=0; + uint32 cuantos=1; + printf("S9xDoDMA(%u)\n",Channel); +#endif +/* +dcache_flush_range((uint32)&CMemory_RAM[0], 0x20000); +dcache_flush_range((uint32)&CMemory_FillRAM[0], SNES4ALL_MAX_ROM_SIZE + 0x200 +0x8000); +dcache_flush_range(0x0, 0x2000 - 64); +dcache_flush_range(0x6000, 0x2000 - 64); +dcache_flush_range(0x3f8000, 0x308000 - 64); +dcache_flush_range(0x7e0000, 0x22000 - 64); +dcache_flush_range(0xbf8000, 0x308000 - 64); +*/ + + + uint8 Work; + + if (Channel > 7 || CPU.InDMA) + return; + + CPU.InDMA = TRUE; + bool8 in_sa1_dma = FALSE; + uint8 *in_sdd1_dma = NULL; + uint8 *spc7110_dma=NULL; + bool s7_wrap=false; + SDMA *d = &DMA[Channel]; + + + int count = d->TransferBytes; + + if (count == 0) + count = 0x10000; + + int inc = d->AAddressFixed ? 0 : (!d->AAddressDecrement ? 1 : -1); + + if((d->ABank==0x7E||d->ABank==0x7F)&&d->BAddress==0x80) + { + d->AAddress+= d->TransferBytes; + //does an invalid DMA actually take time? + // I'd say yes, since 'invalid' is probably just the WRAM chip + // not being able to read and write itself at the same time + CPU.Cycles+=(d->TransferBytes+1)*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); + goto update_address; + } + switch (d->BAddress) + { + case 0x18: + case 0x19: + if (IPPU.RenderThisFrame) + FLUSH_REDRAW (); + break; + } + if (Settings.SDD1) + { + if (d->AAddressFixed && CMemory_FillRAM [0x4801] > 0) + { + // Hacky support for pre-decompressed S-DD1 data + inc = !d->AAddressDecrement ? 1 : -1; + uint32 address = (((d->ABank << 16) | d->AAddress) & 0xfffff) << 4; + + address |= CMemory_FillRAM [0x4804 + ((d->ABank - 0xc0) >> 4)]; + +#ifdef SDD1_DECOMP + if(Settings.SDD1Pack) + { + uint8* in_ptr=GetBasePointer(((d->ABank << 16) | d->AAddress)); + in_ptr+=d->AAddress; + +#ifdef USE_MMU_BASEPOINTER + dcache_flush_range((uint32)( ((d->ABank << 16) | d->AAddress)&0xff0000),2*d->TransferBytes); +#endif + SDD1_decompress(buffer,in_ptr,d->TransferBytes); + in_sdd1_dma=buffer; +#ifdef SDD1_VERIFY + void *ptr = bsearch (&address, CMemory_SDD1Index, + CMemory_SDD1Entries, 12, S9xCompareSDD1IndexEntries); + if(memcmp(buffer, ptr, d->TransferBytes)) + { + uint8 *p = CMemory_SDD1LoggedData; + bool8 found = FALSE; + uint8 SDD1Bank = CMemory_FillRAM [0x4804 + ((d->ABank - 0xc0) >> 4)] | 0xf0; + + for (uint32 i = 0; i < CMemory_SDD1LoggedDataCount; i++, p += 8) + { + if (*p == d->ABank || + *(p + 1) == (d->AAddress >> 8) && + *(p + 2) == (d->AAddress & 0xff) && + *(p + 3) == (count >> 8) && + *(p + 4) == (count & 0xff) && + *(p + 7) == SDD1Bank) + { + found = TRUE; + } + } + if (!found && CMemory_SDD1LoggedDataCount < MEMMAP_MAX_SDD1_LOGGED_ENTRIES) + { + int j=0; + while(ptr[j]==buffer[j]) + j++; + + *p = d->ABank; + *(p + 1) = d->AAddress >> 8; + *(p + 2) = d->AAddress & 0xff; + *(p + 3) = j&0xFF; + *(p + 4) = (j>>8)&0xFF; + *(p + 7) = SDD1Bank; + CMemory_SDD1LoggedDataCount += 1; + } + } +#endif + } + + else +#endif + { +#if defined(__linux__) || defined (__WIN32__) || defined(__MACOSX__) || defined(DREAMCAST) + void *ptr = bsearch (&address, CMemory_SDD1Index, + CMemory_SDD1Entries, 12, S9xCompareSDD1IndexEntries); + if (ptr) + in_sdd1_dma = *(uint32 *) ((uint8 *) ptr + 4) + CMemory_SDD1Data; +#else + uint8 *ptr = CMemory_SDD1Index; + + for (uint32 e = 0; e < CMemory_SDD1Entries; e++, ptr += 12) + { + if (address == *(uint32 *) ptr) + { + in_sdd1_dma = *(uint32 *) (ptr + 4) + CMemory_SDD1Data; + break; + } + } +#endif + + if (!in_sdd1_dma) + { + // No matching decompressed data found. Must be some new + // graphics not encountered before. Log it if it hasn't been + // already. + uint8 *p = CMemory_SDD1LoggedData; + bool8 found = FALSE; + uint8 SDD1Bank = CMemory_FillRAM [0x4804 + ((d->ABank - 0xc0) >> 4)] | 0xf0; + + for (uint32 i = 0; i < CMemory_SDD1LoggedDataCount; i++, p += 8) + { + if (*p == d->ABank || + *(p + 1) == (d->AAddress >> 8) && + *(p + 2) == (d->AAddress & 0xff) && + *(p + 3) == (count >> 8) && + *(p + 4) == (count & 0xff) && + *(p + 7) == SDD1Bank) + { + found = TRUE; + break; + } + } + if (!found && CMemory_SDD1LoggedDataCount < MEMMAP_MAX_SDD1_LOGGED_ENTRIES) + { + *p = d->ABank; + *(p + 1) = d->AAddress >> 8; + *(p + 2) = d->AAddress & 0xff; + *(p + 3) = count >> 8; + *(p + 4) = count & 0xff; + *(p + 7) = SDD1Bank; + CMemory_SDD1LoggedDataCount += 1; + } + } + } + } + + CMemory_FillRAM [0x4801] = 0; + } + if(Settings.SPC7110&&(d->AAddress==0x4800||d->ABank==0x50)) + { + uint32 i,j; + i=(s7r.reg4805|(s7r.reg4806<<8)); +#ifdef SPC7110_DEBUG + printf("DMA Transfer of %04X bytes from %02X%02X%02X:%02X, offset of %04X, internal bank of %04X, multiplier %02X\n",d->TransferBytes,s7r.reg4803,s7r.reg4802,s7r.reg4801, s7r.reg4804,i, s7r.bank50Internal, s7r.AlignBy); +#endif + i*=s7r.AlignBy; + i+=s7r.bank50Internal; + i%=DECOMP_BUFFER_SIZE; + j=0; + if((i+d->TransferBytes)TransferBytes); //new uint8[d->TransferBytes]; + j=DECOMP_BUFFER_SIZE-i; + memcpy(spc7110_dma, &s7r.bank50[i], j); + memcpy(&spc7110_dma[j],s7r.bank50,d->TransferBytes-j); + s7_wrap=true; + } + int icount=s7r.reg4809|(s7r.reg480A<<8); + icount-=d->TransferBytes; + s7r.reg4809=0x00ff&icount; + s7r.reg480A=(0xff00&icount)>>8; + + s7r.bank50Internal+=d->TransferBytes; + s7r.bank50Internal%=DECOMP_BUFFER_SIZE; + inc=1; + d->AAddress-=count; + } + if (d->BAddress == 0x18 && SA1.in_char_dma && (d->ABank & 0xf0) == 0x40) + { + // Perform packed bitmap to PPU character format conversion on the + // data before transmitting it to V-RAM via-DMA. + int num_chars = 1 << ((CMemory_FillRAM [0x2231] >> 2) & 7); + int depth = (CMemory_FillRAM [0x2231] & 3) == 0 ? 8 : + (CMemory_FillRAM [0x2231] & 3) == 1 ? 4 : 2; + + int bytes_per_char = 8 * depth; + int bytes_per_line = depth * num_chars; + int char_line_bytes = bytes_per_char * num_chars; + uint32 addr = (d->AAddress / char_line_bytes) * char_line_bytes; + uint8 *base = GetBasePointer ((d->ABank << 16) + addr) + addr; + uint8 *buffer = &CMemory_ROM [CMemory_MAX_ROM_SIZE - 0x10000]; + uint8 *p = buffer; + uint32 inc = char_line_bytes - (d->AAddress % char_line_bytes); + uint32 char_count = inc / bytes_per_char; + + in_sa1_dma = TRUE; + + //printf ("%08x,", base); fflush (stdout); + //printf ("depth = %d, count = %d, bytes_per_char = %d, bytes_per_line = %d, num_chars = %d, char_line_bytes = %d\n", + //depth, count, bytes_per_char, bytes_per_line, num_chars, char_line_bytes); + int i; + + switch (depth) + { + case 2: + for (i = 0; i < count; i += inc, base += char_line_bytes, + inc = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 2; + for (uint32 j = 0; j < char_count && p - buffer < count; + j++, line += 2) + { + uint8 *q = line; + for (int l = 0; l < 8; l++, q += bytes_per_line) + { + for (int b = 0; b < 2; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 2) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 3) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 4) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 5) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 6) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 7) & 1); + } + p += 2; + } + } + } + break; + case 4: + for (i = 0; i < count; i += inc, base += char_line_bytes, + inc = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 4; + for (uint32 j = 0; j < char_count && p - buffer < count; + j++, line += 4) + { + uint8 *q = line; + for (int l = 0; l < 8; l++, q += bytes_per_line) + { + for (int b = 0; b < 4; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 0) = (*(p + 0) << 1) | ((r >> 4) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 5) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 6) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 7) & 1); + } + p += 2; + } + p += 32 - 16; + } + } + break; + case 8: + for (i = 0; i < count; i += inc, base += char_line_bytes, + inc = char_line_bytes, char_count = num_chars) + { + uint8 *line = base + (num_chars - char_count) * 8; + for (uint32 j = 0; j < char_count && p - buffer < count; + j++, line += 8) + { + uint8 *q = line; + for (int l = 0; l < 8; l++, q += bytes_per_line) + { + for (int b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 32) = (*(p + 32) << 1) | ((r >> 4) & 1); + *(p + 33) = (*(p + 33) << 1) | ((r >> 5) & 1); + *(p + 48) = (*(p + 48) << 1) | ((r >> 6) & 1); + *(p + 49) = (*(p + 49) << 1) | ((r >> 7) & 1); + } + p += 2; + } + p += 64 - 16; + } + } + break; + } + } + + if (!d->TransferDirection) + { + /* XXX: DMA is potentially broken here for cases where we DMA across + * XXX: memmap boundries. A possible solution would be to re-call + * XXX: GetBasePointer whenever we cross a boundry, and when + * XXX: GetBasePointer returns (0) to take the 'slow path' and use + * XXX: S9xGetByte instead of *base. GetBasePointer() would want to + * XXX: return (0) for MAP_PPU and whatever else is a register range + * XXX: rather than a RAM/ROM block, and we'd want to detect MAP_PPU + * XXX: (or specifically, Address Bus B addresses $2100-$21FF in + * XXX: banks $00-$3F) specially and treat it as MAP_NONE (since + * XXX: PPU->PPU transfers don't work). + */ + + //reflects extra cycle used by DMA + CPU.Cycles += SLOW_ONE_CYCLE * (count+1); + S9xUpdateAPUTimer(); + + uint8 *base = GetBasePointer ((d->ABank << 16) + d->AAddress); + uint16 p = d->AAddress; + +#ifdef SHOW_DMA + printf(" DMA %p to %p (count=%i, inc=%i) %s\n",(d->ABank << 16)+d->AAddress,(d->ABank << 16)+d->AAddress+(count*inc),count,inc,(((d->ABank << 16)+d->AAddress)&0xfff000)!=(((d->ABank << 16)+d->AAddress+(count*inc))&0xfff000)?"CUIDADO":"OK"); +#endif +#ifndef USE_MMU + if (!base) +#else + if ((unsigned)base==-1) +#endif + base = CMemory_ROM; + + if (in_sa1_dma) + { + base = &CMemory_ROM [CMemory_MAX_ROM_SIZE - 0x10000]; + p = 0; + } + + if (in_sdd1_dma) + { + base = in_sdd1_dma; + p = 0; + } + if(spc7110_dma) + { + base=spc7110_dma; + p = 0; + } + if (inc > 0) { + d->AAddress += count; +#ifdef USE_MMU_BASEPOINTER + dcache_flush_range((uint32)base, count*inc); +#endif + }else if (inc < 0) { + d->AAddress -= count; +#ifdef USE_MMU_BASEPOINTER + dcache_flush_range(((uint32)base)-(count*(-inc)), count*(-inc)); +#endif + } + + + if (d->TransferMode == 0 || d->TransferMode == 2 || d->TransferMode == 6) + { + switch (d->BAddress) + { + case 0x04: + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2104(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + break; + case 0x18: +#ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; +#endif + if (!PPU.VMA.FullGraphicCount) + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_linear(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + } + else + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_tile(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + } + break; + case 0x19: +#ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; +#endif + if (!PPU.VMA.FullGraphicCount) + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2119_linear(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + } + else + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2119_tile(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + } + break; + case 0x22: + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2122(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + break; + case 0x80: + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2180(Work); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + break; + default: + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + CHECK_SOUND(); + } while (--count > 0); + break; + } + } + else + if (d->TransferMode == 1 || d->TransferMode == 5) + { + if (d->BAddress == 0x18) + { + // Write to V-RAM +#ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = TRUE; +#endif + if (!PPU.VMA.FullGraphicCount) + { + while (count > 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_linear(Work); + p += inc; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2119_linear(Work); + p += inc; + CHECK_SOUND(); + count -= 2; + } + if (count == 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_linear(Work); + p += inc; + } + } + else + { + while (count > 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_tile(Work); + p += inc; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2119_tile(Work); + p += inc; + CHECK_SOUND(); + count -= 2; + } + if (count == 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + REGISTER_2118_tile(Work); + p += inc; + } + } + } + else + { + // DMA mode 1 general case + while (count > 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2101 + d->BAddress); + p += inc; + CHECK_SOUND(); + count -= 2; + } + if (count == 1) + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + } + } + } + else + if (d->TransferMode == 3 || d->TransferMode == 7) + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + if (count <= 1) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + if (count <= 2) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2101 + d->BAddress); + p += inc; + if (count <= 3) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2101 + d->BAddress); + p += inc; + CHECK_SOUND(); + count -= 4; + } while (count > 0); + } + else + if (d->TransferMode == 4) + { + do + { + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2100 + d->BAddress); + p += inc; + if (count <= 1) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2101 + d->BAddress); + p += inc; + if (count <= 2) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2102 + d->BAddress); + p += inc; + if (count <= 3) + break; + + Work = *(base + p); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetPPU (Work, 0x2103 + d->BAddress); + p += inc; + CHECK_SOUND(); + count -= 4; + } while (count > 0); + } + /*else + { + }*/ + } + else + { + /* XXX: DMA is potentially broken here for cases where the dest is + * XXX: in the Address Bus B range. Note that this bad dest may not + * XXX: cover the whole range of the DMA though, if we transfer + * XXX: 65536 bytes only 256 of them may be Address Bus B. + */ +#ifdef SHOW_DMA + printf(" DMA!%u %p -> %p to %p (count=%i, inc=%i)\n",d->TransferMode,0x2100 + d->BAddress,(d->ABank << 16) + d->AAddress,(d->ABank << 16) + d->AAddress + (inc*count), count, inc); +#endif + do + { + switch (d->TransferMode) + { + case 0: + case 2: + case 6: + Work = S9xGetPPU (0x2100 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + --count; + break; + + case 1: + case 5: + Work = S9xGetPPU (0x2100 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2101 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + count--; + break; + + case 3: + case 7: + Work = S9xGetPPU (0x2100 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2100 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2101 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2101 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + count--; + break; + + case 4: + Work = S9xGetPPU (0x2100 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2101 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2102 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + if (!--count) + break; + + Work = S9xGetPPU (0x2103 + d->BAddress); +#ifdef SHOW_DMA + suma+=Work*(cuantos++); +#endif + S9xSetByte (Work, (d->ABank << 16) + d->AAddress); + d->AAddress += inc; + count--; + break; + + default: + count = 0; + break; + } + CHECK_SOUND(); + } while (count); + } + +#ifdef SPC700_C + IAPU.APUExecuting = Settings.APUEnabled; + APU_EXECUTE (); +#else +#error AUN_NO_IMPLEMENTADO_SPC700_ASM +#endif + while (CPU.Cycles > CPU.NextEvent) + S9xDoHBlankProcessing (); + S9xUpdateAPUTimer(); + + if(Settings.SPC7110&&spc7110_dma) + { + if(spc7110_dma&&s7_wrap) + free(spc7110_dma); //delete [] spc7110_dma; + } + +update_address: + // Super Punch-Out requires that the A-BUS address be updated after the + // DMA transfer. + CMemory_FillRAM[0x4302 + (Channel << 4)] = (uint8) d->AAddress; + CMemory_FillRAM[0x4303 + (Channel << 4)] = d->AAddress >> 8; + + // Secret of the Mana requires that the DMA bytes transfer count be set to + // zero when DMA has completed. + CMemory_FillRAM [0x4305 + (Channel << 4)] = 0; + CMemory_FillRAM [0x4306 + (Channel << 4)] = 0; + + DMA[Channel].IndirectAddress = 0; + d->TransferBytes = 0; + + CPU.InDMA = FALSE; + +#ifdef SHOW_DMA + printf(" RET DMA=%.8X (%i)\n",suma,cuantos-1); +#endif +} + +void S9xStartHDMA () +{ +#ifndef ENABLE_HDMA + IPPU.HDMA = 0; +#else + IPPU.HDMA = CMemory_FillRAM [0x420c]; +#endif + + //per anomie timing post + if(IPPU.HDMA!=0) + { +#if 0 +ndef USE_HDMA_EVENT + if ((unsigned)CPU.NextEvent > (unsigned)Settings.HBlankStart) { + CPU.WhichEvent = HBLANK_START_EVENT; + CPU.NextEvent = Settings.HBlankStart; + } +#endif + CPU.Cycles+=ONE_CYCLE*3; + S9xUpdateAPUTimer(); + } + +// IPPU.HDMAStarted = TRUE; + + for (uint8 i = 0; i < 8; i++) + { + if (IPPU.HDMA & (1 << i)) + { + CPU.Cycles+=SLOW_ONE_CYCLE ; + S9xUpdateAPUTimer(); + DMA [i].LineCount = 0; + DMA [i].FirstLine = TRUE; + DMA [i].Address = DMA [i].AAddress; + if(DMA[i].HDMAIndirectAddressing) + { + CPU.Cycles+=(SLOW_ONE_CYCLE <<2); + S9xUpdateAPUTimer(); + } + } + HDMAMemPointers [i] = NULL; +#ifdef SETA010_HDMA_FROM_CART + HDMARawPointers [i] = 0; +#endif + } +} + + +uint8 S9xDoHDMA (uint8 byte) +{ +#ifdef SHOW_DMA + printf("S9xDoHDMA(%u)\n",byte); +#endif + struct SDMA *p = &DMA [0]; + + int d = 0; + + CPU.InDMA = TRUE; + CPU.Cycles+=ONE_CYCLE*3; + S9xUpdateAPUTimer(); + for (uint8 mask = 1; mask; mask <<= 1, p++, d++) + { + if (byte & mask) + { + if (!p->LineCount) + { + //remember, InDMA is set. + //Get/Set incur no charges! + CPU.Cycles+=SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); + uint8 line = S9xGetByte ((p->ABank << 16) + p->Address); + if (line == 0x80) + { + p->Repeat = TRUE; + p->LineCount = 128; + } + else + { + p->Repeat = !(line & 0x80); + p->LineCount = line & 0x7f; + } + + // Disable H-DMA'ing into V-RAM (register 2118) for Hook + /* XXX: instead of p->BAddress == 0x18, make S9xSetPPU fail + * XXX: writes to $2118/9 when appropriate + */ +#ifdef SETA010_HDMA_FROM_CART + if (!p->LineCount) +#else + if (!p->LineCount || p->BAddress == 0x18) +#endif + { + byte &= ~mask; + p->IndirectAddress += HDMAMemPointers [d] - HDMABasePointers [d]; + CMemory_FillRAM [0x4305 + (d << 4)] = (uint8) p->IndirectAddress; + CMemory_FillRAM [0x4306 + (d << 4)] = p->IndirectAddress >> 8; + continue; + } + + p->Address++; + p->FirstLine = 1; + if (p->HDMAIndirectAddressing) + { + p->IndirectBank = CMemory_FillRAM [0x4307 + (d << 4)]; + //again, no cycle charges while InDMA is set! + CPU.Cycles+=SLOW_ONE_CYCLE<<2; + S9xUpdateAPUTimer(); + p->IndirectAddress = S9xGetWord ((p->ABank << 16) + p->Address); + p->Address += 2; + } + else + { + p->IndirectBank = p->ABank; + p->IndirectAddress = p->Address; + } + HDMABasePointers [d] = HDMAMemPointers [d] = + S9xGetMemPointer ((p->IndirectBank << 16) + p->IndirectAddress); +#ifdef SETA010_HDMA_FROM_CART + HDMARawPointers [d] = (p->IndirectBank << 16) + p->IndirectAddress; +#endif + } + else + { + CPU.Cycles += SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); + } + + if (!HDMAMemPointers [d]) + { + if (!p->HDMAIndirectAddressing) + { + p->IndirectBank = p->ABank; + p->IndirectAddress = p->Address; + } +#ifdef SETA010_HDMA_FROM_CART + HDMARawPointers [d] = (p->IndirectBank << 16) + p->IndirectAddress; +#endif + if (!(HDMABasePointers [d] = HDMAMemPointers [d] = + S9xGetMemPointer ((p->IndirectBank << 16) + p->IndirectAddress))) + { + /* XXX: Instead of this, goto a slow path that first + * XXX: verifies src!=Address Bus B, then uses + * XXX: S9xGetByte(). Or make S9xGetByte return OpenBus + * XXX: (probably?) for Address Bus B while inDMA. + */ + byte &= ~mask; + continue; + } + // Uncommenting the following line breaks Punchout - it starts + // H-DMA during the frame. + //p->FirstLine = TRUE; + } + if (p->Repeat && !p->FirstLine) + { + p->LineCount--; + continue; + } + + if (p->BAddress == 0x04){ + if(SNESGameFixes.Uniracers){ + PPU.OAMAddr = 0x10c; + PPU.OAMFlip=0; + } + } + + switch (p->TransferMode) + { + case 0: + CPU.Cycles += SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 0: SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*HDMAMemPointers [d],0x2100 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]++), 0x2100 + p->BAddress); + HDMAMemPointers [d]++; +#else + S9xSetPPU (*HDMAMemPointers [d]++, 0x2100 + p->BAddress); +#endif + break; + case 5: + CPU.Cycles += 2*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 5: SetPPU(HDMAMemPointers[%u]=%p,%p) y SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*(HDMAMemPointers [d] + 0),0x2100 + p->BAddress,d+1,*(HDMAMemPointers [d] + 1),0x2101 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 1), 0x2101 + p->BAddress); + HDMARawPointers [d] += 2; +#else + S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2101 + p->BAddress); +#endif + HDMAMemPointers [d] += 2; + /* fall through */ + case 1: + CPU.Cycles += 2*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 1: SetPPU(HDMAMemPointers[%u]=%p,%p) y SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*(HDMAMemPointers [d] + 0),0x2100 + p->BAddress,d+1,*(HDMAMemPointers [d] + 1),0x2101 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 1), 0x2101 + p->BAddress); + HDMARawPointers [d] += 2; +#else + S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2101 + p->BAddress); +#endif + HDMAMemPointers [d] += 2; + break; + case 2: + case 6: + CPU.Cycles += 2*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 6: SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*(HDMAMemPointers [d] + 0),0x2100 + p->BAddress,d+1,*(HDMAMemPointers [d] + 1),0x2100 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 1), 0x2100 + p->BAddress); + HDMARawPointers [d] += 2; +#else + S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2100 + p->BAddress); +#endif + HDMAMemPointers [d] += 2; + break; + case 3: + case 7: + CPU.Cycles += 4*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 7: SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*(HDMAMemPointers [d] + 0),0x2100 + p->BAddress,d+1,*(HDMAMemPointers [d] + 1),0x2100 + p->BAddress,d+2,*(HDMAMemPointers [d] + 2),0x2101 + p->BAddress,d+3,*(HDMAMemPointers [d] + 3),0x2101 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 1), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 2), 0x2101 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 3), 0x2101 + p->BAddress); + HDMARawPointers [d] += 4; +#else + S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 2), 0x2101 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 3), 0x2101 + p->BAddress); +#endif + HDMAMemPointers [d] += 4; + break; + case 4: + CPU.Cycles += 4*SLOW_ONE_CYCLE; + S9xUpdateAPUTimer(); +#ifdef SHOW_DMA + printf(" 4: SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p) SetPPU(HDMAMemPointers[%u]=%p,%p)\n",d,*(HDMAMemPointers [d] + 0),0x2100 + p->BAddress,d+1,*(HDMAMemPointers [d] + 1),0x2101 + p->BAddress,d+2,*(HDMAMemPointers [d] + 2),0x2102 + p->BAddress,d+3,*(HDMAMemPointers [d] + 3),0x2103 + p->BAddress); +#endif +#ifdef SETA010_HDMA_FROM_CART + S9xSetPPU (S9xGetByte (HDMARawPointers [d]), 0x2100 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 1), 0x2101 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 2), 0x2102 + p->BAddress); + S9xSetPPU (S9xGetByte (HDMARawPointers [d] + 3), 0x2103 + p->BAddress); + HDMARawPointers [d] += 4; +#else + S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2101 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 2), 0x2102 + p->BAddress); + S9xSetPPU (*(HDMAMemPointers [d] + 3), 0x2103 + p->BAddress); +#endif + HDMAMemPointers [d] += 4; + break; + } + if (!p->HDMAIndirectAddressing) + p->Address += HDMA_ModeByteCounts [p->TransferMode]; + p->IndirectAddress += HDMA_ModeByteCounts [p->TransferMode]; + /* XXX: Check for p->IndirectAddress crossing a mapping boundry, + * XXX: and invalidate HDMAMemPointers[d] + */ + p->FirstLine = FALSE; + p->LineCount--; + } + } + + CPU.InDMA=FALSE; + return (byte); +} + +void S9xResetDMA () +{ + int d; + for (d = 0; d < 8; d++) + { + DMA [d].TransferDirection = FALSE; + DMA [d].HDMAIndirectAddressing = FALSE; + DMA [d].AAddressFixed = TRUE; + DMA [d].AAddressDecrement = FALSE; + DMA [d].TransferMode = 0xff; + DMA [d].ABank = 0xff; + DMA [d].AAddress = 0xffff; + DMA [d].Address = 0xffff; + DMA [d].BAddress = 0xff; + DMA [d].TransferBytes = 0xffff; + } + for (int c = 0x4300; c < 0x4380; c += 0x10) + { + for (d = c; d < c + 12; d++) + CMemory_FillRAM [d] = 0xff; + + CMemory_FillRAM [c + 0xf] = 0xff; + } +} diff --git a/src/dsp1.cpp b/src/dsp1.cpp new file mode 100644 index 0000000..d0a4a4d --- /dev/null +++ b/src/dsp1.cpp @@ -0,0 +1,1184 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifdef USE_OLD_DSP1 +#include "dsp1_old.cpp" +#else +#include "snes9x.h" +#include "dsp1.h" +#include "missing.h" +#include "memmap.h" +#include + +#include "dsp1emu.c" +#include "dsp2emu.c" +#include "dsp3emu.cpp" + +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +void (*SetDSP)(uint8, uint16)=&DSP1SetByte; +uint8 (*GetDSP)(uint16)=&DSP1GetByte; +#endif + +void S9xInitDSP1 () +{ + static bool8 init = FALSE; + + if (!init) + { + InitDSP (); + init = TRUE; + } +} + +void S9xResetDSP1 () +{ + S9xInitDSP1 (); + + DSP1.waiting4command = TRUE; + DSP1.in_count = 0; + DSP1.out_count = 0; + DSP1.in_index = 0; + DSP1.out_index = 0; + DSP1.first_parameter = TRUE; +} + +uint8 S9xGetDSP (uint16 address) +{ + uint8 t; + + t=(*GetDSP)(address); + //DSP1GetByte(address); + return (t); +} + +void S9xSetDSP (uint8 byte, uint16 address) +{ + (*SetDSP)(byte, address); + //DSP1SetByte(byte, address); +} + +void DSP1SetByte(uint8 byte, uint16 address) +{ + if( (address & 0xf000) == 0x6000 || (address & 0x7fff) < 0x4000 ) + { +// if ((address & 1) == 0) +// { + if((DSP1.command==0x0A||DSP1.command==0x1A)&&DSP1.out_count!=0) + { + DSP1.out_count--; + DSP1.out_index++; + return; + } + else if (DSP1.waiting4command) + { + DSP1.command = byte; + DSP1.in_index = 0; + DSP1.waiting4command = FALSE; + DSP1.first_parameter = TRUE; +// printf("Op%02X\n",byte); + // Mario Kart uses 0x00, 0x02, 0x06, 0x0c, 0x28, 0x0a + switch (byte) + { + case 0x00: DSP1.in_count = 2; break; + case 0x30: + case 0x10: DSP1.in_count = 2; break; + case 0x20: DSP1.in_count = 2; break; + case 0x24: + case 0x04: DSP1.in_count = 2; break; + case 0x08: DSP1.in_count = 3; break; + case 0x18: DSP1.in_count = 4; break; + case 0x28: DSP1.in_count = 3; break; + case 0x38: DSP1.in_count = 4; break; + case 0x2c: + case 0x0c: DSP1.in_count = 3; break; + case 0x3c: + case 0x1c: DSP1.in_count = 6; break; + case 0x32: + case 0x22: + case 0x12: + case 0x02: DSP1.in_count = 7; break; + case 0x0a: DSP1.in_count = 1; break; + case 0x3a: + case 0x2a: + case 0x1a: + DSP1. command =0x1a; + DSP1.in_count = 1; break; + case 0x16: + case 0x26: + case 0x36: + case 0x06: DSP1.in_count = 3; break; + case 0x1e: + case 0x2e: + case 0x3e: + case 0x0e: DSP1.in_count = 2; break; + case 0x05: + case 0x35: + case 0x31: + case 0x01: DSP1.in_count = 4; break; + case 0x15: + case 0x11: DSP1.in_count = 4; break; + case 0x25: + case 0x21: DSP1.in_count = 4; break; + case 0x09: + case 0x39: + case 0x3d: + case 0x0d: DSP1.in_count = 3; break; + case 0x19: + case 0x1d: DSP1.in_count = 3; break; + case 0x29: + case 0x2d: DSP1.in_count = 3; break; + case 0x33: + case 0x03: DSP1.in_count = 3; break; + case 0x13: DSP1.in_count = 3; break; + case 0x23: DSP1.in_count = 3; break; + case 0x3b: + case 0x0b: DSP1.in_count = 3; break; + case 0x1b: DSP1.in_count = 3; break; + case 0x2b: DSP1.in_count = 3; break; + case 0x34: + case 0x14: DSP1.in_count = 6; break; + case 0x07: + case 0x0f: DSP1.in_count = 1; break; + case 0x27: + case 0x2F: DSP1.in_count=1; break; + case 0x17: + case 0x37: + case 0x3F: + DSP1.command=0x1f; + case 0x1f: DSP1.in_count = 1; break; + // case 0x80: DSP1.in_count = 2; break; + default: + //printf("Op%02X\n",byte); + case 0x80: + DSP1.in_count = 0; + DSP1.waiting4command = TRUE; + DSP1.first_parameter = TRUE; + break; + } + DSP1.in_count<<=1; + } + else + { + DSP1.parameters [DSP1.in_index] = byte; + DSP1.first_parameter = FALSE; + DSP1.in_index++; + } + + if (DSP1.waiting4command || + (DSP1.first_parameter && byte == 0x80)) + { + DSP1.waiting4command = TRUE; + DSP1.first_parameter = FALSE; + } + else if(DSP1.first_parameter && (DSP1.in_count != 0 || (DSP1.in_count==0&&DSP1.in_index==0))) + { + } +// else if (DSP1.first_parameter) +// { +// } + else + { + if (DSP1.in_count) + { + //DSP1.parameters [DSP1.in_index] |= (byte << 8); + if (--DSP1.in_count == 0) + { + // Actually execute the command + DSP1.waiting4command = TRUE; + DSP1.out_index = 0; + switch (DSP1.command) + { + case 0x1f: + DSP1.out_count=2048; + break; + case 0x00: // Multiple + Op00Multiplicand = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op00Multiplier = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + + DSPOp00 (); + + DSP1.out_count = 2; + DSP1.output [0] = Op00Result&0xFF; + DSP1.output [1] = (Op00Result>>8)&0xFF; + break; + + case 0x20: // Multiple + Op20Multiplicand = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op20Multiplier = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + + DSPOp20 (); + + DSP1.out_count = 2; + DSP1.output [0] = Op20Result&0xFF; + DSP1.output [1] = (Op20Result>>8)&0xFF; + break; + + case 0x30: + case 0x10: // Inverse + Op10Coefficient = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op10Exponent = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + + DSPOp10 (); + + DSP1.out_count = 4; + DSP1.output [0] = (uint8) (((int16) Op10CoefficientR)&0xFF); + DSP1.output [1] = (uint8) ((((int16) Op10CoefficientR)>>8)&0xFF); + DSP1.output [2] = (uint8) (((int16) Op10ExponentR)&0xff); + DSP1.output [3] = (uint8) ((((int16) Op10ExponentR)>>8)&0xff); + break; + + case 0x24: + case 0x04: // Sin and Cos of angle + Op04Angle = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op04Radius = (uint16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + + DSPOp04 (); + + DSP1.out_count = 4; + DSP1.output [0] = (uint8) (Op04Sin&0xFF); + DSP1.output [1] = (uint8) ((Op04Sin>>8)&0xFF); + DSP1.output [2] = (uint8) (Op04Cos&0xFF); + DSP1.output [3] = (uint8) ((Op04Cos>>8)&0xFF); + break; + + case 0x08: // Radius + Op08X = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op08Y = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op08Z = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp08 (); + + DSP1.out_count = 4; + DSP1.output [0] = (uint8) (((int16) Op08Ll)&0xFF); + DSP1.output [1] = (uint8) ((((int16) Op08Ll)>>8)&0xFF); + DSP1.output [2] = (uint8) (((int16) Op08Lh)&0xFF); + DSP1.output [3] = (uint8) ((((int16) Op08Lh)>>8)&0xFF); + break; + + case 0x18: // Range + + Op18X = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op18Y = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op18Z = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op18R = (int16) (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + + DSPOp18 (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op18D&0xFF); + DSP1.output [1] = (uint8) ((Op18D>>8)&0xFF); + break; + + case 0x38: // Range + + Op38X = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op38Y = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op38Z = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op38R = (int16) (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + + DSPOp38 (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op38D&0xFF); + DSP1.output [1] = (uint8) ((Op38D>>8)&0xFF); + break; + + case 0x28: // Distance (vector length) + Op28X = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op28Y = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op28Z = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp28 (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op28R&0xFF); + DSP1.output [1] = (uint8) ((Op28R>>8)&0xFF); + break; + + case 0x2c: + case 0x0c: // Rotate (2D rotate) + Op0CA = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op0CX1 = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op0CY1 = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp0C (); + + DSP1.out_count = 4; + DSP1.output [0] = (uint8) (Op0CX2&0xFF); + DSP1.output [1] = (uint8) ((Op0CX2>>8)&0xFF); + DSP1.output [2] = (uint8) (Op0CY2&0xFF); + DSP1.output [3] = (uint8) ((Op0CY2>>8)&0xFF); + break; + + case 0x3c: + case 0x1c: // Polar (3D rotate) + Op1CZ = (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + //MK: reversed X and Y on neviksti and John's advice. + Op1CY = (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op1CX = (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op1CXBR = (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + Op1CYBR = (DSP1.parameters [8]|(DSP1.parameters[9]<<8)); + Op1CZBR = (DSP1.parameters [10]|(DSP1.parameters[11]<<8)); + + DSPOp1C (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op1CXAR&0xFF); + DSP1.output [1] = (uint8) ((Op1CXAR>>8)&0xFF); + DSP1.output [2] = (uint8) (Op1CYAR&0xFF); + DSP1.output [3] = (uint8) ((Op1CYAR>>8)&0xFF); + DSP1.output [4] = (uint8) (Op1CZAR&0xFF); + DSP1.output [5] = (uint8) ((Op1CZAR>>8)&0xFF); + break; + + case 0x32: + case 0x22: + case 0x12: + case 0x02: // Parameter (Projection) + Op02FX = (short)(DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op02FY = (short)(DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op02FZ = (short)(DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op02LFE = (short)(DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + Op02LES = (short)(DSP1.parameters [8]|(DSP1.parameters[9]<<8)); + Op02AAS = (unsigned short)(DSP1.parameters [10]|(DSP1.parameters[11]<<8)); + Op02AZS = (unsigned short)(DSP1.parameters [12]|(DSP1.parameters[13]<<8)); + + DSPOp02 (); + + DSP1.out_count = 8; + DSP1.output [0] = (uint8) (Op02VOF&0xFF); + DSP1.output [1] = (uint8) ((Op02VOF>>8)&0xFF); + DSP1.output [2] = (uint8) (Op02VVA&0xFF); + DSP1.output [3] = (uint8) ((Op02VVA>>8)&0xFF); + DSP1.output [4] = (uint8) (Op02CX&0xFF); + DSP1.output [5] = (uint8) ((Op02CX>>8)&0xFF); + DSP1.output [6] = (uint8) (Op02CY&0xFF); + DSP1.output [7] = (uint8) ((Op02CY>>8)&0xFF); + break; + + case 0x3a: //1a Mirror + case 0x2a: //1a Mirror + case 0x1a: // Raster mode 7 matrix data + case 0x0a: + Op0AVS = (short)(DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + + DSPOp0A (); + + DSP1.out_count = 8; + DSP1.output [0] = (uint8) (Op0AA&0xFF); + DSP1.output [2] = (uint8) (Op0AB&0xFF); + DSP1.output [4] = (uint8) (Op0AC&0xFF); + DSP1.output [6] = (uint8) (Op0AD&0xFF); + DSP1.output [1] = (uint8) ((Op0AA>>8)&0xFF); + DSP1.output [3] = (uint8) ((Op0AB>>8)&0xFF); + DSP1.output [5] = (uint8) ((Op0AC>>8)&0xFF); + DSP1.output [7] = (uint8) ((Op0AD>>8)&0xFF); + DSP1.in_index=0; + break; + + case 0x16: + case 0x26: + case 0x36: + case 0x06: // Project object + Op06X = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op06Y = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op06Z = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp06 (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op06H&0xff); + DSP1.output [1] = (uint8) ((Op06H>>8)&0xFF); + DSP1.output [2] = (uint8) (Op06V&0xFF); + DSP1.output [3] = (uint8) ((Op06V>>8)&0xFF); + DSP1.output [4] = (uint8) (Op06S&0xFF); + DSP1.output [5] = (uint8) ((Op06S>>8)&0xFF); + break; + + case 0x1e: + case 0x2e: + case 0x3e: + case 0x0e: // Target + Op0EH = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op0EV = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + + DSPOp0E (); + + DSP1.out_count = 4; + DSP1.output [0] = (uint8) (Op0EX&0xFF); + DSP1.output [1] = (uint8) ((Op0EX>>8)&0xFF); + DSP1.output [2] = (uint8) (Op0EY&0xFF); + DSP1.output [3] = (uint8) ((Op0EY>>8)&0xFF); + break; + + // Extra commands used by Pilot Wings + case 0x05: + case 0x35: + case 0x31: + case 0x01: // Set attitude matrix A + Op01m = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op01Zr = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op01Yr = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op01Xr = (int16) (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + + DSPOp01 (); + break; + + case 0x15: + case 0x11: // Set attitude matrix B + Op11m = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op11Zr = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op11Yr = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op11Xr = (int16) (DSP1.parameters [7]|(DSP1.parameters[7]<<8)); + + DSPOp11 (); + break; + + case 0x25: + case 0x21: // Set attitude matrix C + Op21m = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op21Zr = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op21Yr = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op21Xr = (int16) (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + + DSPOp21 (); + break; + + case 0x09: + case 0x39: + case 0x3d: + case 0x0d: // Objective matrix A + Op0DX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op0DY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op0DZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp0D (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op0DF&0xFF); + DSP1.output [1] = (uint8) ((Op0DF>>8)&0xFF); + DSP1.output [2] = (uint8) (Op0DL&0xFF); + DSP1.output [3] = (uint8) ((Op0DL>>8)&0xFF); + DSP1.output [4] = (uint8) (Op0DU&0xFF); + DSP1.output [5] = (uint8) ((Op0DU>>8)&0xFF); + break; + + case 0x19: + case 0x1d: // Objective matrix B + Op1DX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op1DY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op1DZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp1D (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op1DF&0xFF); + DSP1.output [1] = (uint8) ((Op1DF>>8)&0xFF); + DSP1.output [2] = (uint8) (Op1DL&0xFF); + DSP1.output [3] = (uint8) ((Op1DL>>8)&0xFF); + DSP1.output [4] = (uint8) (Op1DU&0xFF); + DSP1.output [5] = (uint8) ((Op1DU>>8)&0xFF); + break; + + case 0x29: + case 0x2d: // Objective matrix C + Op2DX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op2DY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op2DZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp2D (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op2DF&0xFF); + DSP1.output [1] = (uint8) ((Op2DF>>8)&0xFF); + DSP1.output [2] = (uint8) (Op2DL&0xFF); + DSP1.output [3] = (uint8) ((Op2DL>>8)&0xFF); + DSP1.output [4] = (uint8) (Op2DU&0xFF); + DSP1.output [5] = (uint8) ((Op2DU>>8)&0xFF); + break; + + case 0x33: + case 0x03: // Subjective matrix A + Op03F = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op03L = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op03U = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp03 (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op03X&0xFF); + DSP1.output [1] = (uint8) ((Op03X>>8)&0xFF); + DSP1.output [2] = (uint8) (Op03Y&0xFF); + DSP1.output [3] = (uint8) ((Op03Y>>8)&0xFF); + DSP1.output [4] = (uint8) (Op03Z&0xFF); + DSP1.output [5] = (uint8) ((Op03Z>>8)&0xFF); + break; + + case 0x13: // Subjective matrix B + Op13F = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op13L = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op13U = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp13 (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op13X&0xFF); + DSP1.output [1] = (uint8) ((Op13X>>8)&0xFF); + DSP1.output [2] = (uint8) (Op13Y&0xFF); + DSP1.output [3] = (uint8) ((Op13Y>>8)&0xFF); + DSP1.output [4] = (uint8) (Op13Z&0xFF); + DSP1.output [5] = (uint8) ((Op13Z>>8)&0xFF); + break; + + case 0x23: // Subjective matrix C + Op23F = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op23L = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op23U = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp23 (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op23X&0xFF); + DSP1.output [1] = (uint8) ((Op23X>>8)&0xFF); + DSP1.output [2] = (uint8) (Op23Y&0xFF); + DSP1.output [3] = (uint8) ((Op23Y>>8)&0xFF); + DSP1.output [4] = (uint8) (Op23Z&0xFF); + DSP1.output [5] = (uint8) ((Op23Z>>8)&0xFF); + break; + + case 0x3b: + case 0x0b: + Op0BX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op0BY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op0BZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp0B (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op0BS&0xFF); + DSP1.output [1] = (uint8) ((Op0BS>>8)&0xFF); + break; + + case 0x1b: + Op1BX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op1BY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op1BZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp1B (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op1BS&0xFF); + DSP1.output [1] = (uint8) ((Op1BS>>8)&0xFF); + break; + + case 0x2b: + Op2BX = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op2BY = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op2BZ = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + + DSPOp2B (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8) (Op2BS&0xFF); + DSP1.output [1] = (uint8) ((Op2BS>>8)&0xFF); + break; + + case 0x34: + case 0x14: + Op14Zr = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + Op14Xr = (int16) (DSP1.parameters [2]|(DSP1.parameters[3]<<8)); + Op14Yr = (int16) (DSP1.parameters [4]|(DSP1.parameters[5]<<8)); + Op14U = (int16) (DSP1.parameters [6]|(DSP1.parameters[7]<<8)); + Op14F = (int16) (DSP1.parameters [8]|(DSP1.parameters[9]<<8)); + Op14L = (int16) (DSP1.parameters [10]|(DSP1.parameters[11]<<8)); + + DSPOp14 (); + + DSP1.out_count = 6; + DSP1.output [0] = (uint8) (Op14Zrr&0xFF); + DSP1.output [1] = (uint8) ((Op14Zrr>>8)&0xFF); + DSP1.output [2] = (uint8) (Op14Xrr&0xFF); + DSP1.output [3] = (uint8) ((Op14Xrr>>8)&0xFF); + DSP1.output [4] = (uint8) (Op14Yrr&0xFF); + DSP1.output [5] = (uint8) ((Op14Yrr>>8)&0xFF); + break; + + case 0x27: + case 0x2F: + Op2FUnknown = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + + DSPOp2F (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8)(Op2FSize&0xFF); + DSP1.output [1] = (uint8)((Op2FSize>>8)&0xFF); + break; + + + case 0x07: + case 0x0F: + Op0FRamsize = (int16) (DSP1.parameters [0]|(DSP1.parameters[1]<<8)); + + DSPOp0F (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint8)(Op0FPass&0xFF); + DSP1.output [1] = (uint8)((Op0FPass>>8)&0xFF); + break; + + default: + break; + } + } + } + } + } +} + +uint8 DSP1GetByte(uint16 address) +{ + uint8 t; + if ((address & 0xf000) == 0x6000 || +// (address >= 0x8000 && address < 0xc000)) + (address&0x7fff) < 0x4000) + { + if (DSP1.out_count) + { + //if ((address & 1) == 0) + t = (uint8) DSP1.output [DSP1.out_index]; + //else + //{ + // t = (uint8) (DSP1.output [DSP1.out_index] >> 8); + DSP1.out_index++; + if (--DSP1.out_count == 0) + { + if (DSP1.command == 0x1a || DSP1.command == 0x0a) + { + DSPOp0A (); + DSP1.out_count = 8; + DSP1.out_index = 0; + DSP1.output [0] = (Op0AA&0xFF); + DSP1.output [1] = (Op0AA>>8)&0xFF; + DSP1.output [2] = (Op0AB&0xFF); + DSP1.output [3] = (Op0AB>>8)&0xFF; + DSP1.output [4] = (Op0AC&0xFF); + DSP1.output [5] = (Op0AC>>8)&0xFF; + DSP1.output [6] = (Op0AD&0xFF); + DSP1.output [7] = (Op0AD>>8)&0xFF; + } + if(DSP1.command==0x1f) + { + if((DSP1.out_index%2)!=0) + { + t=(uint8)DSP1ROM[DSP1.out_index>>1]; + } + else + { + t=DSP1ROM[DSP1.out_index>>1]>>8; + } + } + } + DSP1.waiting4command = TRUE; + //} + } + else + { + // Top Gear 3000 requires this value.... + // if(4==Settings.DSPVersion) + t = 0xff; + //Ballz3d requires this one: + // else t = 0x00; + } + } + else t = 0x80; + return t; +} + +void DSP2SetByte(uint8 byte, uint16 address) +{ + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if (DSP1.waiting4command) + { + DSP1.command = byte; + DSP1.in_index = 0; + DSP1.waiting4command = FALSE; +// DSP1.first_parameter = TRUE; +// printf("Op%02X\n",byte); + switch (byte) + { + case 0x01:DSP1.in_count=32;break; + case 0x03:DSP1.in_count=1;break; + case 0x05:DSP1.in_count=1;break; + case 0x09:DSP1.in_count=4;break; + case 0x06:DSP1.in_count=1;break; + case 0x0D:DSP1.in_count=2;break; + default: + printf("Op%02X\n",byte); + case 0x0f:DSP1.in_count=0;break; + } + } + else + { + DSP1.parameters [DSP1.in_index] = byte; +// DSP1.first_parameter = FALSE; + DSP1.in_index++; + } + + if (DSP1.in_count==DSP1.in_index) + { + //DSP1.parameters [DSP1.in_index] |= (byte << 8); + // Actually execute the command + DSP1.waiting4command = TRUE; + DSP1.out_index = 0; + switch (DSP1.command) + { + case 0x0D: + if(DSP2Op0DHasLen) + { + DSP2Op0DHasLen=false; + DSP1.out_count=DSP2Op0DOutLen; + //execute Op5 + DSP2_Op0D(); + } + else + { + DSP2Op0DInLen=DSP1.parameters[0]; + DSP2Op0DOutLen=DSP1.parameters[1]; + DSP1.in_index=0; + DSP1.in_count=(DSP2Op0DInLen+1)>>1; + DSP2Op0DHasLen=true; + if(byte) + DSP1.waiting4command=false; + } + break; + case 0x06: + if(DSP2Op06HasLen) + { + DSP2Op06HasLen=false; + DSP1.out_count=DSP2Op06Len; + //execute Op5 + DSP2_Op06(); + } + else + { + DSP2Op06Len=DSP1.parameters[0]; + DSP1.in_index=0; + DSP1.in_count=DSP2Op06Len; + DSP2Op06HasLen=true; + if(byte) + DSP1.waiting4command=false; + } + break; + case 0x01: + DSP1.out_count=32; + DSP2_Op01(); + break; + case 0x09: + // Multiply - don't yet know if this is signed or unsigned + DSP2Op09Word1 = DSP1.parameters[0] | (DSP1.parameters[1]<<8); + DSP2Op09Word2 = DSP1.parameters[2] | (DSP1.parameters[3]<<8); + DSP1.out_count=4; +#ifdef FAST_LSB_WORD_ACCESS + *(uint32 *)DSP1.output = DSP2Op09Word1 * DSP2Op09Word2; +#else + uint32 temp; + temp=DSP2Op09Word1 * DSP2Op09Word2; + DSP1.output[0]=temp&0xFF; + DSP1.output[1]=(temp>>8)&0xFF; + DSP1.output[2]=(temp>>16)&0xFF; + DSP1.output[3]=(temp>>24)&0xFF; +#endif + break; + case 0x05: + if(DSP2Op05HasLen) + { + DSP2Op05HasLen=false; + DSP1.out_count=DSP2Op05Len; + //execute Op5 + DSP2_Op05(); + } + else + { + DSP2Op05Len=DSP1.parameters[0]; + DSP1.in_index=0; + DSP1.in_count=2*DSP2Op05Len; + DSP2Op05HasLen=true; + if(byte) + DSP1.waiting4command=false; + } + break; + + case 0x03: + DSP2Op05Transparent= DSP1.parameters[0]; + //DSP2Op03(); + break; + case 0x0f: + default: + break; + } + } + } +} + +uint8 DSP2GetByte(uint16 address) +{ + uint8 t; + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if (DSP1.out_count) + { + t = (uint8) DSP1.output [DSP1.out_index]; + DSP1.out_index++; + if(DSP1.out_count==DSP1.out_index) + DSP1.out_count=0; + } + else + { + t = 0xff; + } + } + else t = 0x80; + return t; +} + +struct SDSP4 { + bool8 waiting4command; + bool8 half_command; + uint16 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters [512]; + uint8 output [512]; +}; + +SDSP4 DSP4; + +#include "dsp4emu.cpp" + +bool DSP4_init=FALSE; + +void DSP4SetByte(uint8 byte, uint16 address) +{ + if(!DSP4_init) + { + // bootup + DSP4.waiting4command=1; + DSP4_init=TRUE; + } + + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if(DSP4.out_index>16); + } + break; + + // unknown: horizontal mapping command + case 0x0011: + { + int16 a,b,c,d,m; + + a = DSP4_READ_WORD(6); + b = DSP4_READ_WORD(4); + c = DSP4_READ_WORD(2); + d = DSP4_READ_WORD(0); + + DSP4_UnknownOP11(a,b,c,d,m); + + DSP4.out_count = 2; + DSP4_WRITE_WORD(0,m); + break; + } + + // track projection + case 0x0001: DSP4_Op01(); break; + + // track projection (pass 2) + case 0x0007: DSP4_Op07(); break; + + // zone projections (fuel/repair/lap/teleport/...) + case 0x0008: DSP4_Op08(); break; + + // sprite transformation + case 0x0009: DSP4_Op09(); break; + + // fast track projection + case 0x000D: DSP4_Op0D(); break; + + // single-player selection + case 0x0003: DSP4_Op03(); break; + + // clear OAM + case 0x0005: + { + op06_index = 0; + op06_offset = 0; + for( int lcv=0; lcv<32; lcv++ ) + op06_OAM[lcv] = 0; + break; + } + + // multi-player selection + case 0x000E: DSP4_Op0E(); break; + +#undef PRINT + + // transfer OAM + case 0x0006: + { + DSP4.out_count = 32; + for( int lcv=0; lcv<32; lcv++ ) + DSP4.output[lcv] = op06_OAM[lcv]; + } + break; + + // unknown + case 0x000A: + { + int16 in1a = DSP4_READ_WORD(0); + int16 in2a = DSP4_READ_WORD(2); + int16 in3a = DSP4_READ_WORD(4); + int16 out1a,out2a,out3a,out4a; + + // NOTE: Snes9x only! + // For some odd reason, the input nybbles are reversed + + DSP4_Op0A(in2a,out1a,out2a,out3a,out4a); + + DSP4.out_count=8; + + // Hack: Reverse the outputs for now to compensate + // Otherwise the AI gets really flaky + DSP4_WRITE_WORD(0,out2a); + DSP4_WRITE_WORD(2,out1a); + DSP4_WRITE_WORD(4,out4a); + DSP4_WRITE_WORD(6,out3a); + } + break; + + // set OAM + case 0x000B: + { + int16 sp_x = DSP4_READ_WORD(0); + int16 sp_y = DSP4_READ_WORD(2); + int16 oam = DSP4_READ_WORD(4); + + if ((sp_y < 0) || ((sp_y & 0x01ff) < 0x00eb)) + { + short Row = (sp_y >> 3) & 0x1f; + + if (RowCount[Row] < MaxTilesPerRow) + { + RowCount[Row]++; + + // yield OAM output + DSP4.out_count = 6; + DSP4_WRITE_WORD(0,1); + + // pack OAM data: x,y,name,attr + DSP4.output[2] = sp_x & 0xff; + DSP4.output[3] = sp_y & 0xff; + DSP4_WRITE_WORD(4,oam); + + // OAM: size,msb data + DSP4_Op06(0,0); + } + } + } + break; + + default: break; + } + } + } +} + +uint8 DSP4GetByte(uint16 address) +{ + uint8 t; + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if (DSP4.out_count) + { + t = (uint8) DSP4.output [DSP4.out_index]; + DSP4.out_index++; + if(DSP4.out_count==DSP4.out_index) + DSP4.out_count=0; + } + else + t = 0xff; + } + else + { + t = 0x80; + } + + return t; +} +#endif diff --git a/src/dsp1_old.cpp b/src/dsp1_old.cpp new file mode 100644 index 0000000..b64dd9d --- /dev/null +++ b/src/dsp1_old.cpp @@ -0,0 +1,529 @@ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code + * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. + * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. + * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). + * + * DOS port code contains the works of other authors. See headers in + * individual files. + * + * Snes9x homepage: http://www.snes9x.com + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ +#include "snes9x.h" +#include "dsp1_old.h" +#include "missing.h" +#include "memmap.h" +#include + +#include "dsp1emu_old.c" + +void S9xInitDSP1 () +{ +//puts("S9xInitDSP1"); + static bool8_32 init = FALSE; + + if (!init) + { + InitDSP (); + init = TRUE; + } +} + +void S9xResetDSP1 () +{ +//puts("S9xResetDSP1"); + S9xInitDSP1 (); + + DSP1.waiting4command = TRUE; + DSP1.in_count = 0; + DSP1.out_count = 0; + DSP1.in_index = 0; + DSP1.out_index = 0; + DSP1.first_parameter = TRUE; +} + +uint8 S9xGetDSP (uint16 address) +{ +//printf("S9xGetDSP %p\n",address);fflush(stdout); + uint8 t; + + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if (DSP1.out_count) + { + if ((address & 1) == 0) + t = (uint8) DSP1.output [DSP1.out_index]; + else + { + t = (uint8) (DSP1.output [DSP1.out_index] >> 8); + DSP1.out_index++; + if (--DSP1.out_count == 0) + { + if (DSP1.command == 0x1a || DSP1.command == 0x0a) + { + DSPOp0A (); + DSP1.out_count = 4; + DSP1.out_index = 0; + DSP1.output [0] = Op0AA; + DSP1.output [1] = Op0AB; + DSP1.output [2] = Op0AC; + DSP1.output [3] = Op0AD; + } + } + DSP1.waiting4command = TRUE; + } + } + else + { + // Top Gear 3000 requires this value.... + // if(4==Settings.DSPVersion) + t = 0xff; + //Ballz3d requires this one: + // else t = 0x00; + } + } + else t = 0x80; + +//printf("\tS9xGetDSP %p=t\n",address,t);fflush(stdout); + return (t); +} + +void S9xSetDSP (uint8 byte, uint16 address) +{ +//printf("S9xGetDSP %x,%p\n",byte,address);fflush(stdout); + if ((address & 0xf000) == 0x6000 || + (address >= 0x8000 && address < 0xc000)) + { + if ((address & 1) == 0) + { + if (DSP1.waiting4command) + { + DSP1.command = byte; + DSP1.in_index = 0; + DSP1.waiting4command = FALSE; + DSP1.first_parameter = TRUE; + + // Mario Kart uses 0x00, 0x02, 0x06, 0x0c, 0x28, 0x0a + switch (byte) + { + case 0x00: DSP1.in_count = 2; break; + case 0x10: DSP1.in_count = 2; break; + case 0x04: DSP1.in_count = 2; break; + case 0x08: DSP1.in_count = 3; break; + case 0x18: DSP1.in_count = 4; break; + case 0x28: DSP1.in_count = 3; break; + case 0x0c: DSP1.in_count = 3; break; + case 0x1c: DSP1.in_count = 6; break; + case 0x02: DSP1.in_count = 7; break; + case 0x0a: DSP1.in_count = 1; break; + case 0x1a: DSP1.in_count = 1; break; + case 0x06: DSP1.in_count = 3; break; + case 0x0e: DSP1.in_count = 2; break; + case 0x01: DSP1.in_count = 4; break; + case 0x11: DSP1.in_count = 4; break; + case 0x21: DSP1.in_count = 4; break; + case 0x0d: DSP1.in_count = 3; break; + case 0x1d: DSP1.in_count = 3; break; + case 0x2d: DSP1.in_count = 3; break; + case 0x03: DSP1.in_count = 3; break; + case 0x13: DSP1.in_count = 3; break; + case 0x23: DSP1.in_count = 3; break; + case 0x0b: DSP1.in_count = 3; break; + case 0x1b: DSP1.in_count = 3; break; + case 0x2b: DSP1.in_count = 3; break; + case 0x14: DSP1.in_count = 6; break; + case 0x0f: DSP1.in_count = 1; break; +// case 0x80: DSP1.in_count = 2; break; + default: + //printf("Op%02X\n",byte); + case 0x80: + DSP1.in_count = 0; + DSP1.waiting4command = TRUE; + DSP1.first_parameter = TRUE; + break; + } + } + else + { + DSP1.parameters [DSP1.in_index] = byte; + DSP1.first_parameter = FALSE; + } + } + else + { + if (DSP1.waiting4command || + (DSP1.first_parameter && byte == 0x80)) + { + DSP1.waiting4command = TRUE; + DSP1.first_parameter = FALSE; + } + else if (DSP1.first_parameter) + { + } + else + { + if (DSP1.in_count) + { + DSP1.parameters [DSP1.in_index] |= (byte << 8); + if (--DSP1.in_count == 0) + { + // Actually execute the command + DSP1.waiting4command = TRUE; + DSP1.out_index = 0; + switch (DSP1.command) + { + case 0x00: // Multiple + Op00Multiplicand = (int16) DSP1.parameters [0]; + Op00Multiplier = (int16) DSP1.parameters [1]; + + DSPOp00 (); + + DSP1.out_count = 1; + DSP1.output [0] = Op00Result; + break; + + case 0x10: // Inverse + Op10Coefficient = (int16) DSP1.parameters [0]; + Op10Exponent = (int16) DSP1.parameters [1]; + + DSPOp10 (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint16) (int16) Op10CoefficientR; + DSP1.output [1] = (uint16) (int16) Op10ExponentR; + break; + + case 0x04: // Sin and Cos of angle + Op04Angle = (int16) DSP1.parameters [0]; + Op04Radius = (uint16) DSP1.parameters [1]; + + DSPOp04 (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint16) Op04Sin; + DSP1.output [1] = (uint16) Op04Cos; + break; + + case 0x08: // Radius + Op08X = (int16) DSP1.parameters [0]; + Op08Y = (int16) DSP1.parameters [1]; + Op08Z = (int16) DSP1.parameters [2]; + + DSPOp08 (); + + DSP1.out_count = 2; + DSP1.output [0] = (int16) Op08Ll; + DSP1.output [1] = (int16) Op08Lh; + break; + + case 0x18: // Range + + Op18X = (int16) DSP1.parameters [0]; + Op18Y = (int16) DSP1.parameters [1]; + Op18Z = (int16) DSP1.parameters [2]; + Op18R = (int16) DSP1.parameters [3]; + + DSPOp18 (); + + DSP1.out_count = 1; + DSP1.output [0] = Op18D; + break; + + case 0x28: // Distance (vector length) + Op28X = (int16) DSP1.parameters [0]; + Op28Y = (int16) DSP1.parameters [1]; + Op28Z = (int16) DSP1.parameters [2]; + + DSPOp28 (); + + DSP1.out_count = 1; + DSP1.output [0] = (uint16) Op28R; + break; + + case 0x0c: // Rotate (2D rotate) + Op0CA = (int16) DSP1.parameters [0]; + Op0CX1 = (int16) DSP1.parameters [1]; + Op0CY1 = (int16) DSP1.parameters [2]; + + DSPOp0C (); + + DSP1.out_count = 2; + DSP1.output [0] = (uint16) Op0CX2; + DSP1.output [1] = (uint16) Op0CY2; + break; + + case 0x1c: // Polar (3D rotate) + Op1CZ = DSP1.parameters [0]; + Op1CX = DSP1.parameters [1]; + Op1CY = DSP1.parameters [2]; + Op1CXBR = DSP1.parameters [3]; + Op1CYBR = DSP1.parameters [4]; + Op1CZBR = DSP1.parameters [5]; + + DSPOp1C (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op1CXAR; + DSP1.output [1] = (uint16) Op1CYAR; + DSP1.output [2] = (uint16) Op1CZAR; + break; + + case 0x02: // Parameter (Projection) + Op02FX = DSP1.parameters [0]; + Op02FY = DSP1.parameters [1]; + Op02FZ = DSP1.parameters [2]; + Op02LFE = DSP1.parameters [3]; + Op02LES = DSP1.parameters [4]; + Op02AAS = DSP1.parameters [5]; + Op02AZS = DSP1.parameters [6]; + + DSPOp02 (); + + DSP1.out_count = 4; + DSP1.output [0] = Op02VOF; + DSP1.output [1] = Op02VVA; + DSP1.output [2] = Op02CX; + DSP1.output [3] = Op02CY; + break; + + case 0x1a: // Raster mode 7 matrix data + case 0x0a: + Op0AVS = DSP1.parameters [0]; + + DSPOp0A (); + + DSP1.out_count = 4; + DSP1.output [0] = Op0AA; + DSP1.output [1] = Op0AB; + DSP1.output [2] = Op0AC; + DSP1.output [3] = Op0AD; + break; + + case 0x06: // Project object + Op06X = (int16) DSP1.parameters [0]; + Op06Y = (int16) DSP1.parameters [1]; + Op06Z = (int16) DSP1.parameters [2]; + + DSPOp06 (); + + DSP1.out_count = 3; + DSP1.output [0] = Op06H; + DSP1.output [1] = Op06V; + DSP1.output [2] = Op06S; + break; + + case 0x0e: // Target + Op0EH = (int16) DSP1.parameters [0]; + Op0EV = (int16) DSP1.parameters [1]; + + DSPOp0E (); + + DSP1.out_count = 2; + DSP1.output [0] = Op0EX; + DSP1.output [1] = Op0EY; + break; + + // Extra commands used by Pilot Wings + case 0x01: // Set attitude matrix A + Op01m = (int16) DSP1.parameters [0]; + Op01Zr = (int16) DSP1.parameters [1]; + Op01Xr = (int16) DSP1.parameters [2]; + Op01Yr = (int16) DSP1.parameters [3]; + + DSPOp01 (); + break; + + case 0x11: // Set attitude matrix B + Op11m = (int16) DSP1.parameters [0]; + Op11Zr = (int16) DSP1.parameters [1]; + Op11Xr = (int16) DSP1.parameters [2]; + Op11Yr = (int16) DSP1.parameters [3]; + + DSPOp11 (); + break; + + case 0x21: // Set attitude matrix C + Op21m = (int16) DSP1.parameters [0]; + Op21Zr = (int16) DSP1.parameters [1]; + Op21Xr = (int16) DSP1.parameters [2]; + Op21Yr = (int16) DSP1.parameters [3]; + + DSPOp21 (); + break; + + case 0x0d: // Objective matrix A + Op0DX = (int16) DSP1.parameters [0]; + Op0DY = (int16) DSP1.parameters [1]; + Op0DZ = (int16) DSP1.parameters [2]; + + DSPOp0D (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op0DF; + DSP1.output [1] = (uint16) Op0DL; + DSP1.output [2] = (uint16) Op0DU; + break; + + case 0x1d: // Objective matrix B + Op1DX = (int16) DSP1.parameters [0]; + Op1DY = (int16) DSP1.parameters [1]; + Op1DZ = (int16) DSP1.parameters [2]; + + DSPOp1D (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op1DF; + DSP1.output [1] = (uint16) Op1DL; + DSP1.output [2] = (uint16) Op1DU; + break; + + case 0x2d: // Objective matrix C + Op2DX = (int16) DSP1.parameters [0]; + Op2DY = (int16) DSP1.parameters [1]; + Op2DZ = (int16) DSP1.parameters [2]; + + DSPOp2D (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op2DF; + DSP1.output [1] = (uint16) Op2DL; + DSP1.output [2] = (uint16) Op2DU; + break; + + case 0x03: // Subjective matrix A + Op03F = (int16) DSP1.parameters [0]; + Op03L = (int16) DSP1.parameters [1]; + Op03U = (int16) DSP1.parameters [2]; + + DSPOp03 (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op03X; + DSP1.output [1] = (uint16) Op03Y; + DSP1.output [2] = (uint16) Op03Z; + break; + + case 0x13: // Subjective matrix B + Op13F = (int16) DSP1.parameters [0]; + Op13L = (int16) DSP1.parameters [1]; + Op13U = (int16) DSP1.parameters [2]; + + DSPOp13 (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op13X; + DSP1.output [1] = (uint16) Op13Y; + DSP1.output [2] = (uint16) Op13Z; + break; + + case 0x23: // Subjective matrix C + Op23F = (int16) DSP1.parameters [0]; + Op23L = (int16) DSP1.parameters [1]; + Op23U = (int16) DSP1.parameters [2]; + + DSPOp23 (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op23X; + DSP1.output [1] = (uint16) Op23Y; + DSP1.output [2] = (uint16) Op23Z; + break; + + case 0x0b: + Op0BX = (int16) DSP1.parameters [0]; + Op0BY = (int16) DSP1.parameters [1]; + Op0BZ = (int16) DSP1.parameters [2]; + + DSPOp0B (); + + DSP1.out_count = 1; + DSP1.output [0] = (uint16) Op0BS; + break; + + case 0x1b: + Op1BX = (int16) DSP1.parameters [0]; + Op1BY = (int16) DSP1.parameters [1]; + Op1BZ = (int16) DSP1.parameters [2]; + + DSPOp1B (); + + DSP1.out_count = 1; + DSP1.output [0] = (uint16) Op1BS; + break; + + case 0x2b: + Op2BX = (int16) DSP1.parameters [0]; + Op2BY = (int16) DSP1.parameters [1]; + Op2BZ = (int16) DSP1.parameters [2]; + + DSPOp0B (); + + DSP1.out_count = 1; + DSP1.output [0] = (uint16) Op2BS; + break; + + case 0x14: // Gyrate + Op14Zr = (int16) DSP1.parameters [0]; + Op14Xr = (int16) DSP1.parameters [1]; + Op14Yr = (int16) DSP1.parameters [2]; + Op14U = (int16) DSP1.parameters [3]; + Op14F = (int16) DSP1.parameters [4]; + Op14L = (int16) DSP1.parameters [5]; + + DSPOp14 (); + + DSP1.out_count = 3; + DSP1.output [0] = (uint16) Op14Zrr; + DSP1.output [1] = (uint16) Op14Xrr; + DSP1.output [2] = (uint16) Op14Yrr; + break; + + case 0x0F: + Op0FRamsize = (int16) DSP1.parameters [0]; + + DSPOp0F (); + + DSP1.out_count = 1; + DSP1.output [0] = (uint16) Op0FPass; + break; + + default: + break; + } + } + else DSP1.in_index++; + } + } + } + } +} diff --git a/src/dsp1emu.c b/src/dsp1emu.c new file mode 100644 index 0000000..6b4172a --- /dev/null +++ b/src/dsp1emu.c @@ -0,0 +1,1397 @@ +//Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +// +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU General Public License +//as published by the Free Software Foundation; either +//version 2 of the License, or (at your option) any later +//version. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//GNU General Public License for more details. +// +//You should have received a copy of the GNU General Public License +//along with this program; if not, write to the Free Software +//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +//#define __ZSNES__ + +#if (defined __ZSNES__ && __LINUX__) +#include "../gblhdr.h" +#else + +#include +#include +#include +#include +#include +#endif +//#define DebugDSP1 + +// uncomment some lines to test +//#define printinfo +//#define debug06 + +#define __OPT__ +#define __OPT06__ + +#ifdef DebugDSP1 + +FILE * LogFile = NULL; + +void Log_Message (char *Message, ...) +{ + char Msg[400]; + va_list ap; + + va_start(ap,Message); + vsprintf(Msg,Message,ap ); + va_end(ap); + + strcat(Msg,"\r\n\0"); + fwrite(Msg,strlen(Msg),1,LogFile); + fflush (LogFile); +} + +void Start_Log (void) +{ + char LogFileName[255]; +// [4/15/2001] char *p; + + strcpy(LogFileName,"dsp1emu.log\0"); + + LogFile = fopen(LogFileName,"wb"); +} + +void Stop_Log (void) +{ + if (LogFile) + { + fclose(LogFile); + LogFile = NULL; + } +} + +#endif + +const unsigned short DSP1ROM[1024] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, + 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, + 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, + 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, + 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, + 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, + 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, + 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, + 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, + 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, + 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, + 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, + 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, + 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, + 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, + 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, + 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, + 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, + 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, + 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, + 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, + 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, + 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, + 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, + 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, + 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, + 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, + 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, + 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, + 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, + 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, + 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, + 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, + 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, + 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, + 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, + 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, + 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, + 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, + 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, + 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, + 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, + 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, + 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, + 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, + 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, + 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, + 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, + 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, + 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, + 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, + 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, + 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, + 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, + 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, + 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, + 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, + 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, + 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, + 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, + 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, + 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, + 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, + 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, + 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, + 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, + 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, + 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, + 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, + 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, + 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, + 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, + 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, + 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, + 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, + 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, + 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; + +/***************************************************************************\ +* Math tables * +\***************************************************************************/ + +#define INCR 2048 +#define Angle(x) (((x)/(65536/INCR)) & (INCR-1)) +#define Cos(x) ((double) CosTable2[x]) +#define Sin(x) ((double) SinTable2[x]) +#ifdef PI +#undef PI +#endif +#define PI 3.1415926535897932384626433832795 +double CosTable2[INCR]; +double SinTable2[INCR]; + + +double Atan(double x) +{ + if ((x>=1) || (x<=1)) + return (x/(1+0.28*x*x)); + else + return (PI/2 - Atan(1/x)); +} + +#ifdef __ZSNES__ +/***************************************************************************\ +* C4 C code * +\***************************************************************************/ + +short C4WFXVal; +short C4WFYVal; +short C4WFZVal; +short C4WFX2Val; +short C4WFY2Val; +short C4WFDist; +short C4WFScale; +double tanval; +double c4x,c4y,c4z; +double c4x2,c4y2,c4z2; + +void C4TransfWireFrame() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal-0x95; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/(0x90*(c4z+0x95))*0x95); + C4WFYVal=(short)(c4y*C4WFScale/(0x90*(c4z+0x95))*0x95); +} + +void C4TransfWireFrame2() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/0x100); + C4WFYVal=(short)(c4y*C4WFScale/0x100); +} + +void C4CalcWireFrame() +{ + C4WFXVal=C4WFX2Val-C4WFXVal; + C4WFYVal=C4WFY2Val-C4WFYVal; + if (abs(C4WFXVal)>abs(C4WFYVal)){ + C4WFDist=abs(C4WFXVal)+1; + C4WFYVal=(256*(long)C4WFYVal)/abs(C4WFXVal); + if (C4WFXVal<0) C4WFXVal=-256; + else C4WFXVal=256; + } + else + if (C4WFYVal!=0) { + C4WFDist=abs(C4WFYVal)+1; + C4WFXVal=(256*(long)C4WFXVal)/abs(C4WFYVal); + if (C4WFYVal<0) C4WFYVal=-256; + else C4WFYVal=256; + } + else C4WFDist=0; +} + +short C41FXVal; +short C41FYVal; +short C41FAngleRes; +short C41FDist; +short C41FDistVal; + +void C4Op1F() +{ + if (C41FXVal == 0) { + if (C41FYVal>0) C41FAngleRes=0x80; + else C41FAngleRes=0x180; + } + else { + tanval = ((double)C41FYVal)/((double)C41FXVal); + C41FAngleRes=(short)(atan(tanval)/(PI*2)*512); + C41FAngleRes=C41FAngleRes; + if (C41FXVal<0) C41FAngleRes+=0x100; + C41FAngleRes&=0x1FF; + } +} + +void C4Op15() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + C41FDist=(short)tanval; +} + +void C4Op0D() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + tanval=(double)C41FDistVal/tanval; + C41FYVal=(short)(((double)C41FYVal*tanval)*0.99); + C41FXVal=(short)(((double)C41FXVal*tanval)*0.98); +} +#endif + +/***************************************************************************\ +* DSP1 code * +\***************************************************************************/ + +void InitDSP(void) +{ +#ifdef __OPT__ + unsigned int i; + for (i=0; i> 15; + + #ifdef DebugDSP1 + Log_Message("OP00 MULT %d*%d/32768=%d",Op00Multiplicand,Op00Multiplier,Op00Result); + #endif +} + +short Op20Multiplicand; +short Op20Multiplier; +short Op20Result; + +void DSPOp20() +{ + Op20Result= Op20Multiplicand * Op20Multiplier >> 15; + Op20Result++; + + #ifdef DebugDSP1 + Log_Message("OP20 MULT %d*%d/32768=%d",Op20Multiplicand,Op20Multiplier,Op20Result); + #endif +} + +signed short Op10Coefficient; +signed short Op10Exponent; +signed short Op10CoefficientR; +signed short Op10ExponentR; + +void DSP1_Inverse(short Coefficient, short Exponent, short *iCoefficient, short *iExponent) +{ + // Step One: Division by Zero + if (Coefficient == 0x0000) + { + *iCoefficient = 0x7fff; + *iExponent = 0x002f; + } + else + { + short Sign = 1; + + // Step Two: Remove Sign + if (Coefficient < 0) + { + if (Coefficient < -32767) Coefficient = -32767; + Coefficient = -Coefficient; + Sign = -1; + } + + // Step Three: Normalize + while (Coefficient < 0x4000) + { + Coefficient <<= 1; + Exponent--; + } + + // Step Four: Special Case + if (Coefficient == 0x4000) + if (Sign == 1) *iCoefficient = 0x7fff; + else { + *iCoefficient = -0x4000; + Exponent--; + } + else { + // Step Five: Initial Guess + short i = DSP1ROM[((Coefficient - 0x4000) >> 7) + 0x0065]; + + // Step Six: Iterate "estimated" Newton's Method + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + + *iCoefficient = i * Sign; + } + + *iExponent = 1 - Exponent; + } +} + +void DSPOp10() +{ + DSP1_Inverse(Op10Coefficient, Op10Exponent, &Op10CoefficientR, &Op10ExponentR); + #ifdef DebugDSP1 + Log_Message("OP10 INV %d*2^%d = %d*2^%d", Op10Coefficient, Op10Exponent, Op10CoefficientR, Op10ExponentR); + #endif +} + +short Op04Angle; +short Op04Radius; +short Op04Sin; +short Op04Cos; + +const short DSP1_MulTable[256] = { + 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, + 0x0019, 0x001c, 0x001f, 0x0022, 0x0025, 0x0028, 0x002b, 0x002f, + 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, 0x0045, 0x0048, + 0x004b, 0x004e, 0x0051, 0x0054, 0x0057, 0x005b, 0x005e, 0x0061, + 0x0064, 0x0067, 0x006a, 0x006d, 0x0071, 0x0074, 0x0077, 0x007a, + 0x007d, 0x0080, 0x0083, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, + 0x0096, 0x0099, 0x009d, 0x00a0, 0x00a3, 0x00a6, 0x00a9, 0x00ac, + 0x00af, 0x00b3, 0x00b6, 0x00b9, 0x00bc, 0x00bf, 0x00c2, 0x00c5, + 0x00c9, 0x00cc, 0x00cf, 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00df, + 0x00e2, 0x00e5, 0x00e8, 0x00eb, 0x00ee, 0x00f1, 0x00f5, 0x00f8, + 0x00fb, 0x00fe, 0x0101, 0x0104, 0x0107, 0x010b, 0x010e, 0x0111, + 0x0114, 0x0117, 0x011a, 0x011d, 0x0121, 0x0124, 0x0127, 0x012a, + 0x012d, 0x0130, 0x0133, 0x0137, 0x013a, 0x013d, 0x0140, 0x0143, + 0x0146, 0x0149, 0x014d, 0x0150, 0x0153, 0x0156, 0x0159, 0x015c, + 0x015f, 0x0163, 0x0166, 0x0169, 0x016c, 0x016f, 0x0172, 0x0175, + 0x0178, 0x017c, 0x017f, 0x0182, 0x0185, 0x0188, 0x018b, 0x018e, + 0x0192, 0x0195, 0x0198, 0x019b, 0x019e, 0x01a1, 0x01a4, 0x01a8, + 0x01ab, 0x01ae, 0x01b1, 0x01b4, 0x01b7, 0x01ba, 0x01be, 0x01c1, + 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01d0, 0x01d4, 0x01d7, 0x01da, + 0x01dd, 0x01e0, 0x01e3, 0x01e6, 0x01ea, 0x01ed, 0x01f0, 0x01f3, + 0x01f6, 0x01f9, 0x01fc, 0x0200, 0x0203, 0x0206, 0x0209, 0x020c, + 0x020f, 0x0212, 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, + 0x0228, 0x022c, 0x022f, 0x0232, 0x0235, 0x0238, 0x023b, 0x023e, + 0x0242, 0x0245, 0x0248, 0x024b, 0x024e, 0x0251, 0x0254, 0x0258, + 0x025b, 0x025e, 0x0261, 0x0264, 0x0267, 0x026a, 0x026e, 0x0271, + 0x0274, 0x0277, 0x027a, 0x027d, 0x0280, 0x0284, 0x0287, 0x028a, + 0x028d, 0x0290, 0x0293, 0x0296, 0x029a, 0x029d, 0x02a0, 0x02a3, + 0x02a6, 0x02a9, 0x02ac, 0x02b0, 0x02b3, 0x02b6, 0x02b9, 0x02bc, + 0x02bf, 0x02c2, 0x02c6, 0x02c9, 0x02cc, 0x02cf, 0x02d2, 0x02d5, + 0x02d8, 0x02db, 0x02df, 0x02e2, 0x02e5, 0x02e8, 0x02eb, 0x02ee, + 0x02f1, 0x02f5, 0x02f8, 0x02fb, 0x02fe, 0x0301, 0x0304, 0x0307, + 0x030b, 0x030e, 0x0311, 0x0314, 0x0317, 0x031a, 0x031d, 0x0321}; + +const short DSP1_SinTable[256] = { + 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, + 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, + 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, + 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, + 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, + 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, + 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, + -0x0000, -0x0324, -0x0647, -0x096a, -0x0c8b, -0x0fab, -0x12c8, -0x15e2, + -0x18f8, -0x1c0b, -0x1f19, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33de, -0x36ba, -0x398c, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb4, -0x5ed7, -0x60ec, -0x62f2, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c24, -0x6dca, -0x6f5f, -0x70e2, -0x7255, -0x73b5, -0x7504, + -0x7641, -0x776c, -0x7884, -0x798a, -0x7a7d, -0x7b5d, -0x7c29, -0x7ce3, + -0x7d8a, -0x7e1d, -0x7e9d, -0x7f09, -0x7f62, -0x7fa7, -0x7fd8, -0x7ff6, + -0x7fff, -0x7ff6, -0x7fd8, -0x7fa7, -0x7f62, -0x7f09, -0x7e9d, -0x7e1d, + -0x7d8a, -0x7ce3, -0x7c29, -0x7b5d, -0x7a7d, -0x798a, -0x7884, -0x776c, + -0x7641, -0x7504, -0x73b5, -0x7255, -0x70e2, -0x6f5f, -0x6dca, -0x6c24, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f2, -0x60ec, -0x5ed7, -0x5cb4, + -0x5a82, -0x5842, -0x55f5, -0x539b, -0x5133, -0x4ebf, -0x4c3f, -0x49b4, + -0x471c, -0x447a, -0x41ce, -0x3f17, -0x3c56, -0x398c, -0x36ba, -0x33de, + -0x30fb, -0x2e11, -0x2b1f, -0x2826, -0x2528, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324}; + +short DSP1_Sin(short Angle) +{ + if (Angle < 0) { + if (Angle == -32768) return 0; + return -DSP1_Sin(-Angle); + } + int S = DSP1_SinTable[Angle >> 8] + (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[0x40 + (Angle >> 8)] >> 15); + if (S > 32767) S = 32767; + return (short) S; +} + +short DSP1_Cos(short Angle) +{ + if (Angle < 0) { + if (Angle == -32768) return -32768; + Angle = -Angle; + } + int S = DSP1_SinTable[0x40 + (Angle >> 8)] - (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[Angle >> 8] >> 15); + if (S < -32768) S = -32767; + return (short) S; +} + +void DSP1_Normalize(short m, short *Coefficient, short *Exponent) +{ + short i = 0x4000; + short e = 0; + + if (m < 0) + while ((m & i) && i) { + i >>= 1; + e++; + } + else + while (!(m & i) && i) { + i >>= 1; + e++; + } + + if (e > 0) + *Coefficient = m * DSP1ROM[0x21 + e] << 1; + else + *Coefficient = m; + + *Exponent -= e; +} + +void DSP1_NormalizeDouble(int Product, short *Coefficient, short *Exponent) +{ + short n = Product & 0x7fff; + short m = Product >> 15; + short i = 0x4000; + short e = 0; + + if (m < 0) + while ((m & i) && i) { + i >>= 1; + e++; + } + else + while (!(m & i) && i) { + i >>= 1; + e++; + } + + if (e > 0) + { + *Coefficient = m * DSP1ROM[0x0021 + e] << 1; + + if (e < 15) + *Coefficient += n * DSP1ROM[0x0040 - e] >> 15; + else + { + i = 0x4000; + + if (m < 0) + while ((n & i) && i) { + i >>= 1; + e++; + } + else + while (!(n & i) && i) { + i >>= 1; + e++; + } + + if (e > 15) + *Coefficient = n * DSP1ROM[0x0012 + e] << 1; + else + *Coefficient += n; + } + } + else + *Coefficient = m; + + *Exponent = e; +} + +short DSP1_Truncate(short C, short E) +{ + if (E > 0) { + if (C > 0) return 32767; else if (C < 0) return -32767; + } else { + if (E < 0) return C * DSP1ROM[0x0031 + E] >> 15; + } + return C; +} + +void DSPOp04() +{ + Op04Sin = DSP1_Sin(Op04Angle) * Op04Radius >> 15; + Op04Cos = DSP1_Cos(Op04Angle) * Op04Radius >> 15; +} + +short Op0CA; +short Op0CX1; +short Op0CY1; +short Op0CX2; +short Op0CY2; + +void DSPOp0C() +{ + Op0CX2 = (Op0CY1 * DSP1_Sin(Op0CA) >> 15) + (Op0CX1 * DSP1_Cos(Op0CA) >> 15); + Op0CY2 = (Op0CY1 * DSP1_Cos(Op0CA) >> 15) - (Op0CX1 * DSP1_Sin(Op0CA) >> 15); +} + +short CentreX; +short CentreY; +short VOffset; + +short VPlane_C; +short VPlane_E; + +// Azimuth and Zenith angles +short SinAas; +short CosAas; +short SinAzs; +short CosAzs; + +// Clipped Zenith angle +short SinAZS; +short CosAZS; +short SecAZS_C1; +short SecAZS_E1; +short SecAZS_C2; +short SecAZS_E2; + +const short MaxAZS_Exp[16] = { + 0x38b4, 0x38b7, 0x38ba, 0x38be, 0x38c0, 0x38c4, 0x38c7, 0x38ca, + 0x38ce, 0x38d0, 0x38d4, 0x38d7, 0x38da, 0x38dd, 0x38e0, 0x38e4 +}; + +void DSP1_Parameter(short Fx, short Fy, short Fz, short Lfe, short Les, short Aas, short Azs, short *Vof, short *Vva, short *Cx, short *Cy) +{ + short CSec, C, E; + + // Copy Zenith angle for clipping + short AZS = Azs; + + // Store Sin and Cos of Azimuth and Zenith angles + SinAas = DSP1_Sin(Aas); + CosAas = DSP1_Cos(Aas); + SinAzs = DSP1_Sin(Azs); + CosAzs = DSP1_Cos(Azs); + + // Center of Projection + CentreX = Fx + (Lfe * (SinAzs * -SinAas >> 15) >> 15); + CentreY = Fy + (Lfe * (SinAzs * CosAas >> 15) >> 15); + + E = 0; + DSP1_Normalize(Fz + (Lfe * (CosAzs * 0x7fff >> 15) >> 15), &C, &E); + + VPlane_C = C; + VPlane_E = E; + + // Determine clip boundary and clip Zenith angle if necessary + short MaxAZS = MaxAZS_Exp[-E]; + + if (AZS < 0) { + MaxAZS = -MaxAZS; + if (AZS < MaxAZS + 1) AZS = MaxAZS + 1; + } else { + if (AZS > MaxAZS) AZS = MaxAZS; + } + + // Store Sin and Cos of clipped Zenith angle + SinAZS = DSP1_Sin(AZS); + CosAZS = DSP1_Cos(AZS); + + DSP1_Inverse(CosAZS, 0, &SecAZS_C1, &SecAZS_E1); + DSP1_Normalize(C * SecAZS_C1 >> 15, &C, &E); + E += SecAZS_E1; + + C = DSP1_Truncate(C, E) * SinAZS >> 15; + + CentreX += C * SinAas >> 15; + CentreY -= C * CosAas >> 15; + + *Cx = CentreX; + *Cy = CentreY; + + // Raster number of imaginary center and horizontal line + *Vof = 0; + + if ((Azs != AZS) || (Azs == MaxAZS)) + { + if (Azs == -32768) Azs = -32767; + + C = Azs - MaxAZS; + if (C >= 0) C--; + short Aux = ~(C << 2); + + C = Aux * DSP1ROM[0x0328] >> 15; + C = (C * Aux >> 15) + DSP1ROM[0x0327]; + *Vof -= (C * Aux >> 15) * Les >> 15; + + C = Aux * Aux >> 15; + Aux = (C * DSP1ROM[0x0324] >> 15) + DSP1ROM[0x0325]; + CosAZS += (C * Aux >> 15) * CosAZS >> 15; + } + + VOffset = Les * CosAZS >> 15; + + DSP1_Inverse(SinAZS, 0, &CSec, &E); + DSP1_Normalize(VOffset, &C, &E); + DSP1_Normalize(C * CSec >> 15, &C, &E); + + if (C == -32768) { C >>= 1; E++; } + + *Vva = DSP1_Truncate(-C, E); + + // Store Sec of clipped Zenith angle + DSP1_Inverse(CosAZS, 0, &SecAZS_C2, &SecAZS_E2); +} + +void DSP1_Raster(short Vs, short *An, short *Bn, short *Cn, short *Dn) +{ + short C, E, C1, E1; + + DSP1_Inverse((Vs * SinAzs >> 15) + VOffset, 7, &C, &E); + E += VPlane_E; + + C1 = C * VPlane_C >> 15; + E1 = E + SecAZS_E2; + + DSP1_Normalize(C1, &C, &E); + + C = DSP1_Truncate(C, E); + + *An = C * CosAas >> 15; + *Cn = C * SinAas >> 15; + + DSP1_Normalize(C1 * SecAZS_C2 >> 15, &C, &E1); + + C = DSP1_Truncate(C, E1); + + *Bn = C * -SinAas >> 15; + *Dn = C * CosAas >> 15; +} + +short Op02FX; +short Op02FY; +short Op02FZ; +short Op02LFE; +short Op02LES; +short Op02AAS; +short Op02AZS; +short Op02VOF; +short Op02VVA; +short Op02CX; +short Op02CY; + +void DSPOp02() +{ + DSP1_Parameter(Op02FX, Op02FY, Op02FZ, Op02LFE, Op02LES, Op02AAS, Op02AZS, &Op02VOF, &Op02VVA, &Op02CX, &Op02CY); +} + +short Op0AVS; +short Op0AA; +short Op0AB; +short Op0AC; +short Op0AD; + +void DSPOp0A() +{ + DSP1_Raster(Op0AVS, &Op0AA, &Op0AB, &Op0AC, &Op0AD); + Op0AVS++; +} + +short Op06X; +short Op06Y; +short Op06Z; +short Op06H; +short Op06V; +unsigned short Op06S; + +double ObjPX; +double ObjPY; +double ObjPZ; +double ObjPX1; +double ObjPY1; +double ObjPZ1; +double ObjPX2; +double ObjPY2; +double ObjPZ2; +double DivideOp06; +int Temp; +int tanval2; + +#ifdef __OPT06__ +void DSPOp06() +{ + ObjPX=Op06X-Op02FX; + ObjPY=Op06Y-Op02FY; + ObjPZ=Op06Z-Op02FZ; + + // rotate around Z + tanval2 = Angle(-Op02AAS+32768); +// tanval2 = (-Op02AAS+32768)/(65536/INCR); + ObjPX1=(ObjPX*Cos(tanval2)+ObjPY*-Sin(tanval2)); + ObjPY1=(ObjPX*Sin(tanval2)+ObjPY*Cos(tanval2)); + ObjPZ1=ObjPZ; + + // rotate around X +// tanval2 = (-Op02AZS/(65536/INCR)) & 1023; + tanval2 = Angle(-Op02AZS); +// tanval2 = (-Op02AZS)/256; + ObjPX2=ObjPX1; + ObjPY2=(ObjPY1*Cos(tanval2)+ObjPZ1*-Sin(tanval2)); + ObjPZ2=(ObjPY1*Sin(tanval2)+ObjPZ1*Cos(tanval2)); + + #ifdef debug06 + Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2); + #endif + + ObjPZ2=ObjPZ2-Op02LFE; + + if (ObjPZ2<0) + { + double d; + Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; + Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; + d=(double)Op02LES; + d*=256.0; + d/=(-ObjPZ2); + if(d>65535.0) + d=65535.0; + else if(d<0.0) + d=0.0; + Op06S=(unsigned short)d; + //Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2); + //Op06S=(unsigned short)((double)(256.0*((double)Op02LES)/(-ObjPZ2))); + } + else + { + Op06H=0; + Op06V=14*16; + Op06S=0xFFFF; + } + + + #ifdef DebugDSP1 + Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z); + Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S); + #endif +} +#else + +void DSPOp06() +{ + ObjPX=Op06X-Op02FX; + ObjPY=Op06Y-Op02FY; + ObjPZ=Op06Z-Op02FZ; + + // rotate around Z + tanval = (-Op02AAS+32768)/65536.0*6.2832; + ObjPX1=(ObjPX*cos(tanval)+ObjPY*-sin(tanval)); + ObjPY1=(ObjPX*sin(tanval)+ObjPY*cos(tanval)); + ObjPZ1=ObjPZ; + + #ifdef debug06 + Log_Message("Angle : %f", tanval); + Log_Message("ObjPX1: %f ObjPY1: %f ObjPZ1: %f\n",ObjPX1,ObjPY1,ObjPZ1); + Log_Message("cos(tanval) : %f sin(tanval) : %f", cos(tanval), sin(tanval)); + #endif + + // rotate around X + tanval = (-Op02AZS)/65536.0*6.2832; + ObjPX2=ObjPX1; + ObjPY2=(ObjPY1*cos(tanval)+ObjPZ1*-sin(tanval)); + ObjPZ2=(ObjPY1*sin(tanval)+ObjPZ1*cos(tanval)); + + #ifdef debug06 + Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2); + #endif + + ObjPZ2=ObjPZ2-Op02LFE; + + if (ObjPZ2<0) + { + Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; + Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; + double d=(double)Op02LES; + d*=256.0; + d/=(-ObjPZ2); + if(d>65535.0) + d=65535.0; + else if(d<0.0) + d=0.0; + Op06S=(unsigned short)d; +// Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2); + } + else + { + Op06H=0; + Op06V=14*16; + Op06S=0xFFFF; + } + + #ifdef DebugDSP1 + Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z); + Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S); + #endif +} +#endif + + +short matrixC[3][3]; +short matrixB[3][3]; +short matrixA[3][3]; + +short Op01m; +short Op01Zr; +short Op01Xr; +short Op01Yr; +short Op11m; +short Op11Zr; +short Op11Xr; +short Op11Yr; +short Op21m; +short Op21Zr; +short Op21Xr; +short Op21Yr; + +void DSPOp01() +{ + short SinAz = DSP1_Sin(Op01Zr); + short CosAz = DSP1_Cos(Op01Zr); + short SinAy = DSP1_Sin(Op01Yr); + short CosAy = DSP1_Cos(Op01Yr); + short SinAx = DSP1_Sin(Op01Xr); + short CosAx = DSP1_Cos(Op01Xr); + + Op01m >>= 1; + + matrixA[0][0] = (Op01m * CosAz >> 15) * CosAy >> 15; + matrixA[0][1] = -((Op01m * SinAz >> 15) * CosAy >> 15); + matrixA[0][2] = Op01m * SinAy >> 15; + + matrixA[1][0] = ((Op01m * SinAz >> 15) * CosAx >> 15) + (((Op01m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixA[1][1] = ((Op01m * CosAz >> 15) * CosAx >> 15) - (((Op01m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixA[1][2] = -((Op01m * SinAx >> 15) * CosAy >> 15); + + matrixA[2][0] = ((Op01m * SinAz >> 15) * SinAx >> 15) - (((Op01m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixA[2][1] = ((Op01m * CosAz >> 15) * SinAx >> 15) + (((Op01m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixA[2][2] = (Op01m * CosAx >> 15) * CosAy >> 15; +} + +void DSPOp11() +{ + short SinAz = DSP1_Sin(Op11Zr); + short CosAz = DSP1_Cos(Op11Zr); + short SinAy = DSP1_Sin(Op11Yr); + short CosAy = DSP1_Cos(Op11Yr); + short SinAx = DSP1_Sin(Op11Xr); + short CosAx = DSP1_Cos(Op11Xr); + + Op11m >>= 1; + + matrixB[0][0] = (Op11m * CosAz >> 15) * CosAy >> 15; + matrixB[0][1] = -((Op11m * SinAz >> 15) * CosAy >> 15); + matrixB[0][2] = Op11m * SinAy >> 15; + + matrixB[1][0] = ((Op11m * SinAz >> 15) * CosAx >> 15) + (((Op11m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixB[1][1] = ((Op11m * CosAz >> 15) * CosAx >> 15) - (((Op11m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixB[1][2] = -((Op11m * SinAx >> 15) * CosAy >> 15); + + matrixB[2][0] = ((Op11m * SinAz >> 15) * SinAx >> 15) - (((Op11m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixB[2][1] = ((Op11m * CosAz >> 15) * SinAx >> 15) + (((Op11m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixB[2][2] = (Op11m * CosAx >> 15) * CosAy >> 15; +} + +void DSPOp21() +{ + short SinAz = DSP1_Sin(Op21Zr); + short CosAz = DSP1_Cos(Op21Zr); + short SinAy = DSP1_Sin(Op21Yr); + short CosAy = DSP1_Cos(Op21Yr); + short SinAx = DSP1_Sin(Op21Xr); + short CosAx = DSP1_Cos(Op21Xr); + + Op21m >>= 1; + + matrixC[0][0] = (Op21m * CosAz >> 15) * CosAy >> 15; + matrixC[0][1] = -((Op21m * SinAz >> 15) * CosAy >> 15); + matrixC[0][2] = Op21m * SinAy >> 15; + + matrixC[1][0] = ((Op21m * SinAz >> 15) * CosAx >> 15) + (((Op21m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixC[1][1] = ((Op21m * CosAz >> 15) * CosAx >> 15) - (((Op21m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); + matrixC[1][2] = -((Op21m * SinAx >> 15) * CosAy >> 15); + + matrixC[2][0] = ((Op21m * SinAz >> 15) * SinAx >> 15) - (((Op21m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixC[2][1] = ((Op21m * CosAz >> 15) * SinAx >> 15) + (((Op21m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); + matrixC[2][2] = (Op21m * CosAx >> 15) * CosAy >> 15; +} + +short Op0DX; +short Op0DY; +short Op0DZ; +short Op0DF; +short Op0DL; +short Op0DU; +short Op1DX; +short Op1DY; +short Op1DZ; +short Op1DF; +short Op1DL; +short Op1DU; +short Op2DX; +short Op2DY; +short Op2DZ; +short Op2DF; +short Op2DL; +short Op2DU; + +void DSPOp0D() +{ + Op0DF = (Op0DX * matrixA[0][0] >> 15) + (Op0DY * matrixA[0][1] >> 15) + (Op0DZ * matrixA[0][2] >> 15); + Op0DL = (Op0DX * matrixA[1][0] >> 15) + (Op0DY * matrixA[1][1] >> 15) + (Op0DZ * matrixA[1][2] >> 15); + Op0DU = (Op0DX * matrixA[2][0] >> 15) + (Op0DY * matrixA[2][1] >> 15) + (Op0DZ * matrixA[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP0D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op0DX,Op0DY,Op0DZ,Op0DF,Op0DL,Op0DU); + #endif +} + +void DSPOp1D() +{ + Op1DF = (Op1DX * matrixB[0][0] >> 15) + (Op1DY * matrixB[0][1] >> 15) + (Op1DZ * matrixB[0][2] >> 15); + Op1DL = (Op1DX * matrixB[1][0] >> 15) + (Op1DY * matrixB[1][1] >> 15) + (Op1DZ * matrixB[1][2] >> 15); + Op1DU = (Op1DX * matrixB[2][0] >> 15) + (Op1DY * matrixB[2][1] >> 15) + (Op1DZ * matrixB[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP1D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op1DX,Op1DY,Op1DZ,Op1DF,Op1DL,Op1DU); + #endif +} + +void DSPOp2D() +{ + Op2DF = (Op2DX * matrixC[0][0] >> 15) + (Op2DY * matrixC[0][1] >> 15) + (Op2DZ * matrixC[0][2] >> 15); + Op2DL = (Op2DX * matrixC[1][0] >> 15) + (Op2DY * matrixC[1][1] >> 15) + (Op2DZ * matrixC[1][2] >> 15); + Op2DU = (Op2DX * matrixC[2][0] >> 15) + (Op2DY * matrixC[2][1] >> 15) + (Op2DZ * matrixC[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP2D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op2DX,Op2DY,Op2DZ,Op2DF,Op2DL,Op2DU); + #endif +} + +short Op03F; +short Op03L; +short Op03U; +short Op03X; +short Op03Y; +short Op03Z; +short Op13F; +short Op13L; +short Op13U; +short Op13X; +short Op13Y; +short Op13Z; +short Op23F; +short Op23L; +short Op23U; +short Op23X; +short Op23Y; +short Op23Z; + +void DSPOp03() +{ + Op03X = (Op03F * matrixA[0][0] >> 15) + (Op03L * matrixA[1][0] >> 15) + (Op03U * matrixA[2][0] >> 15); + Op03Y = (Op03F * matrixA[0][1] >> 15) + (Op03L * matrixA[1][1] >> 15) + (Op03U * matrixA[2][1] >> 15); + Op03Z = (Op03F * matrixA[0][2] >> 15) + (Op03L * matrixA[1][2] >> 15) + (Op03U * matrixA[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP03 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op03F,Op03L,Op03U,Op03X,Op03Y,Op03Z); + #endif +} + +void DSPOp13() +{ + Op13X = (Op13F * matrixB[0][0] >> 15) + (Op13L * matrixB[1][0] >> 15) + (Op13U * matrixB[2][0] >> 15); + Op13Y = (Op13F * matrixB[0][1] >> 15) + (Op13L * matrixB[1][1] >> 15) + (Op13U * matrixB[2][1] >> 15); + Op13Z = (Op13F * matrixB[0][2] >> 15) + (Op13L * matrixB[1][2] >> 15) + (Op13U * matrixB[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP13 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op13F,Op13L,Op13U,Op13X,Op13Y,Op13Z); + #endif +} + +void DSPOp23() +{ + Op23X = (Op23F * matrixC[0][0] >> 15) + (Op23L * matrixC[1][0] >> 15) + (Op23U * matrixC[2][0] >> 15); + Op23Y = (Op23F * matrixC[0][1] >> 15) + (Op23L * matrixC[1][1] >> 15) + (Op23U * matrixC[2][1] >> 15); + Op23Z = (Op23F * matrixC[0][2] >> 15) + (Op23L * matrixC[1][2] >> 15) + (Op23U * matrixC[2][2] >> 15); + + #ifdef DebugDSP1 + Log_Message("OP23 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op23F,Op23L,Op23U,Op23X,Op23Y,Op23Z); + #endif +} + +short Op14Zr; +short Op14Xr; +short Op14Yr; +short Op14U; +short Op14F; +short Op14L; +short Op14Zrr; +short Op14Xrr; +short Op14Yrr; + +void DSPOp14() +{ + short CSec, ESec, CTan, CSin, C, E; + + DSP1_Inverse(DSP1_Cos(Op14Xr), 0, &CSec, &ESec); + + // Rotation Around Z + DSP1_NormalizeDouble(Op14U * DSP1_Cos(Op14Yr) - Op14F * DSP1_Sin(Op14Yr), &C, &E); + + E = ESec - E; + + DSP1_Normalize(C * CSec >> 15, &C, &E); + + Op14Zrr = Op14Zr + DSP1_Truncate(C, E); + + // Rotation Around X + Op14Xrr = Op14Xr + (Op14U * DSP1_Sin(Op14Yr) >> 15) + (Op14F * DSP1_Cos(Op14Yr) >> 15); + + // Rotation Around Y + DSP1_NormalizeDouble(Op14U * DSP1_Cos(Op14Yr) + Op14F * DSP1_Sin(Op14Yr), &C, &E); + + E = ESec - E; + + DSP1_Normalize(DSP1_Sin(Op14Xr), &CSin, &E); + + CTan = CSec * CSin >> 15; + + DSP1_Normalize(-(C * CTan >> 15), &C, &E); + + Op14Yrr = Op14Yr + DSP1_Truncate(C, E) + Op14L; +} + +void DSP1_Target(short H, short V, short *X, short *Y) +{ + short C, E, C1, E1; + + DSP1_Inverse((V * SinAzs >> 15) + VOffset, 8, &C, &E); + E += VPlane_E; + + C1 = C * VPlane_C >> 15; + E1 = E + SecAZS_E1; + + H <<= 8; + + DSP1_Normalize(C1, &C, &E); + + C = DSP1_Truncate(C, E) * H >> 15; + + *X = CentreX + (C * CosAas >> 15); + *Y = CentreY - (C * SinAas >> 15); + + V <<= 8; + + DSP1_Normalize(C1 * SecAZS_C1 >> 15, &C, &E1); + + C = DSP1_Truncate(C, E1) * V >> 15; + + *X += C * -SinAas >> 15; + *Y += C * CosAas >> 15; +} + +short Op0EH; +short Op0EV; +short Op0EX; +short Op0EY; + +void DSPOp0E() +{ + DSP1_Target(Op0EH, Op0EV, &Op0EX, &Op0EY); +} + +short Op0BX; +short Op0BY; +short Op0BZ; +short Op0BS; +short Op1BX; +short Op1BY; +short Op1BZ; +short Op1BS; +short Op2BX; +short Op2BY; +short Op2BZ; +short Op2BS; + +void DSPOp0B() +{ + Op0BS = (Op0BX * matrixA[0][0] + Op0BY * matrixA[0][1] + Op0BZ * matrixA[0][2]) >> 15; + + #ifdef DebugDSP1 + Log_Message("OP0B"); + #endif +} + +void DSPOp1B() +{ + Op1BS = (Op1BX * matrixB[0][0] + Op1BY * matrixB[0][1] + Op1BZ * matrixB[0][2]) >> 15; + + #ifdef DebugDSP1 + Log_Message("OP1B X: %d Y: %d Z: %d S: %d",Op1BX,Op1BY,Op1BZ,Op1BS); + Log_Message(" MX: %d MY: %d MZ: %d Scale: %d",(short)(matrixB[0][0]*100),(short)(matrixB[0][1]*100),(short)(matrixB[0][2]*100),(short)(sc2*100)); + #endif +} + +void DSPOp2B() +{ + Op2BS = (Op2BX * matrixC[0][0] + Op2BY * matrixC[0][1] + Op2BZ * matrixC[0][2]) >> 15; + + #ifdef DebugDSP1 + Log_Message("OP2B"); + #endif +} + +short Op08X,Op08Y,Op08Z,Op08Ll,Op08Lh; + +void DSPOp08() +{ + int Op08Size = (Op08X * Op08X + Op08Y * Op08Y + Op08Z * Op08Z) << 1; + Op08Ll = Op08Size & 0xffff; + Op08Lh = (Op08Size >> 16) & 0xffff; + + #ifdef DebugDSP1 + Log_Message("OP08 %d,%d,%d",Op08X,Op08Y,Op08Z); + Log_Message("OP08 ((Op08X^2)+(Op08Y^2)+(Op08X^2))=%x",Op08Size ); + #endif +} + +short Op18X,Op18Y,Op18Z,Op18R,Op18D; + +void DSPOp18() +{ + Op18D = (Op18X * Op18X + Op18Y * Op18Y + Op18Z * Op18Z - Op18R * Op18R) >> 15; + + #ifdef DebugDSP1 + Log_Message("Op18 X: %d Y: %d Z: %d R: %D DIFF %d",Op18X,Op18Y,Op38Z,Op18D); + #endif +} + +short Op38X,Op38Y,Op38Z,Op38R,Op38D; + +void DSPOp38() +{ + Op38D = (Op38X * Op38X + Op38Y * Op38Y + Op38Z * Op38Z - Op38R * Op38R) >> 15; + Op38D++; + + #ifdef DebugDSP1 + Log_Message("OP38 X: %d Y: %d Z: %d R: %D DIFF %d",Op38X,Op38Y,Op38Z,Op38D); + #endif +} + +short Op28X; +short Op28Y; +short Op28Z; +short Op28R; + +void DSPOp28() +{ + int Radius = Op28X * Op28X + Op28Y * Op28Y + Op28Z * Op28Z; + + if (Radius == 0) Op28R = 0; + else + { + short C, E; + DSP1_NormalizeDouble(Radius, &C, &E); + if (E & 1) C = C * 0x4000 >> 15; + + short Pos = C * 0x0040 >> 15; + + short Node1 = DSP1ROM[0x00d5 + Pos]; + short Node2 = DSP1ROM[0x00d6 + Pos]; + + Op28R = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1; + Op28R >>= (E >> 1); + } + + #ifdef DebugDSP1 + Log_Message("OP28 X:%d Y:%d Z:%d",Op28X,Op28Y,Op28Z); + Log_Message("OP28 Vector Length %d",Op28R); + #endif +} + +short Op1CX,Op1CY,Op1CZ; +short Op1CXBR,Op1CYBR,Op1CZBR,Op1CXAR,Op1CYAR,Op1CZAR; +short Op1CX1; +short Op1CY1; +short Op1CZ1; +short Op1CX2; +short Op1CY2; +short Op1CZ2; + +void DSPOp1C() +{ + // Rotate Around Op1CZ1 + Op1CX1 = (Op1CYBR * DSP1_Sin(Op1CZ) >> 15) + (Op1CXBR * DSP1_Cos(Op1CZ) >> 15); + Op1CY1 = (Op1CYBR * DSP1_Cos(Op1CZ) >> 15) - (Op1CXBR * DSP1_Sin(Op1CZ) >> 15); + Op1CXBR = Op1CX1; Op1CYBR = Op1CY1; + + // Rotate Around Op1CY1 + Op1CZ1 = (Op1CXBR * DSP1_Sin(Op1CY) >> 15) + (Op1CZBR * DSP1_Cos(Op1CY) >> 15); + Op1CX1 = (Op1CXBR * DSP1_Cos(Op1CY) >> 15) - (Op1CZBR * DSP1_Sin(Op1CY) >> 15); + Op1CXAR = Op1CX1; Op1CZBR = Op1CZ1; + + // Rotate Around Op1CX1 + Op1CY1 = (Op1CZBR * DSP1_Sin(Op1CX) >> 15) + (Op1CYBR * DSP1_Cos(Op1CX) >> 15); + Op1CZ1 = (Op1CZBR * DSP1_Cos(Op1CX) >> 15) - (Op1CYBR * DSP1_Sin(Op1CX) >> 15); + Op1CYAR = Op1CY1; Op1CZAR = Op1CZ1; + + #ifdef DebugDSP1 + Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ",Op1CXAR,Op1CYAR,Op1CZAR); + #endif +} + +unsigned short Op0FRamsize; +unsigned short Op0FPass; + +void DSPOp0F() +{ + Op0FPass = 0x0000; + + #ifdef DebugDSP1 + Log_Message("OP0F RAM Test Pass:%d", Op0FPass); + #endif +} + +short Op2FUnknown; +short Op2FSize; + +void DSPOp2F() +{ + Op2FSize=0x100; +} diff --git a/src/dsp1emu_old.c b/src/dsp1emu_old.c new file mode 100644 index 0000000..bc2ff92 --- /dev/null +++ b/src/dsp1emu_old.c @@ -0,0 +1,1518 @@ +//Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +// +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU General Public License +//as published by the Free Software Foundation; either +//version 2 of the License, or (at your option) any later +//version. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//GNU General Public License for more details. +// +//You should have received a copy of the GNU General Public License +//along with this program; if not, write to the Free Software +//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +#include +#include +#include +#include +#include +//#define DebugDSP1 + +// uncomment some lines to test +//#define printinfo +//#define debug02 +//#define debug0A +//#define debug06 + +#define __OPT__ +#define __OPT01__ +#define __OPT02__ +//#define __OPT04__ +#define __OPT06__ +#define __OPT0C__ // this optimisation may break pilotwings +#define __OPT11__ +#define __OPT21__ +#define __OPT1C__ + +#ifdef DebugDSP1 + +FILE * LogFile = NULL; + +void Log_Message (char *Message, ...) +{ + char Msg[400]; + va_list ap; + + va_start(ap,Message); + vsprintf(Msg,Message,ap ); + va_end(ap); + + strcat(Msg,"\r\n\0"); + fwrite(Msg,strlen(Msg),1,LogFile); + fflush (LogFile); +} + +void Start_Log (void) +{ + char LogFileName[255]; +// [4/15/2001] char *p; + + strcpy(LogFileName,"dsp1emu.log\0"); + + LogFile = fopen(LogFileName,"wb"); +} + +void Stop_Log (void) +{ + if (LogFile) + { + fclose(LogFile); + LogFile = NULL; + } +} + +#endif + + +/***************************************************************************\ +* Math tables * +\***************************************************************************/ + +#define INCR 2048 +#define Angle(x) (((x)/(65536/INCR)) & (INCR-1)) +#define Cos(x) ((double) CosTable2[x]) +#define Sin(x) ((double) SinTable2[x]) +#define PI 3.14159265358979323846264338327 +double CosTable2[INCR]; +double SinTable2[INCR]; + +double Atan(double x) +{ + if ((x>=1) || (x<=1)) + return (x/(1+0.28*x*x)); + else + return (PI/2 - Atan(1/x)); +} + +#if 0 +/***************************************************************************\ +* C4 C code * +\***************************************************************************/ + + +short C4WFXVal; +short C4WFYVal; +short C4WFZVal; +short C4WFX2Val; +short C4WFY2Val; +short C4WFDist; +short C4WFScale; +double tanval; +double c4x,c4y,c4z; +double c4x2,c4y2,c4z2; + +void C4TransfWireFrame() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal-0x95; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/(0x90*(c4z+0x95))*0x95); + C4WFYVal=(short)(c4y*C4WFScale/(0x90*(c4z+0x95))*0x95); +} + +void C4TransfWireFrame2() +{ + c4x=(double)C4WFXVal; + c4y=(double)C4WFYVal; + c4z=(double)C4WFZVal; + + // Rotate X + tanval=-(double)C4WFX2Val*PI*2/128; + c4y2=c4y*cos(tanval)-c4z*sin(tanval); + c4z2=c4y*sin(tanval)+c4z*cos(tanval); + + // Rotate Y + tanval=-(double)C4WFY2Val*PI*2/128; + c4x2=c4x*cos(tanval)+c4z2*sin(tanval); + c4z=c4x*-sin(tanval)+c4z2*cos(tanval); + + // Rotate Z + tanval=-(double)C4WFDist*PI*2/128; + c4x=c4x2*cos(tanval)-c4y2*sin(tanval); + c4y=c4x2*sin(tanval)+c4y2*cos(tanval); + + // Scale + C4WFXVal=(short)(c4x*C4WFScale/0x100); + C4WFYVal=(short)(c4y*C4WFScale/0x100); +} + +void C4CalcWireFrame() +{ + C4WFXVal=C4WFX2Val-C4WFXVal; + C4WFYVal=C4WFY2Val-C4WFYVal; + if (abs(C4WFXVal)>abs(C4WFYVal)){ + C4WFDist=abs(C4WFXVal)+1; + C4WFYVal=(256*(long)C4WFYVal)/abs(C4WFXVal); + if (C4WFXVal<0) C4WFXVal=-256; + else C4WFXVal=256; + } + else + if (C4WFYVal!=0) { + C4WFDist=abs(C4WFYVal)+1; + C4WFXVal=(256*(long)C4WFXVal)/abs(C4WFYVal); + if (C4WFYVal<0) C4WFYVal=-256; + else C4WFYVal=256; + } + else C4WFDist=0; +} + +short C41FXVal; +short C41FYVal; +short C41FAngleRes; +short C41FDist; +short C41FDistVal; + +void C4Op1F() +{ + if (C41FXVal == 0) { + if (C41FYVal>0) C41FAngleRes=0x80; + else C41FAngleRes=0x180; + } + else { + tanval = ((double)C41FYVal)/((double)C41FXVal); + C41FAngleRes=(short)(atan(tanval)/(PI*2)*512); + C41FAngleRes=C41FAngleRes; + if (C41FXVal<0) C41FAngleRes+=0x100; + C41FAngleRes&=0x1FF; + } +} + +void C4Op15() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + C41FDist=(short)tanval; +} + +void C4Op0D() +{ + tanval=sqrt(((double)C41FYVal)*((double)C41FYVal)+((double)C41FXVal)* + ((double)C41FXVal)); + tanval=(double)C41FDistVal/tanval; + C41FYVal=(short)(((double)C41FYVal*tanval)*0.99); + C41FXVal=(short)(((double)C41FXVal*tanval)*0.98); +} +#endif + +/***************************************************************************\ +* DSP1 code * +\***************************************************************************/ + + +void InitDSP(void) +{ +#ifdef __OPT__ + unsigned int i; +// CosTable2 = (double *) malloc(INCR*sizeof(double)); +// SinTable2 = (double *) malloc(INCR*sizeof(double)); + for (i=0; i> 15; + #ifdef DebugDSP1 + Log_Message("OP00 MULT %d*%d/32768=%d",Op00Multiplicand,Op00Multiplier,Op00Result); + #endif +} + +signed short Op10Coefficient; +signed short Op10Exponent; +signed short Op10CoefficientR; +signed short Op10ExponentR; +float Op10Temp; + +void DSPOp10() +{ +//puts("DSPOp10"); + // Hard to get bit accurate here but it's very close... + // within 2 lsb's on the coefficient of the DSP1B. Emu is more accurate. + + if (Op10Coefficient == 0) { + Op10CoefficientR = 0x7fff; // DSP1B - Strange but true + Op10ExponentR = 0x002f; + } else { + Op10ExponentR=-Op10Exponent; + Op10Temp = (float)(Op10Coefficient / 32768.0); + Op10Temp = 1/Op10Temp; + if (Op10Temp > 0) + while (Op10Temp>=1.0) { + Op10Temp = (float)(Op10Temp/2.0); + Op10ExponentR++; + } + else + while (Op10Temp <= -1.0) { + Op10Temp=(float)(Op10Temp/2.0); + Op10ExponentR++; + } + Op10CoefficientR = (short)(Op10Temp*32768); + } + #ifdef DebugDSP1 + Log_Message("OP10 INV %d*2^%d = %d*2^%d", Op10Coefficient, Op10Exponent, Op10CoefficientR, Op10ExponentR); + #endif +} + + +short Op04Angle; +short Op04Radius; // This is signed +short Op04Sin; +short Op04Cos; + +#ifdef __OPT04__ + +void DSPOp04() +{ +//puts("DSPOp04_"); + int angle; + + angle = Angle(Op04Angle); + + Op04Sin = Sin(angle) * Op04Radius; + Op04Cos = Cos(angle) * Op04Radius; + + #ifdef DebugDSP1 + Log_Message("OP04 Angle:%d Radius:%d",(Op04Angle/256)&255,Op04Radius); + Log_Message("OP04 SIN:%d COS:%d",Op04Sin,Op04Cos); + #endif +} +#else + +void DSPOp04() +{ +//puts("DSPOp04"); + double angle; + + angle = Op04Angle*2*PI/65536.0; + + Op04Sin = (short)(sin(angle) * Op04Radius); + Op04Cos = (short)(cos(angle) * Op04Radius); + + #ifdef DebugDSP1 + Log_Message("OP04 Angle:%d Radius:%d",(Op04Angle/256)&255,Op04Radius); + Log_Message("OP04 SIN:%d COS:%d",Op04Sin,Op04Cos); + #endif +} +#endif + +unsigned short Op0CA; +short Op0CX1; +short Op0CY1; +short Op0CX2; +short Op0CY2; + +#ifdef __OPT0C__ +void DSPOp0C() +{ +//puts("DSPOp0C_"); + Op0CX2=(short)((Op0CX1*Cos(Angle(Op0CA))+Op0CY1*Sin(Angle(Op0CA)))); + Op0CY2=(short)((Op0CX1*-Sin(Angle(Op0CA))+Op0CY1*Cos(Angle(Op0CA)))); + #ifdef DebugDSP1 + Log_Message("OP0C Angle:%d X:%d Y:%d CX:%d CY:%d",(Op0CA/256)&255,Op0CX1,Op0CY1,Op0CX2,Op0CY2); + #endif +} +#else +void DSPOp0C() +{ +//puts("DSPOp0C"); + + Op0CX2=(Op0CX1*cos(Op0CA*2*PI/65536.0)+Op0CY1*sin(Op0CA*2*PI/65536.0)); + Op0CY2=(Op0CX1*-sin(Op0CA*2*PI/65536.0)+Op0CY1*cos(Op0CA*2*PI/65536.0)); + #ifdef DebugDSP1 + Log_Message("OP0C Angle:%d X:%d Y:%d CX:%d CY:%d",(Op0CA/256)&255,Op0CX1,Op0CY1,Op0CX2,Op0CY2); + #endif +} + +#endif + +short Op02FX; +short Op02FY; +short Op02FZ; +short Op02LFE; +short Op02LES; +unsigned short Op02AAS; +unsigned short Op02AZS; +unsigned short Op02VOF; +unsigned short Op02VVA; + +short Op02CX; +short Op02CY; +double Op02CXF; +double Op02CYF; +double ViewerX0; +double ViewerY0; +double ViewerZ0; +double ViewerX1; +double ViewerY1; +double ViewerZ1; +double ViewerX; +double ViewerY; +double ViewerZ; +int ViewerAX; +int ViewerAY; +int ViewerAZ; +double NumberOfSlope; +double ScreenX; +double ScreenY; +double ScreenZ; +double TopLeftScreenX; +double TopLeftScreenY; +double TopLeftScreenZ; +double BottomRightScreenX; +double BottomRightScreenY; +double BottomRightScreenZ; +double Ready; +double RasterLX; +double RasterLY; +double RasterLZ; +double ScreenLX1; +double ScreenLY1; +double ScreenLZ1; +int ReversedLES; +short Op02LESb; +double NAzsB,NAasB; +double ViewerXc; +double ViewerYc; +double ViewerZc; +double CenterX,CenterY; +short Op02CYSup,Op02CXSup; +double CXdistance; + +#define VofAngle 0x3880 + +short TValDebug,TValDebug2; +short ScrDispl; + + +#ifdef __OPT02__ +void DSPOp02() +{ +//puts("DSPOp02_"); + ViewerZ1=-Cos(Angle(Op02AZS)); + ViewerX1=Sin(Angle(Op02AZS))*Sin(Angle(Op02AAS)); + ViewerY1=Sin(Angle(Op02AZS))*Cos(Angle(Op02AAS)); + + + #ifdef debug02 + printf("\nViewerX1 : %f ViewerY1 : %f ViewerZ1 : %f\n",ViewerX1,ViewerY1, + ViewerZ1); + getch(); + #endif + ViewerX=Op02FX-ViewerX1*Op02LFE; + ViewerY=Op02FY-ViewerY1*Op02LFE; + ViewerZ=Op02FZ-ViewerZ1*Op02LFE; + + ScreenX=Op02FX+ViewerX1*(Op02LES-Op02LFE); + ScreenY=Op02FY+ViewerY1*(Op02LES-Op02LFE); + ScreenZ=Op02FZ+ViewerZ1*(Op02LES-Op02LFE); + + #ifdef debug02 + printf("ViewerX : %f ViewerY : %f ViewerZ : %f\n",ViewerX,ViewerY,ViewerZ); + printf("Op02FX : %d Op02FY : %d Op02FZ : %d\n",Op02FX,Op02FY,Op02FZ); + printf("ScreenX : %f ScreenY : %f ScreenZ : %f\n",ScreenX,ScreenY,ScreenZ); + getch(); + #endif + if (ViewerZ1==0)ViewerZ1++; + NumberOfSlope=ViewerZ/-ViewerZ1; + + Op02CX=(short)(Op02CXF=ViewerX+ViewerX1*NumberOfSlope); + Op02CY=(short)(Op02CYF=ViewerY+ViewerY1*NumberOfSlope); + + Op02VOF=0x0000; + ReversedLES=0; + Op02LESb=Op02LES; + if ((Op02LES>=VofAngle+16384.0) && (Op02LES=VofAngle) && (Op02LESb<=VofAngle+0x4000)) { + Op02VOF= (short)(Op02LESb * tan((Op02AZS-0x4000-VofAngle)*6.2832/65536.0)); + Op02VVA-=Op02VOF; + } + if (ReversedLES){ + Op02VOF=-Op02VOF; + } + + NAzsB = (Op02AZS-0x4000)*6.2832/65536.0; + NAasB = Op02AAS*6.2832/65536.0; + + if (tan(NAzsB)==0) NAzsB=0.1; + + ScrDispl=0; + if (NAzsB>-0.15) {NAzsB=-0.15;ScrDispl=Op02VVA-0xFFDA;} + + CXdistance=1/tan(NAzsB); + + ViewerXc=Op02FX; + ViewerYc=Op02FY; + ViewerZc=Op02FZ; + + CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc; + CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc; + Op02CX = (short)CenterX; + Op02CY = (short)CenterY; + + ViewerXc=ViewerX;//-Op02FX); + ViewerYc=ViewerY;//-Op02FY); + ViewerZc=ViewerZ;//-Op02FZ); + + CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc; + if (CenterX<-32768) CenterX = -32768; if (CenterX>32767) CenterX=32767; + CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc; + if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767; + + TValDebug = (short)((NAzsB*65536/6.28)); + TValDebug2 = ScrDispl; + +// if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;} +// if (Op02CX < 0) {Op02CXSup = Op02CX/256; Op02CX = 0;} + +// [4/15/2001] (ViewerX+ViewerX1*NumberOfSlope); +// [4/15/2001] (ViewerY+ViewerY1*NumberOfSlope); + +// if(Op02LFE==0x2200)Op02VVA=0xFECD; +// else Op02VVA=0xFFB2; + + + #ifdef DebugDSP1 + Log_Message("OP02 FX:%d FY:%d FZ:%d LFE:%d LES:%d",Op02FX,Op02FY,Op02FZ,Op02LFE,Op02LES); + Log_Message(" AAS:%d AZS:%d VOF:%d VVA:%d",Op02AAS,Op02AZS,Op02VOF,Op02VVA); + Log_Message(" VX:%d VY:%d VZ:%d",(short)ViewerX,(short)ViewerY,(short)ViewerZ); + #endif + +} +#else + +void DSPOp02() +{ +//puts("DSPOp02"); + ViewerZ1=-cos(Op02AZS*6.2832/65536.0); + ViewerX1=sin(Op02AZS*6.2832/65536.0)*sin(Op02AAS*6.2832/65536.0); + ViewerY1=sin(Op02AZS*6.2832/65536.0)*cos(-Op02AAS*6.2832/65536.0); + + #ifdef debug02 + printf("\nViewerX1 : %f ViewerY1 : %f ViewerZ1 : %f\n",ViewerX1,ViewerY1, + ViewerZ1); + getch(); + #endif + ViewerX=Op02FX-ViewerX1*Op02LFE; + ViewerY=Op02FY-ViewerY1*Op02LFE; + ViewerZ=Op02FZ-ViewerZ1*Op02LFE; + + ScreenX=Op02FX+ViewerX1*(Op02LES-Op02LFE); + ScreenY=Op02FY+ViewerY1*(Op02LES-Op02LFE); + ScreenZ=Op02FZ+ViewerZ1*(Op02LES-Op02LFE); + + #ifdef debug02 + printf("ViewerX : %f ViewerY : %f ViewerZ : %f\n",ViewerX,ViewerY,ViewerZ); + printf("Op02FX : %d Op02FY : %d Op02FZ : %d\n",Op02FX,Op02FY,Op02FZ); + printf("ScreenX : %f ScreenY : %f ScreenZ : %f\n",ScreenX,ScreenY,ScreenZ); + getch(); + #endif + if (ViewerZ1==0)ViewerZ1++; + NumberOfSlope=ViewerZ/-ViewerZ1; + + Op02CX=(short)(Op02CXF=ViewerX+ViewerX1*NumberOfSlope); + Op02CY=(short)(Op02CYF=ViewerY+ViewerY1*NumberOfSlope); + + ViewerXc=ViewerX;//-Op02FX); + ViewerYc=ViewerY;//-Op02FY); + ViewerZc=ViewerZ;//-Op02FZ); + + Op02VOF=0x0000; + ReversedLES=0; + Op02LESb=Op02LES; + if ((Op02LES>=VofAngle+16384.0) && (Op02LES=VofAngle) && (Op02LESb<=VofAngle+0x4000)) { + Op02VOF= (short)(Op02LESb * tan((Op02AZS-0x4000-VofAngle)*6.2832/65536.0)); + Op02VVA-=Op02VOF; + } + if (ReversedLES){ + Op02VOF=-Op02VOF; + } + + NAzsB = (Op02AZS-0x4000)*6.2832/65536.0; + NAasB = Op02AAS*6.2832/65536.0; + + if (tan(NAzsB)==0) NAzsB=0.1; + + ScrDispl=0; + if (NAzsB>-0.15) {NAzsB=-0.15;ScrDispl=Op02VVA-0xFFDA;} + + CXdistance=1/tan(NAzsB); + + CenterX = (-sin(NAasB)*ViewerZc*CXdistance)+ViewerXc; + if (CenterX<-32768) CenterX = -32768; if (CenterX>32767) CenterX=32767; + Op02CX = (short)CenterX; + CenterY = (cos(NAasB)*ViewerZc*CXdistance)+ViewerYc; + if (CenterY<-32768) CenterY = -32768; if (CenterY>32767) CenterY=32767; + Op02CY = (short)CenterY; + + TValDebug = (NAzsB*65536/6.28); + TValDebug2 = ScrDispl; + +// if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;} +// if (Op02CX < 0) {Op02CXSup = Op02CX/256; Op02CX = 0;} + +// [4/15/2001] (ViewerX+ViewerX1*NumberOfSlope); +// [4/15/2001] (ViewerY+ViewerY1*NumberOfSlope); + +// if(Op02LFE==0x2200)Op02VVA=0xFECD; +// else Op02VVA=0xFFB2; + + + #ifdef DebugDSP1 + Log_Message("OP02 FX:%d FY:%d FZ:%d LFE:%d LES:%d",Op02FX,Op02FY,Op02FZ,Op02LFE,Op02LES); + Log_Message(" AAS:%d AZS:%d VOF:%d VVA:%d",Op02AAS,Op02AZS,Op02VOF,Op02VVA); + Log_Message(" VX:%d VY:%d VZ:%d",(short)ViewerX,(short)ViewerY,(short)ViewerZ); + #endif + +} +#endif + +short Op0AVS; +short Op0AA; +short Op0AB; +short Op0AC; +short Op0AD; + +double RasterRX; +double RasterRY; +double RasterRZ; +double RasterLSlopeX; +double RasterLSlopeY; +double RasterLSlopeZ; +double RasterRSlopeX; +double RasterRSlopeY; +double RasterRSlopeZ; +double GroundLX; +double GroundLY; +double GroundRX; +double GroundRY; +double Distance; + +double NAzs,NAas; +double RVPos,RHPos,RXRes,RYRes; + + +void GetRXYPos(){ + double scalar; + + if (Op02LES==0) return; + + + NAzs = NAzsB - Atan((RVPos) / (double)Op02LES); + NAas = NAasB;// + Atan(RHPos) / (double)Op02LES); + + if (cos(NAzs)==0) NAzs+=0.001; + if (tan(NAzs)==0) NAzs+=0.001; + + RXRes = (-sin(NAas)*ViewerZc/(tan(NAzs))+ViewerXc); + RYRes = (cos(NAas)*ViewerZc/(tan(NAzs))+ViewerYc); + scalar = ((ViewerZc/sin(NAzs))/(double)Op02LES); + RXRes += scalar*-sin(NAas+PI/2)*RHPos; + RYRes += scalar*cos(NAas+PI/2)*RHPos; +} + +void DSPOp0A() +{ +//puts("DSPOp0A"); + double x2,y2,x3,y3,x4,y4,m,ypos; + + + if(Op0AVS==0) {Op0AVS++; return;} + ypos=Op0AVS-ScrDispl; + // CenterX,CenterX = Center (x1,y1) + // Get (0,Vs) coords (x2,y2) + RVPos = ypos; RHPos = 0; + GetRXYPos(); x2 = RXRes; y2 = RYRes; + // Get (-128,Vs) coords (x3,y3) + RVPos = ypos; RHPos = -128; + GetRXYPos(); x3 = RXRes; y3 = RYRes; + // Get (127,Vs) coords (x4,y4) + RVPos = ypos; RHPos = 127; + GetRXYPos(); x4 = RXRes; y4 = RYRes; + + // A = (x4-x3)/256 + m = (x4-x3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768; + Op0AA = (short)(m); + // C = (y4-y3)/256 + m = (y4-y3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768; + Op0AC = (short)(m); + if (ypos==0){ + Op0AB = 0; + Op0AD = 0; + } + else { + // B = (x2-x1)/Vs + m = (x2-CenterX)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768; + Op0AB = (short)(m); + // D = (y2-y1)/Vs + m = (y2-CenterY)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768; + Op0AD = (short)(m); + } + + Op0AVS+=1; +} + +short Op06X; +short Op06Y; +short Op06Z; +short Op06H; +short Op06V; +unsigned short Op06S; + +double ObjPX; +double ObjPY; +double ObjPZ; +double ObjPX1; +double ObjPY1; +double ObjPZ1; +double ObjPX2; +double ObjPY2; +double ObjPZ2; +double DivideOp06; +int Temp; +int tanval2; + +#ifdef __OPT06__ +void DSPOp06() +{ +//puts("DSPOp06_"); + + ObjPX=Op06X-Op02FX; + ObjPY=Op06Y-Op02FY; + ObjPZ=Op06Z-Op02FZ; + + + + // rotate around Z + tanval2 = Angle(-Op02AAS+32768); +// tanval2 = (-Op02AAS+32768)/(65536/INCR); + ObjPX1=(ObjPX*Cos(tanval2)+ObjPY*-Sin(tanval2)); + ObjPY1=(ObjPX*Sin(tanval2)+ObjPY*Cos(tanval2)); + ObjPZ1=ObjPZ; + + + // rotate around X +// tanval2 = (-Op02AZS/(65536/INCR)) & 1023; + tanval2 = Angle(-Op02AZS); +// tanval2 = (-Op02AZS)/256; + ObjPX2=ObjPX1; + ObjPY2=(ObjPY1*Cos(tanval2)+ObjPZ1*-Sin(tanval2)); + ObjPZ2=(ObjPY1*Sin(tanval2)+ObjPZ1*Cos(tanval2)); + + #ifdef debug06 + Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2); + #endif + + ObjPZ2=ObjPZ2-Op02LFE; + + if (ObjPZ2<0) + { + Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; + Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; + double d=(double)Op02LES; + d*=256.0; + d/=(-ObjPZ2); + if(d>65535.0) + d=65535.0; + else if(d<0.0) + d=0.0; + Op06S=(unsigned short)d; + //Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2); + //Op06S=(unsigned short)((double)(256.0*((double)Op02LES)/(-ObjPZ2))); + } + else + { + Op06H=0; + Op06V=14*16; + Op06S=0xFFFF; + } + + + #ifdef DebugDSP1 + Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z); + Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S); + #endif +} +#else + +void DSPOp06() +{ +//puts("DSPOp06"); + ObjPX=Op06X-Op02FX; + ObjPY=Op06Y-Op02FY; + ObjPZ=Op06Z-Op02FZ; + + // rotate around Z + tanval = (-Op02AAS+32768)/65536.0*6.2832; + ObjPX1=(ObjPX*cos(tanval)+ObjPY*-sin(tanval)); + ObjPY1=(ObjPX*sin(tanval)+ObjPY*cos(tanval)); + ObjPZ1=ObjPZ; + + #ifdef debug06 + Log_Message("Angle : %f", tanval); + Log_Message("ObjPX1: %f ObjPY1: %f ObjPZ1: %f\n",ObjPX1,ObjPY1,ObjPZ1); + Log_Message("cos(tanval) : %f sin(tanval) : %f", cos(tanval), sin(tanval)); + #endif + + // rotate around X + tanval = (-Op02AZS)/65536.0*6.2832; + ObjPX2=ObjPX1; + ObjPY2=(ObjPY1*cos(tanval)+ObjPZ1*-sin(tanval)); + ObjPZ2=(ObjPY1*sin(tanval)+ObjPZ1*cos(tanval)); + + #ifdef debug06 + Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2); + #endif + + ObjPZ2=ObjPZ2-Op02LFE; + + if (ObjPZ2<0) + { + Op06H=(short)(-ObjPX2*Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; + Op06V=(short)(-ObjPY2*Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; + double d=(double)Op02LES; + d*=256.0; + d/=(-ObjPZ2); + if(d>65535.0) + d=65535.0; + else if(d<0.0) + d=0.0; + Op06S=(unsigned short)d; + //Op06S=(unsigned short)(256*(double)Op02LES/-ObjPZ2); + } + else + { + Op06H=0; + Op06V=14*16; + Op06S=0xFFFF; + } + + + #ifdef DebugDSP1 + Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z); + Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S); + #endif +} +#endif + + + +double matrixB[3][3]; +double matrixB2[3][3]; +double matrixB3[3][3]; + +double matrixA[3][3]; +double matrixA2[3][3]; +double matrixA3[3][3]; + +void MultMatrixB(double result[3][3],double mat1[3][3],double mat2[3][3]) +{ + result[0][0]=(mat1[0][0]*mat2[0][0]+mat1[0][1]*mat2[1][0]+mat1[0][2]*mat2[2][0]); + result[0][1]=(mat1[0][0]*mat2[0][1]+mat1[0][1]*mat2[1][1]+mat1[0][2]*mat2[2][1]); + result[0][2]=(mat1[0][0]*mat2[0][2]+mat1[0][1]*mat2[1][2]+mat1[0][2]*mat2[2][2]); + + result[1][0]=(mat1[1][0]*mat2[0][0]+mat1[1][1]*mat2[1][0]+mat1[1][2]*mat2[2][0]); + result[1][1]=(mat1[1][0]*mat2[0][1]+mat1[1][1]*mat2[1][1]+mat1[1][2]*mat2[2][1]); + result[1][2]=(mat1[1][0]*mat2[0][2]+mat1[1][1]*mat2[1][2]+mat1[1][2]*mat2[2][2]); + + result[2][0]=(mat1[2][0]*mat2[0][0]+mat1[2][1]*mat2[1][0]+mat1[2][2]*mat2[2][0]); + result[2][1]=(mat1[2][0]*mat2[0][1]+mat1[2][1]*mat2[1][1]+mat1[2][2]*mat2[2][1]); + result[2][2]=(mat1[2][0]*mat2[0][2]+mat1[2][1]*mat2[1][2]+mat1[2][2]*mat2[2][2]); + +} + + +short Op01m; +short Op01Zr; +short Op01Xr; +short Op01Yr; +short Op11m; +short Op11Zr; +short Op11Xr; +short Op11Yr; +short Op21m; +short Op21Zr; +short Op21Xr; +short Op21Yr; +double sc,sc2,sc3; + + + +#ifdef __OPT01__ +void DSPOp01() +{ +//puts("DSPOp01_"); + unsigned short zr,yr,xr; + + zr = Angle(Op01Zr); + xr = Angle(Op01Yr); + yr = Angle(Op01Xr); + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=Cos(xr); matrixB[1][2]=-Sin(xr); + matrixB[2][0]=0; matrixB[2][1]=Sin(xr); matrixB[2][2]=Cos(xr); + + matrixB2[0][0]=Cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=Sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-Sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=Cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=Cos(zr); matrixB2[0][1]=-Sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=Sin(zr); matrixB2[1][1]=Cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc = ((double)Op01m)/32768.0; + + matrixA[0][0]=matrixB[0][0]; matrixA[0][1]=matrixB[0][1]; matrixA[0][2]=matrixB[0][2]; + matrixA[1][0]=matrixB[1][0]; matrixA[1][1]=matrixB[1][1]; matrixA[1][2]=matrixB[1][2]; + matrixA[2][0]=matrixB[2][0]; matrixA[2][1]=matrixB[2][1]; matrixA[2][2]=matrixB[2][2]; + + #ifdef DebugDSP1 + Log_Message("OP01 ZR: %d XR: %d YR: %d",Op01Zr,Op01Xr,Op01Yr); + #endif +} + +#else + +void DSPOp01() +{ +//puts("DSPOp01"); + double zr,yr,xr; + + zr = ((double)Op01Zr)*6.2832/65536; + xr = ((double)Op01Yr)*6.2832/65536; + yr = ((double)Op01Xr)*6.2832/65536; + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=cos(xr); matrixB[1][2]=-sin(xr); + matrixB[2][0]=0; matrixB[2][1]=sin(xr); matrixB[2][2]=cos(xr); + + matrixB2[0][0]=cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=cos(zr); matrixB2[0][1]=-sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=sin(zr); matrixB2[1][1]=cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc = ((double)Op01m)/32768.0; + + matrixA[0][0]=matrixB[0][0]; matrixA[0][1]=matrixB[0][1]; matrixA[0][2]=matrixB[0][2]; + matrixA[1][0]=matrixB[1][0]; matrixA[1][1]=matrixB[1][1]; matrixA[1][2]=matrixB[1][2]; + matrixA[2][0]=matrixB[2][0]; matrixA[2][1]=matrixB[2][1]; matrixA[2][2]=matrixB[2][2]; + + #ifdef DebugDSP1 + Log_Message("OP01 ZR: %d XR: %d YR: %d",Op01Zr,Op01Xr,Op01Yr); + #endif +} +#endif + + +#ifdef __OPT11__ +void DSPOp11() +{ +//puts("DSPOp11_"); + short zr,yr,xr; + + zr = Angle(Op11Zr); + xr = Angle(Op11Yr); + yr = Angle(Op11Xr); + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=Cos(xr); matrixB[1][2]=-Sin(xr); + matrixB[2][0]=0; matrixB[2][1]=Sin(xr); matrixB[2][2]=Cos(xr); + + matrixB2[0][0]=Cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=Sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-Sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=Cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=Cos(zr); matrixB2[0][1]=-Sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=Sin(zr); matrixB2[1][1]=Cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc2 = ((double)Op11m)/32768.0; + + matrixA2[0][0]=matrixB[0][0]; matrixA2[0][1]=matrixB[0][1]; matrixA2[0][2]=matrixB[0][2]; + matrixA2[1][0]=matrixB[1][0]; matrixA2[1][1]=matrixB[1][1]; matrixA2[1][2]=matrixB[1][2]; + matrixA2[2][0]=matrixB[2][0]; matrixA2[2][1]=matrixB[2][1]; matrixA2[2][2]=matrixB[2][2]; + #ifdef DebugDSP1 + Log_Message("OP11 ZR: %d XR: %d YR: %d SC: %d",Op11Zr,Op11Xr,Op11Yr,Op11m); + #endif +} +#else + +void DSPOp11() +{ +//puts("DSPOp11"); + double zr,yr,xr; + + zr = ((double)Op11Zr)*6.2832/65536; + xr = ((double)Op11Yr)*6.2832/65536; + yr = ((double)Op11Xr)*6.2832/65536; + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=cos(xr); matrixB[1][2]=-sin(xr); + matrixB[2][0]=0; matrixB[2][1]=sin(xr); matrixB[2][2]=cos(xr); + + matrixB2[0][0]=cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=cos(zr); matrixB2[0][1]=-sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=sin(zr); matrixB2[1][1]=cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc2 = ((double)Op11m)/32768.0; + + matrixA2[0][0]=matrixB[0][0]; matrixA2[0][1]=matrixB[0][1]; matrixA2[0][2]=matrixB[0][2]; + matrixA2[1][0]=matrixB[1][0]; matrixA2[1][1]=matrixB[1][1]; matrixA2[1][2]=matrixB[1][2]; + matrixA2[2][0]=matrixB[2][0]; matrixA2[2][1]=matrixB[2][1]; matrixA2[2][2]=matrixB[2][2]; + #ifdef DebugDSP1 + Log_Message("OP11 ZR: %d XR: %d YR: %d SC: %d",Op11Zr,Op11Xr,Op11Yr,Op11m); + #endif +} +#endif + + +#ifdef __OPT21__ +void DSPOp21() +{ +//puts("DSPOp21_"); + short zr,yr,xr; + + zr = Angle(Op21Zr); + xr = Angle(Op21Yr); + yr = Angle(Op21Xr); + + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=Cos(xr); matrixB[1][2]=-Sin(xr); + matrixB[2][0]=0; matrixB[2][1]=Sin(xr); matrixB[2][2]=Cos(xr); + + matrixB2[0][0]=Cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=Sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-Sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=Cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=Cos(zr); matrixB2[0][1]=-Sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=Sin(zr); matrixB2[1][1]=Cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc3 = ((double)Op21m)/32768.0; + + matrixA3[0][0]=matrixB[0][0]; matrixA3[0][1]=matrixB[0][1]; matrixA3[0][2]=matrixB[0][2]; + matrixA3[1][0]=matrixB[1][0]; matrixA3[1][1]=matrixB[1][1]; matrixA3[1][2]=matrixB[1][2]; + matrixA3[2][0]=matrixB[2][0]; matrixA3[2][1]=matrixB[2][1]; matrixA3[2][2]=matrixB[2][2]; + #ifdef DebugDSP1 + Log_Message("OP21 ZR: %d XR: %d YR: %d",Op21Zr,Op21Xr,Op21Yr); + #endif +} +#else + +void DSPOp21() +{ +//puts("DSPOp21"); + double zr,yr,xr; + + zr = ((double)Op21Zr)*6.2832/65536; + xr = ((double)Op21Yr)*6.2832/65536; + yr = ((double)Op21Xr)*6.2832/65536; + + matrixB[0][0]=1; matrixB[0][1]=0; matrixB[0][2]=0; + matrixB[1][0]=0; matrixB[1][1]=cos(xr); matrixB[1][2]=-sin(xr); + matrixB[2][0]=0; matrixB[2][1]=sin(xr); matrixB[2][2]=cos(xr); + + matrixB2[0][0]=cos(yr); matrixB2[0][1]=0; matrixB2[0][2]=sin(yr); + matrixB2[1][0]=0; matrixB2[1][1]=1; matrixB2[1][2]=0; + matrixB2[2][0]=-sin(yr); matrixB2[2][1]=0; matrixB2[2][2]=cos(yr); + + MultMatrixB(matrixB3,matrixB,matrixB2); + + matrixB2[0][0]=cos(zr); matrixB2[0][1]=-sin(zr); matrixB2[0][2]=0; + matrixB2[1][0]=sin(zr); matrixB2[1][1]=cos(zr); matrixB2[1][2]=0; + matrixB2[2][0]=0; matrixB2[2][1]=0; matrixB2[2][2]=1; + + MultMatrixB(matrixB,matrixB3,matrixB2); + + sc3 = ((double)Op21m)/32768.0; + + matrixA3[0][0]=matrixB[0][0]; matrixA3[0][1]=matrixB[0][1]; matrixA3[0][2]=matrixB[0][2]; + matrixA3[1][0]=matrixB[1][0]; matrixA3[1][1]=matrixB[1][1]; matrixA3[1][2]=matrixB[1][2]; + matrixA3[2][0]=matrixB[2][0]; matrixA3[2][1]=matrixB[2][1]; matrixA3[2][2]=matrixB[2][2]; + #ifdef DebugDSP1 + Log_Message("OP21 ZR: %d XR: %d YR: %d",Op21Zr,Op21Xr,Op21Yr); + #endif +} +#endif + +short Op0DX; +short Op0DY; +short Op0DZ; +short Op0DF; +short Op0DL; +short Op0DU; +short Op1DX; +short Op1DY; +short Op1DZ; +short Op1DF; +short Op1DL; +short Op1DU; +short Op2DX; +short Op2DY; +short Op2DZ; +short Op2DF; +short Op2DL; +short Op2DU; + +#define swap(a,b) temp=a;a=b;b=temp; + +void DSPOp0D() +{ +//puts("DSPOp0D"); + double a,b,c,d,e,f,g,h,i,det,temp; + double a2,b2,c2,d2,e2,f2,g2,h2,i2,x,y,z; + + a = matrixA[0][0]; b=matrixA[0][1]; c=matrixA[0][2]; + d = matrixA[1][0]; e=matrixA[1][1]; f=matrixA[1][2]; + g = matrixA[2][0]; h=matrixA[2][1]; i=matrixA[2][2]; + //abc + //def + //ghi + det = a*e*i+b*f*g+c*d*h-g*e*c-h*f*a-i*d*b; + if (det==0) { + Op0DF=Op0DX; + Op0DL=Op0DY; + Op0DU=Op0DZ; + #ifdef DebugDSP1 + Log_Message("OP0D Error! Det == 0"); + #endif + return; + } + swap(d,b); swap(g,c); swap(h,f); + b=-b; d=-d; f=-f; h=-h; + a2=(e*i-h*f)/det; b2=(d*i-g*f)/det; c2=(d*h-g*e)/det; + d2=(b*i-h*c)/det; e2=(a*i-g*c)/det; f2=(a*h-g*b)/det; + g2=(b*f-e*c)/det; h2=(a*f-d*c)/det; i2=(a*e-d*b)/det; + x=Op0DX; y=Op0DY; z=Op0DZ; + Op0DF=(short)((x*a2+y*d2+z*g2)/2*sc); + Op0DL=(short)((x*b2+y*e2+z*h2)/2*sc); + Op0DU=(short)((x*c2+y*f2+z*i2)/2*sc); + + #ifdef DebugDSP1 + Log_Message("OP0D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op0DX,Op0DY,Op0DZ,Op0DF,Op0DL,Op0DU); + #endif +} + +void DSPOp1D() +{ +//puts("DSPOp1D"); + double a,b,c,d,e,f,g,h,i,det,temp; + double a2,b2,c2,d2,e2,f2,g2,h2,i2,x,y,z; + a = matrixA2[0][0]; b=matrixA2[0][1]; c=matrixA2[0][2]; + d = matrixA2[1][0]; e=matrixA2[1][1]; f=matrixA2[1][2]; + g = matrixA2[2][0]; h=matrixA2[2][1]; i=matrixA2[2][2]; + //abc + //def + //ghi + det = a*e*i+b*f*g+c*d*h-g*e*c-h*f*a-i*d*b; + if (det==0) { + Op1DF=0; Op1DL=0; Op1DU=0; + return; + } + swap(d,b); swap(g,c); swap(h,f); + b=-b; d=-d; f=-f; h=-h; + a2=(e*i-h*f)/det; b2=(d*i-g*f)/det; c2=(d*h-g*e)/det; + d2=(b*i-h*c)/det; e2=(a*i-g*c)/det; f2=(a*h-g*b)/det; + g2=(b*f-e*c)/det; h2=(a*f-d*c)/det; i2=(a*e-d*b)/det; + x=Op1DX; y=Op1DY; z=Op1DZ; + Op1DF=(short)((x*a2+y*d2+z*g2)/2*sc2); + Op1DL=(short)((x*b2+y*e2+z*h2)/2*sc2); + Op1DU=(short)((x*c2+y*f2+z*i2)/2*sc2); + #ifdef DebugDSP1 + Log_Message("OP1D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op1DX,Op1DY,Op1DZ,Op1DF,Op1DL,Op1DU); + #endif +} + +void DSPOp2D() +{ +//puts("DSPOp2D"); + double a,b,c,d,e,f,g,h,i,det,temp; + double a2,b2,c2,d2,e2,f2,g2,h2,i2,x,y,z; + a = matrixA3[0][0]; b=matrixA3[0][1]; c=matrixA3[0][2]; + d = matrixA3[1][0]; e=matrixA3[1][1]; f=matrixA3[1][2]; + g = matrixA3[2][0]; h=matrixA3[2][1]; i=matrixA3[2][2]; + //abc + //def + //ghi + det = a*e*i+b*f*g+c*d*h-g*e*c-h*f*a-i*d*b; + if (det==0) { + Op2DF=0; Op2DL=0; Op2DU=0; + return; + } + swap(d,b); swap(g,c); swap(h,f); + b=-b; d=-d; f=-f; h=-h; + a2=(e*i-h*f)/det; b2=(d*i-g*f)/det; c2=(d*h-g*e)/det; + d2=(b*i-h*c)/det; e2=(a*i-g*c)/det; f2=(a*h-g*b)/det; + g2=(b*f-e*c)/det; h2=(a*f-d*c)/det; i2=(a*e-d*b)/det; + x=Op2DX; y=Op2DY; z=Op2DZ; + Op2DF=(short)((x*a2+y*d2+z*g2)/2*sc3); + Op2DL=(short)((x*b2+y*e2+z*h2)/2*sc3); + Op2DU=(short)((x*c2+y*f2+z*i2)/2*sc3); + #ifdef DebugDSP1 + Log_Message("OP2D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op2DX,Op2DY,Op2DZ,Op2DF,Op2DL,Op2DU); + #endif +} + +short Op03F; +short Op03L; +short Op03U; +short Op03X; +short Op03Y; +short Op03Z; +short Op13F; +short Op13L; +short Op13U; +short Op13X; +short Op13Y; +short Op13Z; +short Op23F; +short Op23L; +short Op23U; +short Op23X; +short Op23Y; +short Op23Z; + +void DSPOp03() +{ +//puts("DSPOp03"); + double F,L,U; + + F=Op03F; L=Op03L; U=Op03U; + Op03X=(short)((F*matrixA[0][0]+L*matrixA[1][0]+U*matrixA[2][0])/2*sc); + Op03Y=(short)((F*matrixA[0][1]+L*matrixA[1][1]+U*matrixA[2][1])/2*sc); + Op03Z=(short)((F*matrixA[0][2]+L*matrixA[1][2]+U*matrixA[2][2])/2*sc); + + #ifdef DebugDSP1 + Log_Message("OP03 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op03F,Op03L,Op03U,Op03X,Op03Y,Op03Z); + #endif +} + +void DSPOp13() +{ +//puts("DSPOp13"); + double F,L,U; + F=Op13F; L=Op13L; U=Op13U; + Op13X=(short)((F*matrixA2[0][0]+L*matrixA2[1][0]+U*matrixA2[2][0])/2*sc2); + Op13Y=(short)((F*matrixA2[0][1]+L*matrixA2[1][1]+U*matrixA2[2][1])/2*sc2); + Op13Z=(short)((F*matrixA2[0][2]+L*matrixA2[1][2]+U*matrixA2[2][2])/2*sc2); + #ifdef DebugDSP1 + Log_Message("OP13 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op13F,Op13L,Op13U,Op13X,Op13Y,Op13Z); + #endif +} + +void DSPOp23() +{ +//puts("DSPOp23"); + double F,L,U; + F=Op23F; L=Op23L; U=Op23U; + Op23X=(short)((F*matrixA3[0][0]+L*matrixA3[1][0]+U*matrixA3[2][0])/2*sc3); + Op23Y=(short)((F*matrixA3[0][1]+L*matrixA3[1][1]+U*matrixA3[2][1])/2*sc3); + Op23Z=(short)((F*matrixA3[0][2]+L*matrixA3[1][2]+U*matrixA3[2][2])/2*sc3); + #ifdef DebugDSP1 + Log_Message("OP23 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op23F,Op23L,Op23U,Op23X,Op23Y,Op23Z); + #endif +} + +short Op14Zr; +short Op14Xr; +short Op14Yr; +short Op14U; +short Op14F; +short Op14L; +short Op14Zrr; +short Op14Xrr; +short Op14Yrr; + +double Op14Temp; +void DSPOp14() +{ +//puts("DSPOp14"); + Op14Temp=(Op14Zr*6.2832/65536.0)+(1/cos(Op14Xr*6.2832/65536.0))*((Op14U*6.2832/65536.0)*cos(Op14Yr*6.2832/65536.0)-(Op14F*6.2832/65536.0)*sin(Op14Yr*6.2832/65536.0)); + Op14Zrr=(short)(Op14Temp*65536.0/6.2832); + Op14Temp=(Op14Xr*6.2832/65536.0)+((Op14U*6.2832/65536.0)*sin(Op14Yr*6.2832/65536.0)+(Op14F*6.2832/65536.0)*cos(Op14Yr*6.2832/65536.0)); + Op14Xrr=(short)(Op14Temp*65536.0/6.2832); + Op14Temp=(Op14Yr*6.2832/65536.0)-tan(Op14Xr*6.2832/65536.0)*((Op14U*6.2832/65536.0)*cos(Op14Yr*6.2832/65536.0)+(Op14F*6.2832/65536.0)*sin(Op14Yr*6.2832/65536.0))+(Op14L*6.2832/65536.0); + Op14Yrr=(short)(Op14Temp*65536.0/6.2832); + #ifdef DebugDSP1 + Log_Message("OP14 X:%d Y%d Z:%D U:%d F:%d L:%d",Op14Xr,Op14Yr,Op14Zr,Op14U,Op14F,Op14L); + Log_Message("OP14 X:%d Y%d Z:%D",Op14Xrr,Op14Yrr,Op14Zrr); + #endif +} + +short Op0EH; +short Op0EV; +short Op0EX; +short Op0EY; + +void DSPOp0E() +{ +//puts("DSPOp0E"); + + // screen Directions UP + RVPos = Op0EV; + RHPos = Op0EH; + GetRXYPos(); + Op0EX = (short)(RXRes); + Op0EY = (short)(RYRes); + + #ifdef DebugDSP1 + Log_Message("OP0E COORDINATE H:%d V:%d X:%d Y:%d",Op0EH,Op0EV,Op0EX,Op0EY); + #endif +} + +short Op0BX; +short Op0BY; +short Op0BZ; +short Op0BS; +short Op1BX; +short Op1BY; +short Op1BZ; +short Op1BS; +short Op2BX; +short Op2BY; +short Op2BZ; +short Op2BS; + +void DSPOp0B() +{ +//puts("DSPOp0B"); + Op0BS = (short)((Op0BX*matrixA[0][0]+Op0BY*matrixA2[0][1]+Op0BZ*matrixA2[0][2])); +#ifdef DebugDSP1 + Log_Message("OP0B"); +#endif +} + +void DSPOp1B() +{ +//puts("DSPOp1B"); + Op1BS = (short)((Op1BX*matrixA2[0][0]+Op1BY*matrixA2[0][1]+Op1BZ*matrixA2[0][2])); +#ifdef DebugDSP1 + Log_Message("OP1B X: %d Y: %d Z: %d S: %d",Op1BX,Op1BY,Op1BZ,Op1BS); + Log_Message(" MX: %d MY: %d MZ: %d Scale: %d",(short)(matrixA2[0][0]*100),(short)(matrixA2[0][1]*100),(short)(matrixA2[0][2]*100),(short)(sc2*100)); +#endif + +} + +void DSPOp2B() +{ +//puts("DSPOp2B"); + Op2BS = (short)((Op2BX*matrixA3[0][0]+Op2BY*matrixA3[0][1]+Op2BZ*matrixA3[0][2])); +#ifdef DebugDSP1 + Log_Message("OP2B"); +#endif +} + +short Op08X,Op08Y,Op08Z,Op08Ll,Op08Lh; +long Op08Size; + +void DSPOp08() +{ +//puts("DSPOp08"); + // This is bit accurate to DSP1B when compiled with VC 6 on a P4 + + Op08Size=(Op08X*Op08X+Op08Y*Op08Y+Op08Z*Op08Z)*2; + Op08Ll = Op08Size&0xFFFF; + Op08Lh = (Op08Size>>16) & 0xFFFF; + #ifdef DebugDSP1 + Log_Message("OP08 %d,%d,%d",Op08X,Op08Y,Op08Z); + Log_Message("OP08 ((Op08X^2)+(Op08Y^2)+(Op08X^2))=%x",Op08Size ); + #endif +} + +short Op18X,Op18Y,Op18Z,Op18R,Op18D; + +void DSPOp18() +{ +//puts("DSPOp18"); + // This is bit accurate to DSP1B when compiled with VC6 on a P4 + + int x,y,z,r; // int32 + x=Op18X; y=Op18Y; z=Op18Z; r=Op18R; + r = (x*x+y*y+z*z-r*r); + Op18D=(short) (r >> 15); + #ifdef DebugDSP1 + Log_Message("OP18 X: %d Y: %d Z: %d R: %D DIFF %d",Op18X,Op18Y,Op18Z,Op18D); + #endif +} + +short Op28X; +short Op28Y; +short Op28Z; +short Op28R; + +void DSPOp28() +{ +//puts("DSPOp28"); + // This works pretty good until r overflows from 0x7fff, then it goes to h*ll. + // Hopefully games don't count on overflow cases matching the DSP + + Op28R=(short)sqrt(Op28X*Op28X+Op28Y*Op28Y+Op28Z*Op28Z); + #ifdef DebugDSP1 + Log_Message("OP28 X:%d Y:%d Z:%d",Op28X,Op28Y,Op28Z); + Log_Message("OP28 Vector Length %d",Op28R); + #endif +} + +short Op1CX,Op1CY,Op1CZ; +short Op1CXBR,Op1CYBR,Op1CZBR,Op1CXAR,Op1CYAR,Op1CZAR; +short Op1CX1; +short Op1CY1; +short Op1CZ1; +short Op1CX2; +short Op1CY2; +short Op1CZ2; + +#ifdef __OPT1C__ +void DSPOp1C() +{ +//puts("DSPOp1C_"); + short ya,xa,za; + ya = Angle(Op1CX); + xa = Angle(Op1CY); + za = Angle(Op1CZ); + + // rotate around Z + Op1CX1=(short)((Op1CXBR*Cos(za)+Op1CYBR*Sin(za))); + Op1CY1=(short)((Op1CXBR*-Sin(za)+Op1CYBR*Cos(za))); + Op1CZ1=Op1CZBR; + // rotate around Y + Op1CX2=(short)((Op1CX1*Cos(ya)+Op1CZ1*-Sin(ya))); + Op1CY2=Op1CY1; + Op1CZ2=(short)((Op1CX1*Sin(ya)+Op1CZ1*Cos(ya))); + // rotate around X + Op1CXAR=Op1CX2; + Op1CYAR=(short)((Op1CY2*Cos(xa)+Op1CZ2*Sin(xa))); + Op1CZAR=(short)((Op1CY2*-Sin(xa)+Op1CZ2*Cos(xa))); + + #ifdef DebugDSP1 + Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ",Op1CXAR,Op1CYAR,Op1CZAR); + #endif +} +#else +void DSPOp1C() +{ +//puts("DSPOp1C"); + double ya,xa,za; + ya = Op1CX/32768.0*PI; + xa = Op1CY/32768.0*PI; + za = Op1CZ/32768.0*PI; + // rotate around Z + Op1CX1=(Op1CXBR*cos(za)+Op1CYBR*sin(za)); + Op1CY1=(Op1CXBR*-sin(za)+Op1CYBR*cos(za)); + Op1CZ1=Op1CZBR; + // rotate around Y + Op1CX2=(Op1CX1*cos(ya)+Op1CZ1*-sin(ya)); + Op1CY2=Op1CY1; + Op1CZ2=(Op1CX1*sin(ya)+Op1CZ1*cos(ya)); + // rotate around X + Op1CXAR=Op1CX2; + Op1CYAR=(Op1CY2*cos(xa)+Op1CZ2*sin(xa)); + Op1CZAR=(Op1CY2*-sin(xa)+Op1CZ2*cos(xa)); + + #ifdef DebugDSP1 + Log_Message("OP1C Apply Matrix CX:%d CY:%d CZ",Op1CXAR,Op1CYAR,Op1CZAR); + #endif +} + +#endif + +// Op 0F = Test DSP1 RAM +// Returns 0x0000 if RAM checks OK + +unsigned short Op0FRamsize; +unsigned short Op0FPass; + +void DSPOp0F() +{ +//puts("DSPOp0F"); + // We use our PC's RAM, not DSP1 RAM but we need to pass the RAM check + Op0FPass = 0x0000; + return; + + #ifdef DebugDSP1 + Log_Message("OP0F RAM Test Pass:%d", Op0FPass); + #endif +} diff --git a/src/dsp2emu.c b/src/dsp2emu.c new file mode 100644 index 0000000..7b74c3b --- /dev/null +++ b/src/dsp2emu.c @@ -0,0 +1,342 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + + +uint16 DSP2Op09Word1=0; +uint16 DSP2Op09Word2=0; +bool DSP2Op05HasLen=false; +int DSP2Op05Len=0; +bool DSP2Op06HasLen=false; +int DSP2Op06Len=0; +uint8 DSP2Op05Transparent=0; + +void DSP2_Op05 () +{ + uint8 color; + // Overlay bitmap with transparency. + // Input: + // + // Bitmap 1: i[0] <=> i[size-1] + // Bitmap 2: i[size] <=> i[2*size-1] + // + // Output: + // + // Bitmap 3: o[0] <=> o[size-1] + // + // Processing: + // + // Process all 4-bit pixels (nibbles) in the bitmap + // + // if ( BM2_pixel == transparent_color ) + // pixelout = BM1_pixel + // else + // pixelout = BM2_pixel + + // The max size bitmap is limited to 255 because the size parameter is a byte + // I think size=0 is an error. The behavior of the chip on size=0 is to + // return the last value written to DR if you read DR on Op05 with + // size = 0. I don't think it's worth implementing this quirk unless it's + // proven necessary. + + int n; + unsigned char c1; + unsigned char c2; + unsigned char *p1 = DSP1.parameters; + unsigned char *p2 = &DSP1.parameters[DSP2Op05Len]; + unsigned char *p3 = DSP1.output; + + color = DSP2Op05Transparent&0x0f; + + for( n = 0; n < DSP2Op05Len; n++ ) + { + c1 = *p1++; + c2 = *p2++; + *p3++ = ( ((c2 >> 4) == color ) ? c1 & 0xf0: c2 & 0xf0 ) | + ( ((c2 & 0x0f)==color) ? c1 & 0x0f: c2 & 0x0f ); + } +} + +void DSP2_Op01 () +{ + // Op01 size is always 32 bytes input and output. + // The hardware does strange things if you vary the size. + + int j; + unsigned char c0, c1, c2, c3; + unsigned char *p1 = DSP1.parameters; + unsigned char *p2a = DSP1.output; + unsigned char *p2b = &DSP1.output[16]; // halfway + + // Process 8 blocks of 4 bytes each + + for ( j = 0; j < 8; j++ ) + { + c0 = *p1++; + c1 = *p1++; + c2 = *p1++; + c3 = *p1++; + + *p2a++ = (c0 & 0x10) << 3 | + (c0 & 0x01) << 6 | + (c1 & 0x10) << 1 | + (c1 & 0x01) << 4 | + (c2 & 0x10) >> 1 | + (c2 & 0x01) << 2 | + (c3 & 0x10) >> 3 | + (c3 & 0x01); + + *p2a++ = (c0 & 0x20) << 2 | + (c0 & 0x02) << 5 | + (c1 & 0x20) | + (c1 & 0x02) << 3 | + (c2 & 0x20) >> 2 | + (c2 & 0x02) << 1 | + (c3 & 0x20) >> 4 | + (c3 & 0x02) >> 1; + + *p2b++ = (c0 & 0x40) << 1 | + (c0 & 0x04) << 4 | + (c1 & 0x40) >> 1 | + (c1 & 0x04) << 2 | + (c2 & 0x40) >> 3 | + (c2 & 0x04) | + (c3 & 0x40) >> 5 | + (c3 & 0x04) >> 2; + + + *p2b++ = (c0 & 0x80) | + (c0 & 0x08) << 3 | + (c1 & 0x80) >> 2 | + (c1 & 0x08) << 1 | + (c2 & 0x80) >> 4 | + (c2 & 0x08) >> 1 | + (c3 & 0x80) >> 6 | + (c3 & 0x08) >> 3; + } + return; +} + +void DSP2_Op06 () +{ + // Input: + // size + // bitmap + + int i, j; + + for ( i = 0, j = DSP2Op06Len - 1; i < DSP2Op06Len; i++, j-- ) + { + DSP1.output[j] = (DSP1.parameters[i] << 4) | (DSP1.parameters[i] >> 4); + } +} + +bool DSP2Op0DHasLen=false; +int DSP2Op0DOutLen=0; +int DSP2Op0DInLen=0; + +#ifndef DSP2_BIT_ACCURRATE_CODE + +// Scale bitmap based on input length out output length + +void DSP2_Op0D() +{ + // Overload's algorithm - use this unless doing hardware testing + + // One note: the HW can do odd byte scaling but since we divide + // by two to get the count of bytes this won't work well for + // odd byte scaling (in any of the current algorithm implementations). + // So far I haven't seen Dungeon Master use it. + // If it does we can adjust the parameters and code to work with it + + int i; + int pixel_offset; + uint8 pixelarray[512]; + + for(i=0; i>1] >> 4; + else + pixelarray[i] = DSP1.parameters[pixel_offset>>1] & 0x0f; + } + + for ( i=0; i < DSP2Op0DOutLen; i++ ) + DSP1.output[i] = ( pixelarray[i<<1] << 4 ) | pixelarray[(i<<1)+1]; +} + +#else + +void DSP2_Op0D() +{ + // Bit accurate hardware algorithm - uses fixed point math + // This should match the DSP2 Op0D output exactly + // I wouldn't recommend using this unless you're doing hardware debug. + // In some situations it has small visual artifacts that + // are not readily apparent on a TV screen but show up clearly + // on a monitor. Use Overload's scaling instead. + // This is for hardware verification testing. + // + // One note: the HW can do odd byte scaling but since we divide + // by two to get the count of bytes this won't work well for + // odd byte scaling (in any of the current algorithm implementations). + // So far I haven't seen Dungeon Master use it. + // If it does we can adjust the parameters and code to work with it + + + uint32 multiplier; // Any size int >= 32-bits + uint32 pixloc; // match size of multiplier + int i, j; + uint8 pixelarray[512]; + + if (DSP2Op0DInLen <= DSP2Op0DOutLen) + multiplier = 0x10000; // In our self defined fixed point 0x10000 == 1 + else + multiplier = (DSP2Op0DInLen << 17) / ((DSP2Op0DOutLen<<1) + 1); + + pixloc = 0; + for ( i=0; i < DSP2Op0DOutLen * 2; i++ ) + { + j = pixloc >> 16; + + if ( j & 1 ) + pixelarray[i] = DSP1.parameters[j>>1] & 0x0f; + else + pixelarray[i] = (DSP1.parameters[j>>1] & 0xf0) >> 4; + + pixloc += multiplier; + } + + for ( i=0; i < DSP2Op0DOutLen; i++ ) + DSP1.output[i] = ( pixelarray[i<<1] << 4 ) | pixelarray[(i<<1)+1]; +} + +#endif + +#if 0 // Probably no reason to use this code - it's not quite bit accurate and it doesn't look as good as Overload's algorithm + +void DSP2_Op0D() +{ + // Float implementation of Neviksti's algorithm + // This is the right algorithm to match the DSP2 bits but the precision + // of the PC float does not match the precision of the fixed point math + // on the DSP2 causing occasional one off data mismatches (which should + // be no problem because its just a one pixel difference in a scaled image + // to be displayed). + + float multiplier; + float pixloc; + int i, j; + uint8 pixelarray[512]; + + if (DSP2Op0DInLen <= DSP2Op0DOutLen) + multiplier = (float) 1.0; + else + multiplier = (float) ((DSP2Op0DInLen * 2.0) / (DSP2Op0DOutLen * 2.0 + 1.0)); + + pixloc = 0.0; + for ( i=0; i < DSP2Op0DOutLen * 2; i++ ) + { + // j = (int)(i * multiplier); + j = (int) pixloc; + + if ( j & 1 ) + pixelarray[i] = DSP1.parameters[j>>1] & 0x0f; + else + pixelarray[i] = (DSP1.parameters[j>>1] & 0xf0) >> 4; + + pixloc += multiplier; // use an add in the loop instead of multiply to increase loop speed + } + + for ( i=0; i < DSP2Op0DOutLen; i++ ) + DSP1.output[i] = ( pixelarray[i<<1] << 4 ) | pixelarray[(i<<1)+1]; +} + +#endif + diff --git a/src/dsp3emu.cpp b/src/dsp3emu.cpp new file mode 100644 index 0000000..b96af84 --- /dev/null +++ b/src/dsp3emu.cpp @@ -0,0 +1,729 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +uint16 DSP3_DataROM[1024] = { + 0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, + 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, + 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, + 0x0000, 0x000f, 0x0400, 0x0200, 0x0140, 0x0400, 0x0200, 0x0040, + 0x007d, 0x007e, 0x007e, 0x007b, 0x007c, 0x007d, 0x007b, 0x007c, + 0x0002, 0x0020, 0x0030, 0x0000, 0x000d, 0x0019, 0x0026, 0x0032, + 0x003e, 0x004a, 0x0056, 0x0062, 0x006d, 0x0079, 0x0084, 0x008e, + 0x0098, 0x00a2, 0x00ac, 0x00b5, 0x00be, 0x00c6, 0x00ce, 0x00d5, + 0x00dc, 0x00e2, 0x00e7, 0x00ec, 0x00f1, 0x00f5, 0x00f8, 0x00fb, + 0x00fd, 0x00ff, 0x0100, 0x0100, 0x0100, 0x00ff, 0x00fd, 0x00fb, + 0x00f8, 0x00f5, 0x00f1, 0x00ed, 0x00e7, 0x00e2, 0x00dc, 0x00d5, + 0x00ce, 0x00c6, 0x00be, 0x00b5, 0x00ac, 0x00a2, 0x0099, 0x008e, + 0x0084, 0x0079, 0x006e, 0x0062, 0x0056, 0x004a, 0x003e, 0x0032, + 0x0026, 0x0019, 0x000d, 0x0000, 0xfff3, 0xffe7, 0xffdb, 0xffce, + 0xffc2, 0xffb6, 0xffaa, 0xff9e, 0xff93, 0xff87, 0xff7d, 0xff72, + 0xff68, 0xff5e, 0xff54, 0xff4b, 0xff42, 0xff3a, 0xff32, 0xff2b, + 0xff25, 0xff1e, 0xff19, 0xff14, 0xff0f, 0xff0b, 0xff08, 0xff05, + 0xff03, 0xff01, 0xff00, 0xff00, 0xff00, 0xff01, 0xff03, 0xff05, + 0xff08, 0xff0b, 0xff0f, 0xff13, 0xff18, 0xff1e, 0xff24, 0xff2b, + 0xff32, 0xff3a, 0xff42, 0xff4b, 0xff54, 0xff5d, 0xff67, 0xff72, + 0xff7c, 0xff87, 0xff92, 0xff9e, 0xffa9, 0xffb5, 0xffc2, 0xffce, + 0xffda, 0xffe7, 0xfff3, 0x002b, 0x007f, 0x0020, 0x00ff, 0xff00, + 0xffbe, 0x0000, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0x0045, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0x0047, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0x004a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x004e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0x0053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0x0059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0x0068, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0071, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0x007b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0050, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x006b, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0044, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0054, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0065, + 0xffbe, 0x0000, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0xfead, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0xfeaf, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0xfeb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0xfeb6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0xfebb, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0xfec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0xfec8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0xfed0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0xfed9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0xfee3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0xfeb8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0xfec5, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0xfed3, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0xfeac, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0xfebc, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0xfecd, + 0x0154, 0x0218, 0x0110, 0x00b0, 0x00cc, 0x00b0, 0x0088, 0x00b0, + 0x0044, 0x00b0, 0x0000, 0x00b0, 0x00fe, 0xff07, 0x0002, 0x00ff, + 0x00f8, 0x0007, 0x00fe, 0x00ee, 0x07ff, 0x0200, 0x00ef, 0xf800, + 0x0700, 0x00ee, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, + 0xffff, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0001, 0x0000, 0x0001, + 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, + 0xffff, 0x0001, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, + 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0044, 0x0088, 0x00cc, + 0x0110, 0x0154, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +#ifdef __WIN32__ + void (__cdecl *SetDSP3)(void); +#else + void (*SetDSP3)(void); +#endif + +uint16 DSP3_DR; +uint16 DSP3_SR; +uint16 DSP3_MemoryIndex; + +void DSP3_MemorySize() +{ + DSP3_DR = 0x0300; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_TestMemory() +{ + DSP3_DR = 0x0000; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_DumpDataROM() +{ + DSP3_DR = DSP3_DataROM[DSP3_MemoryIndex++]; + if (DSP3_MemoryIndex == 1024) + SetDSP3 = &DSP3_Reset; +} + +void DSP3_MemoryDump() +{ + DSP3_MemoryIndex = 0; + SetDSP3 = &DSP3_DumpDataROM; + DSP3_DumpDataROM(); +} + +int16 DSP3_WinLo; +int16 DSP3_WinHi; + +void DSP3_OP06() +{ + DSP3_WinLo = (uint8)(DSP3_DR); + DSP3_WinHi = (uint8)(DSP3_DR >> 8); + DSP3_Reset(); +} + +void DSP3_OP03() +{ + int16 Lo = (uint8)(DSP3_DR); + int16 Hi = (uint8)(DSP3_DR >> 8); + int16 Ofs = (DSP3_WinLo * Hi << 1) + (Lo << 1); + DSP3_DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +int16 DSP3_AddLo; +int16 DSP3_AddHi; + +void DSP3_OP07_B() +{ + int16 Ofs = (DSP3_WinLo * DSP3_AddHi << 1) + (DSP3_AddLo << 1); + DSP3_DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_OP07_A() +{ + int16 Lo = (uint8)(DSP3_DR); + int16 Hi = (uint8)(DSP3_DR >> 8); + + if (Lo & 1) Hi += (DSP3_AddLo & 1); + + DSP3_AddLo += Lo; + DSP3_AddHi += Hi; + + if (DSP3_AddLo < 0) + DSP3_AddLo += DSP3_WinLo; + else + if (DSP3_AddLo >= DSP3_WinLo) + DSP3_AddLo -= DSP3_WinLo; + + if (DSP3_AddHi < 0) + DSP3_AddHi += DSP3_WinHi; + else + if (DSP3_AddHi >= DSP3_WinHi) + DSP3_AddHi -= DSP3_WinHi; + + DSP3_DR = DSP3_AddLo | (DSP3_AddHi << 8) | ((DSP3_AddHi >> 8) & 0xff); + SetDSP3 = &DSP3_OP07_B; +} + +void DSP3_OP07() +{ + uint32 dataOfs = ((DSP3_DR << 1) + 0x03b2) & 0x03ff; + + DSP3_AddHi = DSP3_DataROM[dataOfs]; + DSP3_AddLo = DSP3_DataROM[dataOfs + 1]; + + SetDSP3 = &DSP3_OP07_A; + DSP3_SR = 0x0080; +} + +uint16 DSP3_Codewords; +uint16 DSP3_Outwords; +uint16 DSP3_Symbol; +uint16 DSP3_BitCount; +uint16 DSP3_Index; +uint16 DSP3_Codes[512]; +uint16 DSP3_BitsLeft; +uint16 DSP3_ReqBits; +uint16 DSP3_ReqData; +uint16 DSP3_BitCommand; +uint8 DSP3_BaseLength; +uint16 DSP3_BaseCodes; +uint16 DSP3_BaseCode; +uint8 DSP3_CodeLengths[8]; +uint16 DSP3_CodeOffsets[8]; +uint16 DSP3_LZCode; +uint8 DSP3_LZLength; + +uint16 DSP3_X; +uint16 DSP3_Y; + +void DSP3_Coordinate() +{ + DSP3_Index++; + + switch (DSP3_Index) + { + case 3: + { + if (DSP3_DR == 0xffff) + DSP3_Reset(); + break; + } + case 4: + { + DSP3_X = DSP3_DR; + break; + } + case 5: + { + DSP3_Y = DSP3_DR; + DSP3_DR = 1; + break; + } + case 6: + { + DSP3_DR = DSP3_X; + break; + } + case 7: + { + DSP3_DR = DSP3_Y; + DSP3_Index = 0; + break; + } + } +} + +uint8 DSP3_Bitmap[8]; +uint8 DSP3_Bitplane[8]; +uint16 DSP3_BMIndex; +uint16 DSP3_BPIndex; +uint16 DSP3_Count; + +void DSP3_Convert_A() +{ + if (DSP3_BMIndex < 8) + { + DSP3_Bitmap[DSP3_BMIndex++] = (uint8) (DSP3_DR); + DSP3_Bitmap[DSP3_BMIndex++] = (uint8) (DSP3_DR >> 8); + + if (DSP3_BMIndex == 8) + { + for (short i=0; i < 8; i++) + for (short j=0; j < 8; j++) + { + DSP3_Bitplane[j] <<= 1; + DSP3_Bitplane[j] |= (DSP3_Bitmap[i] >> j) & 1; + } + + DSP3_BPIndex = 0; + DSP3_Count--; + } + } + + if (DSP3_BMIndex == 8) + { + if (DSP3_BPIndex == 8) + { + if (!DSP3_Count) DSP3_Reset(); + DSP3_BMIndex = 0; + } + else + { + DSP3_DR = DSP3_Bitplane[DSP3_BPIndex++]; + DSP3_DR |= DSP3_Bitplane[DSP3_BPIndex++] << 8; + } + } +} + +void DSP3_Convert() +{ + DSP3_Count = DSP3_DR; + DSP3_BMIndex = 0; + SetDSP3 = &DSP3_Convert_A; +} + +bool DSP3_GetBits(uint8 Count) +{ + if (!DSP3_BitsLeft) + { + DSP3_BitsLeft = Count; + DSP3_ReqBits = 0; + } + + do { + if (!DSP3_BitCount) + { + DSP3_SR = 0xC0; + return false; + } + + DSP3_ReqBits <<= 1; + if (DSP3_ReqData & 0x8000) DSP3_ReqBits++; + DSP3_ReqData <<= 1; + + DSP3_BitCount--; + DSP3_BitsLeft--; + + } while (DSP3_BitsLeft); + + return true; +} + +void DSP3_Decode_Data() +{ + if (!DSP3_BitCount) + { + if (DSP3_SR & 0x40) + { + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + } + else + { + DSP3_SR = 0xC0; + return; + } + } + + if (DSP3_LZCode == 1) + { + if (!DSP3_GetBits(1)) + return; + + if (DSP3_ReqBits) + DSP3_LZLength = 12; + else + DSP3_LZLength = 8; + + DSP3_LZCode++; + } + + if (DSP3_LZCode == 2) + { + if (!DSP3_GetBits(DSP3_LZLength)) + return; + + DSP3_LZCode = 0; + DSP3_Outwords--; + if (!DSP3_Outwords) SetDSP3 = &DSP3_Reset; + + DSP3_SR = 0x80; + DSP3_DR = DSP3_ReqBits; + return; + } + + if (DSP3_BaseCode == 0xffff) + { + if (!DSP3_GetBits(DSP3_BaseLength)) + return; + + DSP3_BaseCode = DSP3_ReqBits; + } + + if (!DSP3_GetBits(DSP3_CodeLengths[DSP3_BaseCode])) + return; + + DSP3_Symbol = DSP3_Codes[DSP3_CodeOffsets[DSP3_BaseCode] + DSP3_ReqBits]; + DSP3_BaseCode = 0xffff; + + if (DSP3_Symbol & 0xff00) + { + DSP3_Symbol += 0x7f02; + DSP3_LZCode++; + } + else + { + DSP3_Outwords--; + if (!DSP3_Outwords) + SetDSP3 = &DSP3_Reset; + } + + DSP3_SR = 0x80; + DSP3_DR = DSP3_Symbol; +} + +void DSP3_Decode_Tree() +{ + if (!DSP3_BitCount) + { + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + } + + if (!DSP3_BaseCodes) + { + DSP3_GetBits(1); + if (DSP3_ReqBits) + { + DSP3_BaseLength = 3; + DSP3_BaseCodes = 8; + } + else + { + DSP3_BaseLength = 2; + DSP3_BaseCodes = 4; + } + } + + while (DSP3_BaseCodes) + { + if (!DSP3_GetBits(3)) + return; + + DSP3_ReqBits++; + + DSP3_CodeLengths[DSP3_Index] = (uint8) DSP3_ReqBits; + DSP3_CodeOffsets[DSP3_Index] = DSP3_Symbol; + DSP3_Index++; + + DSP3_Symbol += 1 << DSP3_ReqBits; + DSP3_BaseCodes--; + } + + DSP3_BaseCode = 0xffff; + DSP3_LZCode = 0; + + SetDSP3 = &DSP3_Decode_Data; + if (DSP3_BitCount) DSP3_Decode_Data(); +} + +void DSP3_Decode_Symbols() +{ + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + + do { + + if (DSP3_BitCommand == 0xffff) + { + if (!DSP3_GetBits(2)) return; + DSP3_BitCommand = DSP3_ReqBits; + } + + switch (DSP3_BitCommand) + { + case 0: + { + if (!DSP3_GetBits(9)) return; + DSP3_Symbol = DSP3_ReqBits; + break; + } + case 1: + { + DSP3_Symbol++; + break; + } + case 2: + { + if (!DSP3_GetBits(1)) return; + DSP3_Symbol += 2 + DSP3_ReqBits; + break; + } + case 3: + { + if (!DSP3_GetBits(4)) return; + DSP3_Symbol += 4 + DSP3_ReqBits; + break; + } + } + + DSP3_BitCommand = 0xffff; + + DSP3_Codes[DSP3_Index++] = DSP3_Symbol; + DSP3_Codewords--; + + } while (DSP3_Codewords); + + DSP3_Index = 0; + DSP3_Symbol = 0; + DSP3_BaseCodes = 0; + + SetDSP3 = &DSP3_Decode_Tree; + if (DSP3_BitCount) DSP3_Decode_Tree(); +} + +void DSP3_Decode_A() +{ + DSP3_Outwords = DSP3_DR; + SetDSP3 = &DSP3_Decode_Symbols; + DSP3_BitCount = 0; + DSP3_BitsLeft = 0; + DSP3_Symbol = 0; + DSP3_Index = 0; + DSP3_BitCommand = 0xffff; + DSP3_SR = 0xC0; +} + +void DSP3_Decode() +{ + DSP3_Codewords = DSP3_DR; + SetDSP3 = &DSP3_Decode_A; +} + +void DSP3_Command() +{ + if (DSP3_DR < 0x40) + { + switch (DSP3_DR) + { + case 0x02: SetDSP3 = &DSP3_Coordinate; break; + case 0x03: SetDSP3 = &DSP3_OP03; break; + case 0x06: SetDSP3 = &DSP3_OP06; break; + case 0x07: SetDSP3 = &DSP3_OP07; return; + case 0x0f: SetDSP3 = &DSP3_TestMemory; break; + case 0x18: SetDSP3 = &DSP3_Convert; break; + case 0x1f: SetDSP3 = &DSP3_MemoryDump; break; + case 0x2f: SetDSP3 = &DSP3_MemorySize; break; + case 0x38: SetDSP3 = &DSP3_Decode; break; + } + DSP3_SR = 0x0080; + DSP3_Index = 0; + } +} + +void DSP3_Reset() +{ + DSP3_DR = 0x0080; + DSP3_SR = 0x0084; + SetDSP3 = &DSP3_Command; +} + +void DSP3SetByte(uint8 byte, uint16 address) +{ + if ((address & 0xC000) == 0x8000) + { + if (DSP3_SR & 0x04) + { + DSP3_DR = (DSP3_DR & 0xff00) + byte; + (*SetDSP3)(); + } + else + { + DSP3_SR ^= 0x10; + + if (DSP3_SR & 0x10) + DSP3_DR = (DSP3_DR & 0xff00) + byte; + else + { + DSP3_DR = (DSP3_DR & 0x00ff) + (byte << 8); + (*SetDSP3)(); + } + } + } +} + +uint8 DSP3GetByte(uint16 address) +{ + if ((address & 0xC000) == 0x8000) + { + uint8 byte; + + if (DSP3_SR & 0x04) + { + byte = (uint8) DSP3_DR; + (*SetDSP3)(); + } + else + { + DSP3_SR ^= 0x10; + + if (DSP3_SR & 0x10) + byte = (uint8) (DSP3_DR); + else + { + byte = (uint8) (DSP3_DR >> 8); + (*SetDSP3)(); + } + } + + return byte; + } + + return (uint8) DSP3_SR; +} + diff --git a/src/dsp4emu.cpp b/src/dsp4emu.cpp new file mode 100644 index 0000000..6a39484 --- /dev/null +++ b/src/dsp4emu.cpp @@ -0,0 +1,1586 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +// Due recognition and credit are given on Overload's DSP website. +// Thank those contributors for their hard work on this chip. + +#include "dsp4.h" + +#define DSP4_READ_WORD(x) \ + READ_WORD(DSP4.parameters+x) + +#define DSP4_WRITE_WORD(x,d) \ + WRITE_WORD(DSP4.output+x,d); + +// used to wait for dsp i/o +#define DSP4_WAIT(x) \ + DSP4_Logic = x; return; + +////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////// + +void DSP4_Multiply(short Multiplicand, short Multiplier, int &Product) +{ + Product = (Multiplicand * Multiplier << 1) >> 1; +} + +void DSP4_UnknownOP11(short A, short B, short C, short D, short &M) +{ + // 0x155 = 341 = Horizontal Width of the Screen + M = ((A * 0x0155 >> 2) & 0xf000) | ((B * 0x0155 >> 6) & 0x0f00) | + ((C * 0x0155 >> 10) & 0x00f0) | ((D * 0x0155 >> 14) & 0x000f); +} + +const unsigned short Op0A_Values[16] = { + 0x0000, 0x0030, 0x0060, 0x0090, 0x00c0, 0x00f0, 0x0120, 0x0150, + 0xfe80, 0xfeb0, 0xfee0, 0xff10, 0xff40, 0xff70, 0xffa0, 0xffd0 +}; + +void DSP4_Op0A(short n2, short &o1, short &o2, short &o3, short &o4) +{ + o4 = Op0A_Values[(n2 & 0x000f)]; + o3 = Op0A_Values[(n2 & 0x00f0) >> 4]; + o2 = Op0A_Values[(n2 & 0x0f00) >> 8]; + o1 = Op0A_Values[(n2 & 0xf000) >> 12]; +} + +////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////// + +#if OP==0x0009 +#define PRINT +#endif + +void DSP4_Op03() +{ +#ifdef PRINT + printf("Op03\n"); +#endif + + MaxTilesPerRow = 33; + + for (int i=0; i < 32; i++) + RowCount[i] = 0; + + // reset op09 data + op09_mode = 0; +} + +void DSP4_Op0E() +{ +#ifdef PRINT + printf("Op0E\n"); +#endif + + MaxTilesPerRow = 16; + + for (int i=0; i < 32; i++) + RowCount[i] = 0; + + // reset op09 data + op09_mode = 1; +} + +#undef PRINT + +void DSP4_Op06(bool8 size, bool8 msb) +{ + // save post-oam table data for future retrieval + op06_OAM[op06_index] |= (msb<<(op06_offset+0)); + op06_OAM[op06_index] |= (size<<(op06_offset+1)); + op06_offset += 2; + + if(op06_offset==8) + { + // move to next byte in buffer + op06_offset=0; + op06_index++; + } +} + +#if OP==0x0001 +#define PRINT +#endif + +void DSP4_Op01() +{ + uint16 command; + + DSP4.waiting4command = FALSE; + + // op flow control + switch(DSP4_Logic) { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + // 0x00 = DSP4_READ_WORD(0x00); + project_focaly = DSP4_READ_WORD(0x02); + raster = DSP4_READ_WORD(0x04); + viewport_top = DSP4_READ_WORD(0x06); + project_y = DSP4_READ_WORD(0x08); + viewport_bottom = DSP4_READ_WORD(0x0a); + project_x1low = DSP4_READ_WORD(0x0c); + project_focalx = DSP4_READ_WORD(0x0e); + project_centerx = DSP4_READ_WORD(0x10); + project_ptr = DSP4_READ_WORD(0x12); + // (envelope?) 0xc0 = DSP4_READ_WORD(0x14); + project_pitchylow = DSP4_READ_WORD(0x16); + project_pitchy = DSP4_READ_WORD(0x18); + project_pitchxlow = DSP4_READ_WORD(0x1a); + project_pitchx = DSP4_READ_WORD(0x1c); + far_plane = DSP4_READ_WORD(0x1e); + // ? = DSP4_READ_WORD(0x20); + project_y1low = DSP4_READ_WORD(0x22); + + // pre-compute + view_plane = PLANE_START; + + // find starting projection points + project_x1 = project_focalx; + project_y -= viewport_bottom; + + // multi-op storage + multi_index1 = 0; + multi_index2 = 0; + + // debug + block=0; + + //////////////////////////////////////////////////// + // command check + + do { + // scan next command + DSP4.in_count = 2; + + DSP4_WAIT(1) resume1: + + // inspect input + command = DSP4_READ_WORD(0); + + // check for termination + if(command == 0x8000) break; + + // already have 2 bytes in queue + DSP4.in_index = 2; + DSP4.in_count = 8; + + DSP4_WAIT(2) resume2: + + //////////////////////////////////////////////////// + // process one iteration of projection + + // inspect inputs + int16 plane = DSP4_READ_WORD(0); + int16 index, lcv; + int16 py_dy=0, px_dx=0; + int16 y_out, x_out; + int16 envelope = DSP4_READ_WORD(6); + int16 project_x; + + // ignore invalid data + if((uint16) plane == 0x8001) continue; + + // one-time init + if(far_plane) + { + // setup final parameters + project_focalx += plane; + project_x1 = project_focalx; + project_y1 = project_focaly; + plane = far_plane; + far_plane = 0; + + // track occlusion + multi_farplane[1] = plane; + multi_raster[1] = viewport_bottom; + } + + // use proportional triangles to project new coords + project_x2 = project_focalx * plane / view_plane; + project_y2 = project_focaly * plane / view_plane; + + // quadratic regression (rough) + if(project_focaly>=-0x0f) + py_dy = project_focaly * project_focaly * -0.20533553 + - 1.08330005 * project_focaly - 69.61094639; + else + py_dy = project_focaly * project_focaly * -0.000657035759 + - 1.07629051 * project_focaly - 65.69315963; + + // approximate # of raster lines + segments = abs(project_y2-project_y1); + + // prevent overdraw + if(project_y2>=raster) segments=0; + else raster=project_y2; + + // don't draw outside the window + if(project_y20) + { + // interpolate between projected points + px_dx = ((project_x2-project_x1)<<8)/segments; + } + + // debug + ++block; +#ifdef PRINT + printf("(line %d) Op01 check %02X, plane %04X, focal_y %04X, y2 %04X, y1 %04X\n",c,(uint16)segments,(uint16)(plane),(uint16)project_focaly,(uint16)project_y2,(uint16)project_y1); +#endif + + // prepare output + DSP4.out_count=8+2+6*segments; + + // pre-block data + DSP4_WRITE_WORD(0,project_focalx); + DSP4_WRITE_WORD(2,project_x2); + DSP4_WRITE_WORD(4,project_focaly); + DSP4_WRITE_WORD(6,project_y2); + DSP4_WRITE_WORD(8,segments); + +#if 0 + DSP4_WRITE_WORD(0,-1); + DSP4_WRITE_WORD(2,-1); + DSP4_WRITE_WORD(4,-1); + DSP4_WRITE_WORD(6,-1); + DSP4_WRITE_WORD(8,-1); +#endif + + index=10; + + project_x = project_centerx + project_x1; + + // iterate through each point + for( lcv=0; lcv>8); + x_out = project_x+((px_dx*lcv)>>8); + + // factor in dynamic track changes + y_out += envelope; + +#if 0 + project_ptr=-1; + y_out=-1; + //x_out=-1; +#endif + + // data + DSP4_WRITE_WORD(index+0,project_ptr); + DSP4_WRITE_WORD(index+2,y_out); + DSP4_WRITE_WORD(index+4,x_out); + index += 6; + + // post-update + project_ptr -= 4; + } + + // post-update + project_y += ((py_dy*lcv)>>8); + + // new positions + if(segments>0) + { + project_x1 = project_x2; + project_y1 = project_y2; + + // storage of focals for op07 + multi_focaly[multi_index2++] = project_focaly; + + // track occlusion: can't see anything below it + multi_farplane[1] = plane; + multi_raster[1] -= segments; + } + + // update projection points + project_pitchy += (int8)DSP4.parameters[3]; + project_pitchx += (int8)DSP4.parameters[5]; + + project_focaly += project_pitchy; + project_focalx += project_pitchx; + } while (1); + + // terminate op + DSP4.waiting4command = TRUE; + DSP4.out_count = 0; +} + +#undef PRINT + +#if OP==0x0007 +#define PRINT +#endif + +void DSP4_Op07() +{ + uint16 command; + + DSP4.waiting4command = FALSE; + + // op flow control + switch(DSP4_Logic) { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // sort inputs + + // 0x00 = DSP4_READ_WORD(0x00); + project_focaly = DSP4_READ_WORD(0x02); + raster = DSP4_READ_WORD(0x04); + viewport_top = DSP4_READ_WORD(0x06); + project_y = DSP4_READ_WORD(0x08); + viewport_bottom = DSP4_READ_WORD(0x0a); + project_x1low = DSP4_READ_WORD(0x0c); + project_x1 = DSP4_READ_WORD(0x0e); + project_centerx = DSP4_READ_WORD(0x10); + project_ptr = DSP4_READ_WORD(0x12); + // (envelope?) 0xc0 = DSP4_READ_WORD(0x14); + + // pre-compute + view_plane = PLANE_START; + + // find projection targets + project_y1 = project_focaly; + project_y -= viewport_bottom; + + // multi-op storage + multi_index2 = 0; + + // debug + block=0; + +#ifdef PRINT + printf("(line %d) Op07 data %04X\n",c,(uint16)project_y1); +#endif + + //////////////////////////////////////////////////// + // command check + + do { + // scan next command + DSP4.in_count = 2; + + DSP4_WAIT(1) resume1: + + // inspect input + command = DSP4_READ_WORD(0); + + // check for opcode termination + if(command == 0x8000) break; + + // already have 2 bytes in queue + DSP4.in_index = 2; + DSP4.in_count = 12; + + DSP4_WAIT(2) resume2: + + //////////////////////////////////////////////////// + // process one loop of projection + + int16 plane; + int16 index,lcv; + int16 y_out,x_out; + int16 py_dy=0,px_dx=0; + int16 project_x; + + // debug + ++block; + + // inspect inputs + plane = DSP4_READ_WORD(0); + project_y2 = DSP4_READ_WORD(2); + // ? = DSP4_READ_WORD(4); + project_x2 = DSP4_READ_WORD(6); + int16 envelope = DSP4_READ_WORD(8); + + // ignore invalid data + if((uint16) plane == 0x8001) continue; + + // multi-op storage + project_focaly = multi_focaly[multi_index2]; + + // quadratic regression (rough) + if(project_focaly>=-0x0f) + py_dy = project_focaly * project_focaly * -0.20533553 + - 1.08330005 * project_focaly - 69.61094639; + else + py_dy = project_focaly * project_focaly * -0.000657035759 + - 1.07629051 * project_focaly - 65.69315963; + + // approximate # of raster lines + segments = abs(project_y2-project_y1); + + // prevent overdraw + if(project_y2>=raster) segments=0; + else raster=project_y2; + + // don't draw outside the window + if(project_y20) + { + // interpolate between projected points + px_dx = ((project_x2-project_x1)<<8)/segments; + } + +#ifdef PRINT + printf("(line %d) Op07 block %d, loc %04X, out %02X, project_x2 %04X\n",c,block,plane,segments,(uint16)project_x2); +#endif + + // prepare pre-output + DSP4.out_count=4+2+6*segments; + + DSP4_WRITE_WORD(0,project_x2); + DSP4_WRITE_WORD(2,project_y2); + DSP4_WRITE_WORD(4,segments); + +#if 0 + DSP4_WRITE_WORD(0,-1); + DSP4_WRITE_WORD(2,-1); + DSP4_WRITE_WORD(4,-1); +#endif + + index=6; + + project_x = project_centerx + project_x1; + + for( lcv=0; lcv>8); + x_out = project_x+((px_dx*lcv)>>8); + + // factor in dynamic track changes + y_out += envelope; + +#if 0 + project_ptr = -1; + //y_out = -1; + x_out = -1; +#endif + + // data + DSP4_WRITE_WORD(index+0,project_ptr); + DSP4_WRITE_WORD(index+2,y_out); + DSP4_WRITE_WORD(index+4,x_out); + index += 6; + + // post-update + project_ptr -= 4; + } + + // update internal variables + project_y += ((py_dy*lcv)>>8); + + // new positions + if(segments>0) + { + project_x1 = project_x2; + project_y1 = project_y2; + + // multi-op storage + multi_index2++; + } + } while(1); + + DSP4.waiting4command = TRUE; + DSP4.out_count = 0; +} + +#undef PRINT + +#if OP==0x0008 +#define PRINT +#endif + +void DSP4_Op08() +{ + uint16 command; + + DSP4.waiting4command = FALSE; + + // op flow control + switch(DSP4_Logic) { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // clip values + path_clipRight[0] = DSP4_READ_WORD(0x00); + path_clipRight[1] = DSP4_READ_WORD(0x02); + path_clipRight[2] = DSP4_READ_WORD(0x04); + path_clipRight[3] = DSP4_READ_WORD(0x06); + + path_clipLeft[0] = DSP4_READ_WORD(0x08); + path_clipLeft[1] = DSP4_READ_WORD(0x0a); + path_clipLeft[2] = DSP4_READ_WORD(0x0c); + path_clipLeft[3] = DSP4_READ_WORD(0x0e); + + // unknown (constant) + // unknown (constant) + + // path positions + path_pos[0] = DSP4_READ_WORD(0x20); + path_pos[1] = DSP4_READ_WORD(0x22); + path_pos[2] = DSP4_READ_WORD(0x24); + path_pos[3] = DSP4_READ_WORD(0x26); + + // data locations + path_ptr[0] = DSP4_READ_WORD(0x28); + path_ptr[1] = DSP4_READ_WORD(0x2a); + path_ptr[2] = DSP4_READ_WORD(0x2c); + path_ptr[3] = DSP4_READ_WORD(0x2e); + + // project_y1 lines + path_raster[0] = DSP4_READ_WORD(0x30); + path_raster[1] = DSP4_READ_WORD(0x32); + path_raster[2] = DSP4_READ_WORD(0x34); + path_raster[3] = DSP4_READ_WORD(0x36); + + // viewport_top + path_top[0] = DSP4_READ_WORD(0x38); + path_top[1] = DSP4_READ_WORD(0x3a); + path_top[2] = DSP4_READ_WORD(0x3c); + path_top[3] = DSP4_READ_WORD(0x3e); + + // unknown (constants) + + view_plane = PLANE_START; + + // debug + block=0; + + //////////////////////////////////////////////////// + // command check + + do { + // scan next command + DSP4.in_count = 2; + + DSP4_WAIT(1) resume1: + + // inspect input + command = DSP4_READ_WORD(0); + + // terminate op + if(command == 0x8000) break; + + // already have 2 bytes in queue + DSP4.in_index = 2; + DSP4.in_count = 18; + + DSP4_WAIT(2) resume2: + + //////////////////////////////////////////////////// + // projection begins + + // debug + ++block; + + // used in envelope shaping + int16 x1_final; + int16 x2_final; + + // look at guidelines + int16 plane = DSP4_READ_WORD(0x00); + int16 x_left = DSP4_READ_WORD(0x02); + int16 y_left = DSP4_READ_WORD(0x04); + int16 x_right = DSP4_READ_WORD(0x06); + int16 y_right = DSP4_READ_WORD(0x08); + + // envelope guidelines (one frame only) + int16 envelope1 = DSP4_READ_WORD(0x0a); + int16 envelope2 = DSP4_READ_WORD(0x0c); + int16 envelope3 = DSP4_READ_WORD(0x0e); + int16 envelope4 = DSP4_READ_WORD(0x10); + + // ignore invalid data + if((uint16) plane == 0x8001) continue; + + // first init + if(plane == 0x7fff) + { + int pos1,pos2; + + // initialize projection + path_x[0] = x_left; + path_x[1] = x_right; + + path_y[0] = y_left; + path_y[1] = y_right; + + // update coordinates + path_pos[0]-=x_left; + path_pos[1]-=x_left; + path_pos[2]-=x_right; + path_pos[3]-=x_right; + + pos1 = path_pos[0]+envelope1; + pos2 = path_pos[1]+envelope2; + + // clip offscreen data + if(pos1path_clipRight[0]) pos1 = path_clipRight[0]; + if(pos2path_clipRight[1]) pos2 = path_clipRight[1]; + +#if 0 + pos1=-1; + //pos2=-1; +#endif + + path_plane[0] = plane; + path_plane[1] = plane; + + // initial output + DSP4.out_count = 2; + DSP4.output[0]=pos1&0xFF; + DSP4.output[1]=pos2&0xFF; + +#ifdef PRINT + printf("(line %d) Op08 x_left %04X\n",c,(uint16)x_left); +#endif + } + // proceed with projection + else + { + int16 index=0, lcv; + int16 left_inc=0,right_inc=0; + int16 dx1,dx2,dx3,dx4; + + // # segments to traverse + segments = abs(y_left - path_y[0]); + + // prevent overdraw + if(y_left>=path_raster[0]) segments=0; + else path_raster[0]=y_left; + + // don't draw outside the window + if(path_raster[0]0) + { + // use previous data + dx1 = (envelope1 * path_plane[0] / view_plane); + dx2 = (envelope2 * path_plane[0] / view_plane); + + // use temporary envelope pitch (this frame only) + dx3 = (envelope1 * plane / view_plane); + dx4 = (envelope2 * plane / view_plane); + + // project new shapes (left side) + x1_final = x_left+dx1; + x2_final = path_x[0]+dx3; + + // interpolate between projected points with shaping + left_inc = ((x2_final-x1_final)<<8)/segments; + + // project new shapes (right side) + x1_final = x_left+dx2; + x2_final = path_x[0]+dx4; + + // interpolate between projected points with shaping + right_inc = ((x2_final-x1_final)<<8)/segments; + + path_plane[0] = plane; + } + +#ifdef PRINT + printf("(line %d) Op08 block %d, out %02X, raster %02X\n",c,block,segments,(uint16)y_left); +#endif + + // zone 1 + DSP4.out_count = (2+4*segments); + DSP4_WRITE_WORD(index,segments); index+=2; + + for( lcv=1; lcv<=segments; lcv++ ) + { + int16 pos1,pos2; + + // pre-compute + pos1 = path_pos[0]+((left_inc*lcv)>>8)+dx1; + pos2 = path_pos[1]+((right_inc*lcv)>>8)+dx2; + + // clip offscreen data + if(pos1path_clipRight[0]) pos1 = path_clipRight[0]; + if(pos2path_clipRight[1]) pos2 = path_clipRight[1]; + +#if 0 + if(pos1==0x00ff) pos1=0; + if(pos2==0x00ff) pos2=0; + path_ptr[0] = -1; + pos1 = -1; + pos2 = -1; +#endif + + // data + DSP4_WRITE_WORD(index,path_ptr[0]); index+=2; + DSP4.output[index++]=pos1&0xFF; + DSP4.output[index++]=pos2&0xFF; + + // post-update + path_ptr[0] -= 4; + path_ptr[1] -= 4; + } + lcv--; + + if(segments>0) + { + // project points w/out the envelopes + int16 inc = ((path_x[0]-x_left)<<8)/segments; + + // post-store + path_pos[0] += ((inc*lcv)>>8); + path_pos[1] += ((inc*lcv)>>8); + + path_x[0] = x_left; + path_y[0] = y_left; + } + + ////////////////////////////////////////////// + // zone 2 + segments = abs(y_right - path_y[1]); + + // prevent overdraw + if(y_right>=path_raster[2]) segments=0; + else path_raster[2]=y_right; + + // don't draw outside the window + if(path_raster[2]0) + { + // use previous data + dx1 = (envelope1 * path_plane[1] / view_plane); + dx2 = (envelope2 * path_plane[1] / view_plane); + + // use temporary envelope pitch (this frame only) + dx3 = (envelope1 * plane / view_plane); + dx4 = (envelope2 * plane / view_plane); + + // project new shapes (left side) + x1_final = x_left+dx1; + x2_final = path_x[1]+dx3; + + // interpolate between projected points with shaping + left_inc = ((x2_final-x1_final)<<8)/segments; + + // project new shapes (right side) + x1_final = x_left+dx2; + x2_final = path_x[1]+dx4; + + // interpolate between projected points with shaping + right_inc = ((x2_final-x1_final)<<8)/segments; + + path_plane[1] = plane; + } + + // write out results + DSP4.out_count += (2+4*segments); + DSP4_WRITE_WORD(index,segments); index+=2; + + for( lcv=1; lcv<=segments; lcv++ ) + { + int16 pos1,pos2; + + // pre-compute + pos1 = path_pos[2]+((left_inc*lcv)>>8)+dx1; + pos2 = path_pos[3]+((right_inc*lcv)>>8)+dx2; + + // clip offscreen data + if(pos1path_clipRight[2]) pos1 = path_clipRight[2]; + if(pos2path_clipRight[3]) pos2 = path_clipRight[3]; + +#if 0 + if(pos1==0x00ff) pos1=0; + if(pos2==0x00ff) pos2=0; + path_ptr[2] = -1; + //pos1 = -1; + pos2 = -1; +#endif + + // data + DSP4_WRITE_WORD(index,path_ptr[2]); index+=2; + DSP4.output[index++]=pos1&0xFF; + DSP4.output[index++]=pos2&0xFF; + + // post-update + path_ptr[2] -= 4; + path_ptr[3] -= 4; + } + lcv--; + + if(segments>0) + { + // project points w/out the envelopes + int16 inc = ((path_x[1]-x_right)<<8)/segments; + + // post-store + path_pos[2] += ((inc*lcv)>>8); + path_pos[3] += ((inc*lcv)>>8); + + path_x[1] = x_right; + path_y[1] = y_right; + } + } + } while(1); + + DSP4.waiting4command = TRUE; + DSP4.out_count = 2; + DSP4_WRITE_WORD(0,0); +} + +#undef PRINT + +#if OP==0x000D +#define PRINT +#endif + +void DSP4_Op0D() +{ + uint16 command; + + DSP4.waiting4command = FALSE; + + // op flow control + switch(DSP4_Logic) { + case 1: goto resume1; break; + case 2: goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + // 0x00 = DSP4_READ_WORD(0x00); + project_focaly = DSP4_READ_WORD(0x02); + raster = DSP4_READ_WORD(0x04); + viewport_top = DSP4_READ_WORD(0x06); + project_y = DSP4_READ_WORD(0x08); + viewport_bottom = DSP4_READ_WORD(0x0a); + project_x1low = DSP4_READ_WORD(0x0c); + project_x1 = DSP4_READ_WORD(0x0e); + project_focalx = DSP4_READ_WORD(0x0e); + project_centerx = DSP4_READ_WORD(0x10); + project_ptr = DSP4_READ_WORD(0x12); + // 0xc0 = DSP4_READ_WORD(0x14); + project_pitchylow = DSP4_READ_WORD(0x16); + project_pitchy = DSP4_READ_WORD(0x18); + project_pitchxlow = DSP4_READ_WORD(0x1a); + project_pitchx = DSP4_READ_WORD(0x1c); + far_plane = DSP4_READ_WORD(0x1e); + // ? = DSP4_READ_WORD(0x20); + + // multi-op storage + multi_index1++; + multi_index1%=4; + + // remap 0D->09 window data ahead of time + // index starts at 1-3,0 + // + // Op0D: BL,TL,BR,TR + // Op09: TL,TR,BL,BR (1,2,3,0) + switch(multi_index1) + { + case 1: multi_index2=3; break; + case 2: multi_index2=1; break; + case 3: multi_index2=0; break; + case 0: multi_index2=2; break; + } + + // pre-compute + view_plane = PLANE_START; + + // figure out projection data + project_y -= viewport_bottom; + + // debug + block=0; + + //////////////////////////////////////////////////// + // command check + + do { + // scan next command + DSP4.in_count = 2; + + DSP4_WAIT(1) resume1: + + // inspect input + command = DSP4_READ_WORD(0); + + // terminate op + if(command == 0x8000) break; + + // already have 2 bytes in queue + DSP4.in_index = 2; + DSP4.in_count = 8; + + DSP4_WAIT(2) resume2: + + //////////////////////////////////////////////////// + // project section of the track + + // inspect inputs + int16 plane = DSP4_READ_WORD(0); + int16 index, lcv; + int16 py_dy=0, px_dx=0; + int16 y_out, x_out; + int16 envelope = DSP4_READ_WORD(6); + int16 project_x; + + // ignore invalid data + if((uint16) plane == 0x8001) continue; + + // one-time init + if(far_plane) + { + // setup final data + // low16=plane + project_x1 = project_focalx; + project_y1 = project_focaly; + plane = far_plane; + far_plane = 0; + + // track occlusion + multi_farplane[multi_index2] = plane; + multi_raster[multi_index2] = viewport_bottom; + } + + // use proportional triangles to project new coords + project_x2 = project_focalx * plane / view_plane; + project_y2 = project_focaly * plane / view_plane; + + // quadratic regression (rough) + if(project_focaly>=-0x0f) + py_dy = project_focaly * project_focaly * -0.20533553 + - 1.08330005 * project_focaly - 69.61094639; + else + py_dy = project_focaly * project_focaly * -0.000657035759 + - 1.07629051 * project_focaly - 65.69315963; + + // approximate # of raster lines + segments = abs(project_y2-project_y1); + + // prevent overdraw + if(project_y2>=raster) segments=0; + else raster=project_y2; + + // don't draw outside the window + if(project_y20) + { + // interpolate between projected points + px_dx = ((project_x2-project_x1)<<8)/segments; + } + + // debug + ++block; + +#ifdef PRINT + printf("(line %d) Op0D check %02X, plane %04X\n",c,(uint16)segments,(uint16)(plane)); +#endif + + // prepare output + DSP4.out_count=8+2+6*segments; + + DSP4_WRITE_WORD(0,project_focalx); + DSP4_WRITE_WORD(2,project_x2); + DSP4_WRITE_WORD(4,project_focaly); + DSP4_WRITE_WORD(6,project_y2); + DSP4_WRITE_WORD(8,segments); +#if 0 + DSP4_WRITE_WORD(0,-1); + DSP4_WRITE_WORD(2,-1); + DSP4_WRITE_WORD(4,-1); + //DSP4_WRITE_WORD(6,-1); + DSP4_WRITE_WORD(8,-1); +#endif + + index=10; + + project_x = project_centerx + project_x1; + + // iterate through each point + for( lcv=0; lcv>8); + x_out = project_x+((px_dx*lcv)>>8); + + // factor in dynamic track changes + y_out += envelope; + +#if 0 + project_ptr=-1; + y_out=-1; + x_out=-1; +#endif + + // data + DSP4_WRITE_WORD(index+0,project_ptr); + DSP4_WRITE_WORD(index+2,y_out); + DSP4_WRITE_WORD(index+4,x_out); + index += 6; + + // post-update + project_ptr -= 4; + } + + // post-update + project_y += ((py_dy*lcv)>>8); + + if(segments > 0) + { + project_x1 = project_x2; + project_y1 = project_y2; + + // track occlusion: can't see anything below it + multi_farplane[multi_index2] = plane; + multi_raster[multi_index2] -= segments; + } + + // update focal projection points + project_pitchy += (int8)DSP4.parameters[3]; + project_pitchx += (int8)DSP4.parameters[5]; + + project_focaly += project_pitchy; + project_focalx += project_pitchx; + } while(1); + + DSP4.waiting4command = TRUE; + DSP4.out_count = 0; +} + +#undef PRINT + +#if OP==0x0009 +#define PRINT +#endif + +#if OP==0x0006 +#define PRINT +#endif + +void DSP4_Op09() +{ + uint16 command; + + DSP4.waiting4command = FALSE; + + // op flow control + switch(DSP4_Logic) { + case 1: goto resume1; break; + case 2: goto resume2; break; + case 3: goto resume3; break; + case 4: goto resume4; break; + case 5: goto resume5; break; + case 6: goto resume6; break; + case 7: goto resume7; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // debug + block=0; + + // grab screen information + view_plane = PLANE_START; + center_x = DSP4_READ_WORD(0x00); + center_y = DSP4_READ_WORD(0x02); + // 0x00 = DSP4_READ_WORD(0x04); + viewport_left = DSP4_READ_WORD(0x06); + viewport_right = DSP4_READ_WORD(0x08); + viewport_top = DSP4_READ_WORD(0x0a); + viewport_bottom = DSP4_READ_WORD(0x0c); + +#ifdef PRINT2 + printf("Window: (%04X,%04X) (%04X,%04X)\n", + viewport_left,viewport_right,viewport_top,viewport_bottom); +#endif + + // cycle through viewport window data + multi_index1++; + multi_index1%=4; + + goto no_sprite; + + do { + //////////////////////////////////////////////////// + // check for new sprites + + do { + uint16 second; + + DSP4.in_count = 4; + DSP4.in_index = 2; + + DSP4_WAIT(1) resume1: + + // try to classify sprite + second = DSP4_READ_WORD(2); + + // op termination + if(second == 0x8000) goto terminate; + + second >>= 8; + sprite_type = 0; + + // vehicle sprite + if(second == 0x90) + { + sprite_type = 1; + break; + } + // terrain sprite + else if(second != 0) + { + sprite_type = 2; + break; + } + +no_sprite: + // no sprite. try again + + DSP4.in_count = 2; + + DSP4_WAIT(2) resume2: + ; + } while (1); + + //////////////////////////////////////////////////// + // process projection information + +sprite_found: + // vehicle sprite + if(sprite_type == 1) + { + int16 plane; + int16 car_left, car_right, car_left_a; + int16 focal_back, focal_front; + uint8 distance, id; + + // we already have 4 bytes we want + DSP4.in_count = 6+12; + DSP4.in_index = 4; + + DSP4_WAIT(3) resume3: + + // filter inputs + project_y1 = DSP4_READ_WORD(0x00); + // 0x9000 = DSP4_READ_WORD(0x02); + id = DSP4.parameters[0x04]; + distance = DSP4.parameters[0x05]; + focal_back = DSP4_READ_WORD(0x06); + focal_front = DSP4_READ_WORD(0x08); + car_left_a = DSP4_READ_WORD(0x0a); + car_left = DSP4_READ_WORD(0x0c); + plane = DSP4_READ_WORD(0x0e); + car_right = DSP4_READ_WORD(0x10); + + // calculate car's x-center + project_focalx = car_right-car_left; + + // determine how far into the screen to project + project_focaly = focal_back; + project_x = project_focalx * plane / view_plane; + segments = 0x33 - project_focaly * plane / view_plane; + far_plane = plane; + + // prepare memory + sprite_x = center_x+project_x; + sprite_y = viewport_bottom-segments; + far_plane = plane; + + // debug + ++block; +#ifdef PRINT + printf("(line %d) Op09 vehicle block %d, Loop %04X\n",c,block,(uint16)project_y1); + //printf("%04X %04X %04X %04X / ",focal_back,focal_front,car_left_a,car_left); + //printf("%02X %02X ", distance, id); +#endif + + // make the car's x-center available + DSP4.out_count = 2; + DSP4_WRITE_WORD(0,project_focalx); + +#if 0 + DSP4_WRITE_WORD(0,-1); +#endif + + // grab a few remaining vehicle values + DSP4.in_count = 4; + + DSP4_WAIT(4) resume4: + + // store final values + int height = DSP4_READ_WORD(0); + sprite_offset = DSP4_READ_WORD(2); + + // vertical lift factor + sprite_y += height; + +#ifdef PRINT_09 + printf("%04X\n",sprite_offset); +#endif + } + // terrain sprite + else if(sprite_type == 2) + { + int16 plane; + + // we already have 4 bytes we want + DSP4.in_count = 6+6+2; + DSP4.in_index = 4; + + DSP4_WAIT(5) resume5: + + // sort loop inputs + project_y1 = DSP4_READ_WORD(0x00); + plane = DSP4_READ_WORD(0x02); + project_centerx = DSP4_READ_WORD(0x04); + //project_y1 = DSP4_READ_WORD(0x06); + project_focalx = DSP4_READ_WORD(0x08); + project_focaly = DSP4_READ_WORD(0x0a); + sprite_offset = DSP4_READ_WORD(0x0c); + + // determine distances into virtual world + segments = 0x33 - project_y1; + project_x = project_focalx * plane / view_plane; + project_y = project_focaly * plane / view_plane; + + // prepare memory + sprite_x = center_x+project_x-project_centerx; + sprite_y = viewport_bottom-segments+project_y; + far_plane = plane; + + // debug + ++block; +#ifdef PRINT + printf("(line %d) Op09 terrain block %d, Loop %04X\n",c,block,(uint16)project_y1); +#endif + } + + // default sprite size: 16x16 + sprite_size = 1; + + //////////////////////////////////////////////////// + // convert tile data to OAM + + do { + DSP4.in_count = 2; + + DSP4_WAIT(6) resume6: + + command = DSP4_READ_WORD(0); + + // opcode termination + if(command == 0x8000) goto terminate; + + // toggle sprite size + if(command == 0x0000) + { + sprite_size = !sprite_size; +#ifdef PRINT + //printf("TOGGLE=%02X\n",(uint8)sprite_size); +#endif + continue; + } + + // new sprite information + command >>= 8; + if(command != 0x20 && command != 0x40 && + command != 0x60 && command != 0xa0 && + command != 0xc0 && command != 0xe0) + break; + + DSP4.in_count = 6; + DSP4.in_index = 2; + + DSP4_WAIT(7) resume7: + + ///////////////////////////////////// + // process tile data + + bool8 clip; + int16 sp_x, sp_y, sp_oam, sp_msb; + int16 sp_dx, sp_dy; + int16 expand = sprite_size ? 15:7; + + // sprite deltas + sp_dy = DSP4_READ_WORD(2); + sp_dx = DSP4_READ_WORD(4); + + // update coordinates + sp_y = sprite_y + sp_dy; + sp_x = sprite_x + sp_dx; + + // reject points outside the clipping window + clip = FALSE; + + // window clipping + if(sp_x < viewport_left-expand || sp_x > viewport_right) clip=TRUE; + if(sp_y < viewport_top || sp_y > viewport_bottom) clip=TRUE; + + // track occlusion: + // clip any tiles that are below the road + if(far_plane <= multi_farplane[multi_index1] && + (sp_y>>3) >= (multi_raster[multi_index1]>>3)) clip=TRUE; + + // tile limitations + if ((sp_y >= -expand) && ((sp_y < 0) || ((sp_y & 0x01ff) < 0x00eb)) && !clip) + { + short Row = (sp_y >> 3) & 0x1f; + + if(!sprite_size) + { + // 1x1 tile + if (RowCount[Row] < MaxTilesPerRow) + RowCount[Row]++; + else + clip=TRUE; + } + else + { + // 2x2 tile + if ((RowCount[Row+0]+1 < MaxTilesPerRow) && + (RowCount[Row+1]+1 < MaxTilesPerRow)) + { + RowCount[Row+0]+=2; + RowCount[Row+1]+=2; + } + else + clip=TRUE; + } + } + +#ifdef PRINT + printf("(line %d) %04X, %04X, %04X / %04X %04X\n",line, + (uint16)sp_x,(uint16)sp_y,(uint16)far_plane,(uint16)multi_farplane[multi_index1],(uint16)multi_raster[multi_index1]); +#endif + + // don't draw offscreen coordinates + DSP4.out_count = 0; + if(!clip) + { + int16 out_index = 0; + int16 offset = DSP4_READ_WORD(0); + + // update sprite nametable/attribute information + sp_oam = sprite_offset + offset; + sp_msb = (sp_x<0 || sp_x>255); + +#ifdef PRINT2 + printf("(line %d) %04X, %04X, %04X, %04X, %04X\n",line, + (uint16)sp_oam,(uint16)sprite_offset,(uint16)offset, + (uint16)sp_x,(uint16)sp_y); +#endif + + // emit transparency information + if( + (sprite_offset&0x08) && + ((sprite_type==1 && sp_y>=0xcc) || + (sprite_type==2 && sp_y>=0xbb)) + ) + { + DSP4.out_count = 6; + + // one block of OAM data + DSP4_WRITE_WORD(0,1); + + // OAM: x,y,tile,no attr + DSP4.output[2] = sp_x&0xFF; + DSP4.output[3] = (sp_y+6)&0xFF; + DSP4_WRITE_WORD(4,0xEE); + + out_index = 6; + + // OAM: size,msb data + DSP4_Op06(sprite_size,sp_msb); + +#if 0 + //DSP4_WRITE_WORD(0,-1); + DSP4_WRITE_WORD(2,-1); + DSP4_WRITE_WORD(4,-1); +#endif + } + + // normal data + DSP4.out_count += 8; + + // one block of OAM data + DSP4_WRITE_WORD(out_index+0,1); + + // OAM: x,y,tile,attr + DSP4.output[out_index+2] = sp_x&0xFF; + DSP4.output[out_index+3] = sp_y&0xFF; + DSP4_WRITE_WORD(out_index+4,sp_oam); + + // no following OAM data + DSP4_WRITE_WORD(out_index+6,0); + + // OAM: size,msb data + DSP4_Op06(sprite_size,sp_msb); + +#if 0 + //DSP4_WRITE_WORD(out_index+0,-1); + DSP4_WRITE_WORD(out_index+2,-1); + DSP4_WRITE_WORD(out_index+4,-1); +#endif + } + + // no sprite information + if(DSP4.out_count == 0) + { + DSP4.out_count = 2; + DSP4_WRITE_WORD(0,0); + } + } while (1); + + ///////////////////////////////////// + // special cases: plane == 0x0000 + + // special vehicle case + if(command == 0x90) + { + sprite_type = 1; + + // shift bytes + DSP4.parameters[2] = DSP4.parameters[0]; + DSP4.parameters[3] = DSP4.parameters[1]; + DSP4.parameters[0] = 0; + DSP4.parameters[1] = 0; + + goto sprite_found; + } + // special terrain case + else if(command != 0x00 && command != 0xff) + { + sprite_type = 2; + + // shift bytes + DSP4.parameters[2] = DSP4.parameters[0]; + DSP4.parameters[3] = DSP4.parameters[1]; + DSP4.parameters[0] = 0; + DSP4.parameters[1] = 0; + + goto sprite_found; + } + } while (1); + +terminate: + DSP4.waiting4command = TRUE; + DSP4.out_count=0; +} + +#undef PRINT diff --git a/src/fxemu.cpp b/src/fxemu.cpp new file mode 100644 index 0000000..564fba7 --- /dev/null +++ b/src/fxemu.cpp @@ -0,0 +1,726 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include +#include "fxemu.h" +#include "fxinst.h" + +/* The FxChip Emulator's internal variables */ +struct FxRegs_s GSU = FxRegs_s_null; + +uint32 (**fx_ppfFunctionTable)(uint32) = 0; +void (**fx_ppfPlotTable)() = 0; +void (**fx_ppfOpcodeTable)() = 0; + +#if 0 +void fx_setCache() +{ + uint32 c; + GSU.bCacheActive = TRUE; + GSU.pvRegisters[0x3e] &= 0xf0; + c = (uint32)GSU.pvRegisters[0x3e]; + c |= ((uint32)GSU.pvRegisters[0x3f])<<8; + if(c == GSU.vCacheBaseReg) + return; + GSU.vCacheBaseReg = c; + GSU.vCacheFlags = 0; + if(c < (0x10000-512)) + { + uint8 const* t = &ROM(c); + memcpy(GSU.pvCache,t,512); + } + else + { + uint8 const* t1; + uint8 const* t2; + uint32 i = 0x10000 - c; + t1 = &ROM(c); + t2 = &ROM(0); + memcpy(GSU.pvCache,t1,i); + memcpy(&GSU.pvCache[i],t2,512-i); + } +} +#endif + +void FxCacheWriteAccess(uint16 vAddress) +{ +#if 0 + if(!GSU.bCacheActive) + { + uint8 v = GSU.pvCache[GSU.pvCache[vAddress&0x1ff]; + fx_setCache(); + GSU.pvCache[GSU.pvCache[vAddress&0x1ff] = v; + } +#endif + if((vAddress & 0x00f) == 0x00f) + GSU.vCacheFlags |= 1 << ((vAddress&0x1f0) >> 4); +} + +void FxFlushCache() +{ + GSU.vCacheFlags = 0; + GSU.vCacheBaseReg = 0; + GSU.bCacheActive = FALSE; +// GSU.vPipe = 0x1; +} + +static void fx_backupCache() +{ +#if 0 + uint32 i; + uint32 v = GSU.vCacheFlags; + uint32 c = USEX16(GSU.vCacheBaseReg); + if(v) + for(i=0; i<32; i++) + { + if(v&1) + { + if(c < (0x10000-16)) + { + uint8 * t = &GSU.pvPrgBank[c]; + memcpy(&GSU.avCacheBackup[i<<4],t,16); + memcpy(t,&GSU.pvCache[i<<4],16); + } + else + { + uint8 * t1; + uint8 * t2; + uint32 a = 0x10000 - c; + t1 = &GSU.pvPrgBank[c]; + t2 = &GSU.pvPrgBank[0]; + memcpy(&GSU.avCacheBackup[i<<4],t1,a); + memcpy(t1,&GSU.pvCache[i<<4],a); + memcpy(&GSU.avCacheBackup[(i<<4)+a],t2,16-a); + memcpy(t2,&GSU.pvCache[(i<<4)+a],16-a); + } + } + c = USEX16(c+16); + v >>= 1; + } +#endif +} + +static void fx_restoreCache() +{ +#if 0 + uint32 i; + uint32 v = GSU.vCacheFlags; + uint32 c = USEX16(GSU.vCacheBaseReg); + if(v) + for(i=0; i<32; i++) + { + if(v&1) + { + if(c < (0x10000-16)) + { + uint8 * t = &GSU.pvPrgBank[c]; + memcpy(t,&GSU.avCacheBackup[i<<4],16); + memcpy(&GSU.pvCache[i<<4],t,16); + } + else + { + uint8 * t1; + uint8 * t2; + uint32 a = 0x10000 - c; + t1 = &GSU.pvPrgBank[c]; + t2 = &GSU.pvPrgBank[0]; + memcpy(t1,&GSU.avCacheBackup[i<<4],a); + memcpy(&GSU.pvCache[i<<4],t1,a); + memcpy(t2,&GSU.avCacheBackup[(i<<4)+a],16-a); + memcpy(&GSU.pvCache[(i<<4)+a],t2,16-a); + } + } + c = USEX16(c+16); + v >>= 1; + } +#endif +} + +void fx_flushCache() +{ + fx_restoreCache(); + GSU.vCacheFlags = 0; + GSU.bCacheActive = FALSE; +} + + +void fx_updateRamBank(uint8 Byte) +{ + // Update BankReg and Bank pointer + GSU.vRamBankReg = (uint32)Byte & (FX_RAM_BANKS-1); + GSU.pvRamBank = GSU.apvRamBank[Byte & 0x3]; +} + + +static void fx_readRegisterSpace() +{ + int i; + uint8 *p; + static uint32 avHeight[] = { 128, 160, 192, 256 }; + static uint32 avMult[] = { 16, 32, 32, 64 }; + + GSU.vErrorCode = 0; + + /* Update R0-R15 */ + p = GSU.pvRegisters; + for(i=0; i<16; i++) + { + GSU.avReg[i] = *p++; + GSU.avReg[i] += ((uint32)(*p++)) << 8; + } + + /* Update other registers */ + p = GSU.pvRegisters; + GSU.vStatusReg = (uint32)p[GSU_SFR]; + GSU.vStatusReg |= ((uint32)p[GSU_SFR+1]) << 8; + GSU.vPrgBankReg = (uint32)p[GSU_PBR]; + GSU.vRomBankReg = (uint32)p[GSU_ROMBR]; + GSU.vRamBankReg = ((uint32)p[GSU_RAMBR]) & (FX_RAM_BANKS-1); + GSU.vCacheBaseReg = (uint32)p[GSU_CBR]; + GSU.vCacheBaseReg |= ((uint32)p[GSU_CBR+1]) << 8; + + /* Update status register variables */ + GSU.vZero = !(GSU.vStatusReg & FLG_Z); + GSU.vSign = (GSU.vStatusReg & FLG_S) << 12; + GSU.vOverflow = (GSU.vStatusReg & FLG_OV) << 16; + GSU.vCarry = (GSU.vStatusReg & FLG_CY) >> 2; + + /* Set bank pointers */ + GSU.pvRamBank = GSU.apvRamBank[GSU.vRamBankReg & 0x3]; + GSU.pvRomBank = GSU.apvRomBank[GSU.vRomBankReg]; + GSU.pvPrgBank = GSU.apvRomBank[GSU.vPrgBankReg]; + + /* Set screen pointers */ + GSU.pvScreenBase = &GSU.pvRam[ USEX8(p[GSU_SCBR]) << 10 ]; + i = (int)(!!(p[GSU_SCMR] & 0x04)); + i |= ((int)(!!(p[GSU_SCMR] & 0x20))) << 1; + GSU.vScreenHeight = GSU.vScreenRealHeight = avHeight[i]; + GSU.vMode = p[GSU_SCMR] & 0x03; +#if 0 + if(GSU.vMode == 2) + error illegal color depth GSU.vMode; +#endif + if(i == 3) + GSU.vScreenSize = (256/8) * (256/8) * 32; + else + GSU.vScreenSize = (GSU.vScreenHeight/8) * (256/8) * avMult[GSU.vMode]; + if (GSU.vPlotOptionReg & 0x10) + { + /* OBJ Mode (for drawing into sprites) */ + GSU.vScreenHeight = 256; + } +#if 0 + if(GSU.pvScreenBase + GSU.vScreenSize > GSU.pvRam + (GSU.nRamBanks * 65536)) + error illegal address for screen base register +#else + if(GSU.pvScreenBase + GSU.vScreenSize > GSU.pvRam + (GSU.nRamBanks * 65536)) + GSU.pvScreenBase = GSU.pvRam + (GSU.nRamBanks * 65536) - GSU.vScreenSize; +#endif + GSU.pfPlot = fx_apfPlotTable[GSU.vMode]; + GSU.pfRpix = fx_apfPlotTable[GSU.vMode + 5]; + + fx_ppfOpcodeTable[0x04c] = GSU.pfPlot; + fx_ppfOpcodeTable[0x14c] = GSU.pfRpix; + fx_ppfOpcodeTable[0x24c] = GSU.pfPlot; + fx_ppfOpcodeTable[0x34c] = GSU.pfRpix; + + fx_computeScreenPointers (); + + fx_backupCache(); +} + +void fx_dirtySCBR() +{ + GSU.vSCBRDirty = TRUE; +} + +void fx_computeScreenPointers () +{ + if (GSU.vMode != GSU.vPrevMode || + GSU.vPrevScreenHeight != GSU.vScreenHeight || + GSU.vSCBRDirty) + { + int i; + + GSU.vSCBRDirty = FALSE; + + /* Make a list of pointers to the start of each screen column */ + switch (GSU.vScreenHeight) + { + case 128: + switch (GSU.vMode) + { + case 0: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = i << 8; + } + break; + case 1: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = i << 9; + } + break; + case 2: + case 3: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = i << 10; + } + break; + } + break; + case 160: + switch (GSU.vMode) + { + case 0: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = (i << 8) + (i << 6); + } + break; + case 1: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = (i << 9) + (i << 7); + } + break; + case 2: + case 3: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = (i << 10) + (i << 8); + } + break; + } + break; + case 192: + switch (GSU.vMode) + { + case 0: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 4); + GSU.x[i] = (i << 8) + (i << 7); + } + break; + case 1: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 5); + GSU.x[i] = (i << 9) + (i << 8); + } + break; + case 2: + case 3: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + (i << 6); + GSU.x[i] = (i << 10) + (i << 9); + } + break; + } + break; + case 256: + switch (GSU.vMode) + { + case 0: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + + ((i & 0x10) << 9) + ((i & 0xf) << 8); + GSU.x[i] = ((i & 0x10) << 8) + ((i & 0xf) << 4); + } + break; + case 1: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + + ((i & 0x10) << 10) + ((i & 0xf) << 9); + GSU.x[i] = ((i & 0x10) << 9) + ((i & 0xf) << 5); + } + break; + case 2: + case 3: + for (i = 0; i < 32; i++) + { + GSU.apvScreen[i] = GSU.pvScreenBase + + ((i & 0x10) << 11) + ((i & 0xf) << 10); + GSU.x[i] = ((i & 0x10) << 10) + ((i & 0xf) << 6); + } + break; + } + break; + } + GSU.vPrevMode = GSU.vMode; + GSU.vPrevScreenHeight = GSU.vScreenHeight; + } +} + +static void fx_writeRegisterSpace() +{ + int i; + uint8 *p; + + p = GSU.pvRegisters; + for(i=0; i<16; i++) + { + *p++ = (uint8)GSU.avReg[i]; + *p++ = (uint8)(GSU.avReg[i] >> 8); + } + + /* Update status register */ + if( USEX16(GSU.vZero) == 0 ) SF(Z); + else CF(Z); + if( GSU.vSign & 0x8000 ) SF(S); + else CF(S); + if(GSU.vOverflow >= 0x8000 || GSU.vOverflow < -0x8000) SF(OV); + else CF(OV); + if(GSU.vCarry) SF(CY); + else CF(CY); + + p = GSU.pvRegisters; + p[GSU_SFR] = (uint8)GSU.vStatusReg; + p[GSU_SFR+1] = (uint8)(GSU.vStatusReg>>8); + p[GSU_PBR] = (uint8)GSU.vPrgBankReg; + p[GSU_ROMBR] = (uint8)GSU.vRomBankReg; + p[GSU_RAMBR] = (uint8)GSU.vRamBankReg; + p[GSU_CBR] = (uint8)GSU.vCacheBaseReg; + p[GSU_CBR+1] = (uint8)(GSU.vCacheBaseReg>>8); + + fx_restoreCache(); +} + +/* Reset the FxChip */ +void FxReset(struct FxInit_s *psFxInfo) +{ + int i; + static uint32 (**appfFunction[])(uint32) = { + &fx_apfFunctionTable[0], +#if 0 + &fx_a_apfFunctionTable[0], + &fx_r_apfFunctionTable[0], + &fx_ar_apfFunctionTable[0], +#endif + }; + static void (**appfPlot[])() = { + &fx_apfPlotTable[0], +#if 0 + &fx_a_apfPlotTable[0], + &fx_r_apfPlotTable[0], + &fx_ar_apfPlotTable[0], +#endif + }; + static void (**appfOpcode[])() = { + &fx_apfOpcodeTable[0], +#if 0 + &fx_a_apfOpcodeTable[0], + &fx_r_apfOpcodeTable[0], + &fx_ar_apfOpcodeTable[0], +#endif + }; + + /* Get function pointers for the current emulation mode */ + fx_ppfFunctionTable = appfFunction[psFxInfo->vFlags & 0x3]; + fx_ppfPlotTable = appfPlot[psFxInfo->vFlags & 0x3]; + fx_ppfOpcodeTable = appfOpcode[psFxInfo->vFlags & 0x3]; + + /* Clear all internal variables */ + memset((uint8*)&GSU,0,sizeof(struct FxRegs_s)); + + /* Set default registers */ + GSU.pvSreg = GSU.pvDreg = &R0; + + /* Set RAM and ROM pointers */ + GSU.pvRegisters = psFxInfo->pvRegisters; + GSU.nRamBanks = psFxInfo->nRamBanks; + GSU.pvRam = psFxInfo->pvRam; + GSU.nRomBanks = psFxInfo->nRomBanks; + GSU.pvRom = psFxInfo->pvRom; + GSU.vPrevScreenHeight = ~0; + GSU.vPrevMode = ~0; + + /* The GSU can't access more than 2mb (16mbits) */ + if(GSU.nRomBanks > 0x20) + GSU.nRomBanks = 0x20; + + /* Clear FxChip register space */ + memset(GSU.pvRegisters,0,0x300); + + /* Set FxChip version Number */ + GSU.pvRegisters[0x3b] = 0; + + /* Make ROM bank table */ + for(i=0; i<256; i++) + { + uint32 b = i & 0x7f; + if (b >= 0x40) + { + if (GSU.nRomBanks > 1) + b %= GSU.nRomBanks; + else + b &= 1; + + GSU.apvRomBank[i] = &GSU.pvRom[ b << 16 ]; + } + else + { + b %= GSU.nRomBanks * 2; + GSU.apvRomBank[i] = &GSU.pvRom[ (b << 16) + 0x200000]; + } + } + + /* Make RAM bank table */ + for(i=0; i<4; i++) + { + GSU.apvRamBank[i] = &GSU.pvRam[(i % GSU.nRamBanks) << 16]; + GSU.apvRomBank[0x70 + i] = GSU.apvRamBank[i]; + } + + /* Start with a nop in the pipe */ + GSU.vPipe = 0x01; + + /* Set pointer to GSU cache */ + GSU.pvCache = &GSU.pvRegisters[0x100]; + + fx_readRegisterSpace(); +} + +static uint8 fx_checkStartAddress() +{ + /* Check if we start inside the cache */ + if(GSU.bCacheActive && R15 >= GSU.vCacheBaseReg && R15 < (GSU.vCacheBaseReg+512)) + return TRUE; + + /* Check if we're in an unused area */ + if(GSU.vPrgBankReg < 0x40 && R15 < 0x8000) + return FALSE; + if(GSU.vPrgBankReg >= 0x60 && GSU.vPrgBankReg <= 0x6f) + return FALSE; + if(GSU.vPrgBankReg >= 0x74) + return FALSE; + + /* Check if we're in RAM and the RAN flag is not set */ + if(GSU.vPrgBankReg >= 0x70 && GSU.vPrgBankReg <= 0x73 && !(SCMR&(1<<3)) ) + return FALSE; + + /* If not, we're in ROM, so check if the RON flag is set */ + if(!(SCMR&(1<<4))) + return FALSE; + + return TRUE; +} + +/* Execute until the next stop instruction */ +int FxEmulate(uint32 nInstructions) +{ + uint32 vCount; + + /* Read registers and initialize GSU session */ + fx_readRegisterSpace(); + + /* Check if the start address is valid */ + if(!fx_checkStartAddress()) + { + CF(G); + fx_writeRegisterSpace(); +#if 0 + GSU.vIllegalAddress = (GSU.vPrgBankReg << 24) | R15; + return FX_ERROR_ILLEGAL_ADDRESS; +#else + return 0; +#endif + } + + /* Execute GSU session */ + CF(IRQ); + + if(GSU.bBreakPoint) + vCount = fx_ppfFunctionTable[FX_FUNCTION_RUN_TO_BREAKPOINT](nInstructions); + else + vCount = fx_ppfFunctionTable[FX_FUNCTION_RUN](nInstructions); + + /* Store GSU registers */ + fx_writeRegisterSpace(); + + /* Check for error code */ + if(GSU.vErrorCode) + return GSU.vErrorCode; + else + return vCount; +} + +/* Breakpoints */ +void FxBreakPointSet(uint32 vAddress) +{ + GSU.bBreakPoint = TRUE; + GSU.vBreakPoint = USEX16(vAddress); +} +void FxBreakPointClear() +{ + GSU.bBreakPoint = FALSE; +} + +/* Step by step execution */ +int FxStepOver(uint32 nInstructions) +{ + uint32 vCount; + fx_readRegisterSpace(); + + /* Check if the start address is valid */ + if(!fx_checkStartAddress()) + { + CF(G); +#if 0 + GSU.vIllegalAddress = (GSU.vPrgBankReg << 24) | R15; + return FX_ERROR_ILLEGAL_ADDRESS; +#else + return 0; +#endif + } + + if( PIPE >= 0xf0 ) + GSU.vStepPoint = USEX16(R15+3); + else if( (PIPE >= 0x05 && PIPE <= 0x0f) || (PIPE >= 0xa0 && PIPE <= 0xaf) ) + GSU.vStepPoint = USEX16(R15+2); + else + GSU.vStepPoint = USEX16(R15+1); + vCount = fx_ppfFunctionTable[FX_FUNCTION_STEP_OVER](nInstructions); + fx_writeRegisterSpace(); + if(GSU.vErrorCode) + return GSU.vErrorCode; + else + return vCount; +} + +/* Errors */ +int FxGetErrorCode() +{ + return GSU.vErrorCode; +} + +int FxGetIllegalAddress() +{ + return GSU.vIllegalAddress; +} + +/* Access to internal registers */ +uint32 FxGetColorRegister() +{ + return GSU.vColorReg & 0xff; +} + +uint32 FxGetPlotOptionRegister() +{ + return GSU.vPlotOptionReg & 0x1f; +} + +uint32 FxGetSourceRegisterIndex() +{ + return GSU.pvSreg - GSU.avReg; +} + +uint32 FxGetDestinationRegisterIndex() +{ + return GSU.pvDreg - GSU.avReg; +} + +uint8 FxPipe() +{ + return GSU.vPipe; +} + diff --git a/src/fxinst.cpp b/src/fxinst.cpp new file mode 100644 index 0000000..c305f30 --- /dev/null +++ b/src/fxinst.cpp @@ -0,0 +1,1916 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#define FX_DO_ROMBUFFER + +#include "fxemu.h" +#include "fxinst.h" +#include +#include + +extern struct FxRegs_s GSU; +int gsu_bank [512] = {0}; + +/* Set this define if you wish the plot instruction to check for y-pos limits */ +/* (I don't think it's nessecary) */ +#define CHECK_LIMITS + +/* Codes used: + * + * rn = a GSU register (r0-r15) + * #n = 4 bit immediate value + * #pp = 8 bit immediate value + * (yy) = 8 bit word address (0x0000 - 0x01fe) + * #xx = 16 bit immediate value + * (xx) = 16 bit address (0x0000 - 0xffff) + * + */ + +/* 00 - stop - stop GSU execution (and maybe generate an IRQ) */ +static void fx_stop() +{ + CF(G); + GSU.vCounter = 0; + GSU.vInstCount = GSU.vCounter; + + /* Check if we need to generate an IRQ */ + if(!(GSU.pvRegisters[GSU_CFGR] & 0x80)) + SF(IRQ); + + GSU.vPlotOptionReg = 0; + GSU.vPipe = 1; + CLRFLAGS; + R15++; +} + +/* 01 - nop - no operation */ +static void fx_nop() { CLRFLAGS; R15++; } + +extern void fx_flushCache(); + +/* 02 - cache - reintialize GSU cache */ +static void fx_cache() +{ + uint32 c = R15 & 0xfff0; + if(GSU.vCacheBaseReg != c || !GSU.bCacheActive) + { + fx_flushCache(); + GSU.vCacheBaseReg = c; + GSU.bCacheActive = TRUE; +#if 0 + if(c < (0x10000-512)) + { + uint8 const* t = &FXROM(c); + memcpy(GSU.pvCache,t,512); + } + else + { + uint8 const* t1; + uint8 const* t2; + uint32 i = 0x10000 - c; + t1 = &FXROM(c); + t2 = &FXROM(0); + memcpy(GSU.pvCache,t1,i); + memcpy(&GSU.pvCache[i],t2,512-i); + } +#endif + } + R15++; + CLRFLAGS; +} + +/* 03 - lsr - logic shift right */ +static void fx_lsr() +{ + uint32 v; + GSU.vCarry = SREG & 1; + v = USEX16(SREG) >> 1; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 04 - rol - rotate left */ +static void fx_rol() +{ + uint32 v = USEX16((SREG << 1) + GSU.vCarry); + GSU.vCarry = (SREG >> 15) & 1; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 05 - bra - branch always */ +static void fx_bra() { uint8 v = PIPE; R15++; FETCHPIPE; R15 += SEX8(v); } + +/* Branch on condition */ +#define BRA_COND(cond) uint8 v = PIPE; R15++; FETCHPIPE; if(cond) R15 += SEX8(v); else R15++; + +#define TEST_S (GSU.vSign & 0x8000) +#define TEST_Z (USEX16(GSU.vZero) == 0) +#define TEST_OV (GSU.vOverflow >= 0x8000 || GSU.vOverflow < -0x8000) +#define TEST_CY (GSU.vCarry & 1) + +/* 06 - blt - branch on less than */ +static void fx_blt() { BRA_COND( (TEST_S!=0) != (TEST_OV!=0) ); } + +/* 07 - bge - branch on greater or equals */ +static void fx_bge() { BRA_COND( (TEST_S!=0) == (TEST_OV!=0)); } + +/* 08 - bne - branch on not equal */ +static void fx_bne() { BRA_COND( !TEST_Z ); } + +/* 09 - beq - branch on equal */ +static void fx_beq() { BRA_COND( TEST_Z ); } + +/* 0a - bpl - branch on plus */ +static void fx_bpl() { BRA_COND( !TEST_S ); } + +/* 0b - bmi - branch on minus */ +static void fx_bmi() { BRA_COND( TEST_S ); } + +/* 0c - bcc - branch on carry clear */ +static void fx_bcc() { BRA_COND( !TEST_CY ); } + +/* 0d - bcs - branch on carry set */ +static void fx_bcs() { BRA_COND( TEST_CY ); } + +/* 0e - bvc - branch on overflow clear */ +static void fx_bvc() { BRA_COND( !TEST_OV ); } + +/* 0f - bvs - branch on overflow set */ +static void fx_bvs() { BRA_COND( TEST_OV ); } + +/* 10-1f - to rn - set register n as destination register */ +/* 10-1f(B) - move rn - move one register to another (if B flag is set) */ +#define FX_TO(reg) \ +if(TF(B)) { GSU.avReg[(reg)] = SREG; CLRFLAGS; } \ +else { GSU.pvDreg = &GSU.avReg[reg]; } R15++; +#define FX_TO_R14(reg) \ +if(TF(B)) { GSU.avReg[(reg)] = SREG; CLRFLAGS; READR14; } \ +else { GSU.pvDreg = &GSU.avReg[reg]; } R15++; +#define FX_TO_R15(reg) \ +if(TF(B)) { GSU.avReg[(reg)] = SREG; CLRFLAGS; } \ +else { GSU.pvDreg = &GSU.avReg[reg]; R15++; } +static void fx_to_r0() { FX_TO(0); } +static void fx_to_r1() { FX_TO(1); } +static void fx_to_r2() { FX_TO(2); } +static void fx_to_r3() { FX_TO(3); } +static void fx_to_r4() { FX_TO(4); } +static void fx_to_r5() { FX_TO(5); } +static void fx_to_r6() { FX_TO(6); } +static void fx_to_r7() { FX_TO(7); } +static void fx_to_r8() { FX_TO(8); } +static void fx_to_r9() { FX_TO(9); } +static void fx_to_r10() { FX_TO(10); } +static void fx_to_r11() { FX_TO(11); } +static void fx_to_r12() { FX_TO(12); } +static void fx_to_r13() { FX_TO(13); } +static void fx_to_r14() { FX_TO_R14(14); } +static void fx_to_r15() { FX_TO_R15(15); } + +/* 20-2f - to rn - set register n as source and destination register */ +#define FX_WITH(reg) SF(B); GSU.pvSreg = GSU.pvDreg = &GSU.avReg[reg]; R15++; +static void fx_with_r0() { FX_WITH(0); } +static void fx_with_r1() { FX_WITH(1); } +static void fx_with_r2() { FX_WITH(2); } +static void fx_with_r3() { FX_WITH(3); } +static void fx_with_r4() { FX_WITH(4); } +static void fx_with_r5() { FX_WITH(5); } +static void fx_with_r6() { FX_WITH(6); } +static void fx_with_r7() { FX_WITH(7); } +static void fx_with_r8() { FX_WITH(8); } +static void fx_with_r9() { FX_WITH(9); } +static void fx_with_r10() { FX_WITH(10); } +static void fx_with_r11() { FX_WITH(11); } +static void fx_with_r12() { FX_WITH(12); } +static void fx_with_r13() { FX_WITH(13); } +static void fx_with_r14() { FX_WITH(14); } +static void fx_with_r15() { FX_WITH(15); } + +/* 30-3b - stw (rn) - store word */ +#define FX_STW(reg) \ +GSU.vLastRamAdr = GSU.avReg[reg]; \ +RAM(GSU.avReg[reg]) = (uint8)SREG; \ +RAM(GSU.avReg[reg]^1) = (uint8)(SREG>>8); \ +CLRFLAGS; R15++ +static void fx_stw_r0() { FX_STW(0); } +static void fx_stw_r1() { FX_STW(1); } +static void fx_stw_r2() { FX_STW(2); } +static void fx_stw_r3() { FX_STW(3); } +static void fx_stw_r4() { FX_STW(4); } +static void fx_stw_r5() { FX_STW(5); } +static void fx_stw_r6() { FX_STW(6); } +static void fx_stw_r7() { FX_STW(7); } +static void fx_stw_r8() { FX_STW(8); } +static void fx_stw_r9() { FX_STW(9); } +static void fx_stw_r10() { FX_STW(10); } +static void fx_stw_r11() { FX_STW(11); } + +/* 30-3b(ALT1) - stb (rn) - store byte */ +#define FX_STB(reg) \ +GSU.vLastRamAdr = GSU.avReg[reg]; \ +RAM(GSU.avReg[reg]) = (uint8)SREG; \ +CLRFLAGS; R15++ +static void fx_stb_r0() { FX_STB(0); } +static void fx_stb_r1() { FX_STB(1); } +static void fx_stb_r2() { FX_STB(2); } +static void fx_stb_r3() { FX_STB(3); } +static void fx_stb_r4() { FX_STB(4); } +static void fx_stb_r5() { FX_STB(5); } +static void fx_stb_r6() { FX_STB(6); } +static void fx_stb_r7() { FX_STB(7); } +static void fx_stb_r8() { FX_STB(8); } +static void fx_stb_r9() { FX_STB(9); } +static void fx_stb_r10() { FX_STB(10); } +static void fx_stb_r11() { FX_STB(11); } + +/* 3c - loop - decrement loop counter, and branch on not zero */ +static void fx_loop() +{ + GSU.vSign = GSU.vZero = --R12; + if( (uint16) R12 != 0 ) + R15 = R13; + else + R15++; + + CLRFLAGS; +} + +/* 3d - alt1 - set alt1 mode */ +static void fx_alt1() { SF(ALT1); CF(B); R15++; } + +/* 3e - alt2 - set alt2 mode */ +static void fx_alt2() { SF(ALT2); CF(B); R15++; } + +/* 3f - alt3 - set alt3 mode */ +static void fx_alt3() { SF(ALT1); SF(ALT2); CF(B); R15++; } + +/* 40-4b - ldw (rn) - load word from RAM */ +#define FX_LDW(reg) uint32 v; \ +GSU.vLastRamAdr = GSU.avReg[reg]; \ +v = (uint32)RAM(GSU.avReg[reg]); \ +v |= ((uint32)RAM(GSU.avReg[reg]^1))<<8; \ +R15++; DREG = v; \ +TESTR14; \ +CLRFLAGS +static void fx_ldw_r0() { FX_LDW(0); } +static void fx_ldw_r1() { FX_LDW(1); } +static void fx_ldw_r2() { FX_LDW(2); } +static void fx_ldw_r3() { FX_LDW(3); } +static void fx_ldw_r4() { FX_LDW(4); } +static void fx_ldw_r5() { FX_LDW(5); } +static void fx_ldw_r6() { FX_LDW(6); } +static void fx_ldw_r7() { FX_LDW(7); } +static void fx_ldw_r8() { FX_LDW(8); } +static void fx_ldw_r9() { FX_LDW(9); } +static void fx_ldw_r10() { FX_LDW(10); } +static void fx_ldw_r11() { FX_LDW(11); } + +/* 40-4b(ALT1) - ldb (rn) - load byte */ +#define FX_LDB(reg) uint32 v; \ +GSU.vLastRamAdr = GSU.avReg[reg]; \ +v = (uint32)RAM(GSU.avReg[reg]); \ +R15++; DREG = v; \ +TESTR14; \ +CLRFLAGS +static void fx_ldb_r0() { FX_LDB(0); } +static void fx_ldb_r1() { FX_LDB(1); } +static void fx_ldb_r2() { FX_LDB(2); } +static void fx_ldb_r3() { FX_LDB(3); } +static void fx_ldb_r4() { FX_LDB(4); } +static void fx_ldb_r5() { FX_LDB(5); } +static void fx_ldb_r6() { FX_LDB(6); } +static void fx_ldb_r7() { FX_LDB(7); } +static void fx_ldb_r8() { FX_LDB(8); } +static void fx_ldb_r9() { FX_LDB(9); } +static void fx_ldb_r10() { FX_LDB(10); } +static void fx_ldb_r11() { FX_LDB(11); } + +/* 4c - plot - plot pixel with R1,R2 as x,y and the color register as the color */ +static void fx_plot_2bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v,c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + if(GSU.vPlotOptionReg & 0x02) + c = (x^y)&1 ? (uint8)(GSU.vColorReg>>4) : (uint8)GSU.vColorReg; + else + c = (uint8)GSU.vColorReg; + + if( !(GSU.vPlotOptionReg & 0x01) && !(c & 0xf)) return; + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + if(c & 0x01) a[0] |= v; + else a[0] &= ~v; + if(c & 0x02) a[1] |= v; + else a[1] &= ~v; +} + +/* 2c(ALT1) - rpix - read color of the pixel with R1,R2 as x,y */ +static void fx_rpix_2bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + DREG = 0; + DREG |= ((uint32)((a[0] & v) != 0)) << 0; + DREG |= ((uint32)((a[1] & v) != 0)) << 1; + TESTR14; +} + +/* 4c - plot - plot pixel with R1,R2 as x,y and the color register as the color */ +static void fx_plot_4bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v,c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + if(GSU.vPlotOptionReg & 0x02) + c = (x^y)&1 ? (uint8)(GSU.vColorReg>>4) : (uint8)GSU.vColorReg; + else + c = (uint8)GSU.vColorReg; + + if( !(GSU.vPlotOptionReg & 0x01) && !(c & 0xf)) return; + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + if(c & 0x01) a[0x00] |= v; + else a[0x00] &= ~v; + if(c & 0x02) a[0x01] |= v; + else a[0x01] &= ~v; + if(c & 0x04) a[0x10] |= v; + else a[0x10] &= ~v; + if(c & 0x08) a[0x11] |= v; + else a[0x11] &= ~v; +} + +/* 4c(ALT1) - rpix - read color of the pixel with R1,R2 as x,y */ +static void fx_rpix_4bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; + +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + DREG = 0; + DREG |= ((uint32)((a[0x00] & v) != 0)) << 0; + DREG |= ((uint32)((a[0x01] & v) != 0)) << 1; + DREG |= ((uint32)((a[0x10] & v) != 0)) << 2; + DREG |= ((uint32)((a[0x11] & v) != 0)) << 3; + TESTR14; +} + +/* 8c - plot - plot pixel with R1,R2 as x,y and the color register as the color */ +static void fx_plot_8bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v,c; + + R15++; + CLRFLAGS; + R1++; + +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + c = (uint8)GSU.vColorReg; + if( !(GSU.vPlotOptionReg & 0x10) ) + { + if( !(GSU.vPlotOptionReg & 0x01) && !(c&0xf)) return; + } + else + if( !(GSU.vPlotOptionReg & 0x01) && !c) return; + + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + if(c & 0x01) a[0x00] |= v; + else a[0x00] &= ~v; + if(c & 0x02) a[0x01] |= v; + else a[0x01] &= ~v; + if(c & 0x04) a[0x10] |= v; + else a[0x10] &= ~v; + if(c & 0x08) a[0x11] |= v; + else a[0x11] &= ~v; + if(c & 0x10) a[0x20] |= v; + else a[0x20] &= ~v; + if(c & 0x20) a[0x21] |= v; + else a[0x21] &= ~v; + if(c & 0x40) a[0x30] |= v; + else a[0x30] &= ~v; + if(c & 0x80) a[0x31] |= v; + else a[0x31] &= ~v; +} + +/* 4c(ALT1) - rpix - read color of the pixel with R1,R2 as x,y */ +static void fx_rpix_8bit() +{ + uint32 x = USEX8(R1); + uint32 y = USEX8(R2); + uint8 *a; + uint8 v; + + R15++; + CLRFLAGS; + +#ifdef CHECK_LIMITS + if(y >= GSU.vScreenHeight) return; +#endif + a = GSU.apvScreen[y >> 3] + GSU.x[x >> 3] + ((y & 7) << 1); + v = 128 >> (x&7); + + DREG = 0; + DREG |= ((uint32)((a[0x00] & v) != 0)) << 0; + DREG |= ((uint32)((a[0x01] & v) != 0)) << 1; + DREG |= ((uint32)((a[0x10] & v) != 0)) << 2; + DREG |= ((uint32)((a[0x11] & v) != 0)) << 3; + DREG |= ((uint32)((a[0x20] & v) != 0)) << 4; + DREG |= ((uint32)((a[0x21] & v) != 0)) << 5; + DREG |= ((uint32)((a[0x30] & v) != 0)) << 6; + DREG |= ((uint32)((a[0x31] & v) != 0)) << 7; + GSU.vZero = DREG; + TESTR14; +} + +/* 4o - plot - plot pixel with R1,R2 as x,y and the color register as the color */ +static void fx_plot_obj() +{ + printf ("ERROR fx_plot_obj called\n"); +} + +/* 4c(ALT1) - rpix - read color of the pixel with R1,R2 as x,y */ +static void fx_rpix_obj() +{ + printf ("ERROR fx_rpix_obj called\n"); +} + +/* 4d - swap - swap upper and lower byte of a register */ +static void fx_swap() +{ + uint8 c = (uint8)SREG; + uint8 d = (uint8)(SREG>>8); + uint32 v = (((uint32)c)<<8)|((uint32)d); + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 4e - color - copy source register to color register */ +static void fx_color() +{ + uint8 c = (uint8)SREG; + if(GSU.vPlotOptionReg & 0x04) + c = (c&0xf0) | (c>>4); + if(GSU.vPlotOptionReg & 0x08) + { + GSU.vColorReg &= 0xf0; + GSU.vColorReg |= c & 0x0f; + } + else + GSU.vColorReg = USEX8(c); + CLRFLAGS; + R15++; +} + +/* 4e(ALT1) - cmode - set plot option register */ +static void fx_cmode() +{ + GSU.vPlotOptionReg = SREG; + + if(GSU.vPlotOptionReg & 0x10) + { + /* OBJ Mode (for drawing into sprites) */ + GSU.vScreenHeight = 256; + } + else + GSU.vScreenHeight = GSU.vScreenRealHeight; + + fx_computeScreenPointers (); + CLRFLAGS; + R15++; +} + +/* 4f - not - perform exclusive exor with 1 on all bits */ +static void fx_not() +{ + uint32 v = ~SREG; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 50-5f - add rn - add, register + register */ +#define FX_ADD(reg) \ +int32 s = SUSEX16(SREG) + SUSEX16(GSU.avReg[reg]); \ +GSU.vCarry = s >= 0x10000; \ +GSU.vOverflow = ~(SREG ^ GSU.avReg[reg]) & (GSU.avReg[reg] ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_add_r0() { FX_ADD(0); } +static void fx_add_r1() { FX_ADD(1); } +static void fx_add_r2() { FX_ADD(2); } +static void fx_add_r3() { FX_ADD(3); } +static void fx_add_r4() { FX_ADD(4); } +static void fx_add_r5() { FX_ADD(5); } +static void fx_add_r6() { FX_ADD(6); } +static void fx_add_r7() { FX_ADD(7); } +static void fx_add_r8() { FX_ADD(8); } +static void fx_add_r9() { FX_ADD(9); } +static void fx_add_r10() { FX_ADD(10); } +static void fx_add_r11() { FX_ADD(11); } +static void fx_add_r12() { FX_ADD(12); } +static void fx_add_r13() { FX_ADD(13); } +static void fx_add_r14() { FX_ADD(14); } +static void fx_add_r15() { FX_ADD(15); } + +/* 50-5f(ALT1) - adc rn - add with carry, register + register */ +#define FX_ADC(reg) \ +int32 s = SUSEX16(SREG) + SUSEX16(GSU.avReg[reg]) + SEX16(GSU.vCarry); \ +GSU.vCarry = s >= 0x10000; \ +GSU.vOverflow = ~(SREG ^ GSU.avReg[reg]) & (GSU.avReg[reg] ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_adc_r0() { FX_ADC(0); } +static void fx_adc_r1() { FX_ADC(1); } +static void fx_adc_r2() { FX_ADC(2); } +static void fx_adc_r3() { FX_ADC(3); } +static void fx_adc_r4() { FX_ADC(4); } +static void fx_adc_r5() { FX_ADC(5); } +static void fx_adc_r6() { FX_ADC(6); } +static void fx_adc_r7() { FX_ADC(7); } +static void fx_adc_r8() { FX_ADC(8); } +static void fx_adc_r9() { FX_ADC(9); } +static void fx_adc_r10() { FX_ADC(10); } +static void fx_adc_r11() { FX_ADC(11); } +static void fx_adc_r12() { FX_ADC(12); } +static void fx_adc_r13() { FX_ADC(13); } +static void fx_adc_r14() { FX_ADC(14); } +static void fx_adc_r15() { FX_ADC(15); } + +/* 50-5f(ALT2) - add #n - add, register + immediate */ +#define FX_ADD_I(imm) \ +int32 s = SUSEX16(SREG) + imm; \ +GSU.vCarry = s >= 0x10000; \ +GSU.vOverflow = ~(SREG ^ imm) & (imm ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_add_i0() { FX_ADD_I(0); } +static void fx_add_i1() { FX_ADD_I(1); } +static void fx_add_i2() { FX_ADD_I(2); } +static void fx_add_i3() { FX_ADD_I(3); } +static void fx_add_i4() { FX_ADD_I(4); } +static void fx_add_i5() { FX_ADD_I(5); } +static void fx_add_i6() { FX_ADD_I(6); } +static void fx_add_i7() { FX_ADD_I(7); } +static void fx_add_i8() { FX_ADD_I(8); } +static void fx_add_i9() { FX_ADD_I(9); } +static void fx_add_i10() { FX_ADD_I(10); } +static void fx_add_i11() { FX_ADD_I(11); } +static void fx_add_i12() { FX_ADD_I(12); } +static void fx_add_i13() { FX_ADD_I(13); } +static void fx_add_i14() { FX_ADD_I(14); } +static void fx_add_i15() { FX_ADD_I(15); } + +/* 50-5f(ALT3) - adc #n - add with carry, register + immediate */ +#define FX_ADC_I(imm) \ +int32 s = SUSEX16(SREG) + imm + SUSEX16(GSU.vCarry); \ +GSU.vCarry = s >= 0x10000; \ +GSU.vOverflow = ~(SREG ^ imm) & (imm ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_adc_i0() { FX_ADC_I(0); } +static void fx_adc_i1() { FX_ADC_I(1); } +static void fx_adc_i2() { FX_ADC_I(2); } +static void fx_adc_i3() { FX_ADC_I(3); } +static void fx_adc_i4() { FX_ADC_I(4); } +static void fx_adc_i5() { FX_ADC_I(5); } +static void fx_adc_i6() { FX_ADC_I(6); } +static void fx_adc_i7() { FX_ADC_I(7); } +static void fx_adc_i8() { FX_ADC_I(8); } +static void fx_adc_i9() { FX_ADC_I(9); } +static void fx_adc_i10() { FX_ADC_I(10); } +static void fx_adc_i11() { FX_ADC_I(11); } +static void fx_adc_i12() { FX_ADC_I(12); } +static void fx_adc_i13() { FX_ADC_I(13); } +static void fx_adc_i14() { FX_ADC_I(14); } +static void fx_adc_i15() { FX_ADC_I(15); } + +/* 60-6f - sub rn - subtract, register - register */ +#define FX_SUB(reg) \ +int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]); \ +GSU.vCarry = s >= 0; \ +GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_sub_r0() { FX_SUB(0); } +static void fx_sub_r1() { FX_SUB(1); } +static void fx_sub_r2() { FX_SUB(2); } +static void fx_sub_r3() { FX_SUB(3); } +static void fx_sub_r4() { FX_SUB(4); } +static void fx_sub_r5() { FX_SUB(5); } +static void fx_sub_r6() { FX_SUB(6); } +static void fx_sub_r7() { FX_SUB(7); } +static void fx_sub_r8() { FX_SUB(8); } +static void fx_sub_r9() { FX_SUB(9); } +static void fx_sub_r10() { FX_SUB(10); } +static void fx_sub_r11() { FX_SUB(11); } +static void fx_sub_r12() { FX_SUB(12); } +static void fx_sub_r13() { FX_SUB(13); } +static void fx_sub_r14() { FX_SUB(14); } +static void fx_sub_r15() { FX_SUB(15); } + +/* 60-6f(ALT1) - sbc rn - subtract with carry, register - register */ +#define FX_SBC(reg) \ +int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]) - (SUSEX16(GSU.vCarry^1)); \ +GSU.vCarry = s >= 0; \ +GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_sbc_r0() { FX_SBC(0); } +static void fx_sbc_r1() { FX_SBC(1); } +static void fx_sbc_r2() { FX_SBC(2); } +static void fx_sbc_r3() { FX_SBC(3); } +static void fx_sbc_r4() { FX_SBC(4); } +static void fx_sbc_r5() { FX_SBC(5); } +static void fx_sbc_r6() { FX_SBC(6); } +static void fx_sbc_r7() { FX_SBC(7); } +static void fx_sbc_r8() { FX_SBC(8); } +static void fx_sbc_r9() { FX_SBC(9); } +static void fx_sbc_r10() { FX_SBC(10); } +static void fx_sbc_r11() { FX_SBC(11); } +static void fx_sbc_r12() { FX_SBC(12); } +static void fx_sbc_r13() { FX_SBC(13); } +static void fx_sbc_r14() { FX_SBC(14); } +static void fx_sbc_r15() { FX_SBC(15); } + +/* 60-6f(ALT2) - sub #n - subtract, register - immediate */ +#define FX_SUB_I(imm) \ +int32 s = SUSEX16(SREG) - imm; \ +GSU.vCarry = s >= 0; \ +GSU.vOverflow = (SREG ^ imm) & (SREG ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; DREG = s; \ +TESTR14; \ +CLRFLAGS +static void fx_sub_i0() { FX_SUB_I(0); } +static void fx_sub_i1() { FX_SUB_I(1); } +static void fx_sub_i2() { FX_SUB_I(2); } +static void fx_sub_i3() { FX_SUB_I(3); } +static void fx_sub_i4() { FX_SUB_I(4); } +static void fx_sub_i5() { FX_SUB_I(5); } +static void fx_sub_i6() { FX_SUB_I(6); } +static void fx_sub_i7() { FX_SUB_I(7); } +static void fx_sub_i8() { FX_SUB_I(8); } +static void fx_sub_i9() { FX_SUB_I(9); } +static void fx_sub_i10() { FX_SUB_I(10); } +static void fx_sub_i11() { FX_SUB_I(11); } +static void fx_sub_i12() { FX_SUB_I(12); } +static void fx_sub_i13() { FX_SUB_I(13); } +static void fx_sub_i14() { FX_SUB_I(14); } +static void fx_sub_i15() { FX_SUB_I(15); } + +/* 60-6f(ALT3) - cmp rn - compare, register, register */ +#define FX_CMP(reg) \ +int32 s = SUSEX16(SREG) - SUSEX16(GSU.avReg[reg]); \ +GSU.vCarry = s >= 0; \ +GSU.vOverflow = (SREG ^ GSU.avReg[reg]) & (SREG ^ s) & 0x8000; \ +GSU.vSign = s; \ +GSU.vZero = s; \ +R15++; \ +CLRFLAGS; +static void fx_cmp_r0() { FX_CMP(0); } +static void fx_cmp_r1() { FX_CMP(1); } +static void fx_cmp_r2() { FX_CMP(2); } +static void fx_cmp_r3() { FX_CMP(3); } +static void fx_cmp_r4() { FX_CMP(4); } +static void fx_cmp_r5() { FX_CMP(5); } +static void fx_cmp_r6() { FX_CMP(6); } +static void fx_cmp_r7() { FX_CMP(7); } +static void fx_cmp_r8() { FX_CMP(8); } +static void fx_cmp_r9() { FX_CMP(9); } +static void fx_cmp_r10() { FX_CMP(10); } +static void fx_cmp_r11() { FX_CMP(11); } +static void fx_cmp_r12() { FX_CMP(12); } +static void fx_cmp_r13() { FX_CMP(13); } +static void fx_cmp_r14() { FX_CMP(14); } +static void fx_cmp_r15() { FX_CMP(15); } + +/* 70 - merge - R7 as upper byte, R8 as lower byte (used for texture-mapping) */ +static void fx_merge() +{ + uint32 v = (R7&0xff00) | ((R8&0xff00)>>8); + R15++; DREG = v; + GSU.vOverflow = (v & 0xc0c0) << 16; + GSU.vZero = !(v & 0xf0f0); + GSU.vSign = ((v | (v<<8)) & 0x8000); + GSU.vCarry = (v & 0xe0e0) != 0; + TESTR14; + CLRFLAGS; +} + +/* 71-7f - and rn - reister & register */ +#define FX_AND(reg) \ +uint32 v = SREG & GSU.avReg[reg]; \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_and_r1() { FX_AND(1); } +static void fx_and_r2() { FX_AND(2); } +static void fx_and_r3() { FX_AND(3); } +static void fx_and_r4() { FX_AND(4); } +static void fx_and_r5() { FX_AND(5); } +static void fx_and_r6() { FX_AND(6); } +static void fx_and_r7() { FX_AND(7); } +static void fx_and_r8() { FX_AND(8); } +static void fx_and_r9() { FX_AND(9); } +static void fx_and_r10() { FX_AND(10); } +static void fx_and_r11() { FX_AND(11); } +static void fx_and_r12() { FX_AND(12); } +static void fx_and_r13() { FX_AND(13); } +static void fx_and_r14() { FX_AND(14); } +static void fx_and_r15() { FX_AND(15); } + +/* 71-7f(ALT1) - bic rn - reister & ~register */ +#define FX_BIC(reg) \ +uint32 v = SREG & ~GSU.avReg[reg]; \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_bic_r1() { FX_BIC(1); } +static void fx_bic_r2() { FX_BIC(2); } +static void fx_bic_r3() { FX_BIC(3); } +static void fx_bic_r4() { FX_BIC(4); } +static void fx_bic_r5() { FX_BIC(5); } +static void fx_bic_r6() { FX_BIC(6); } +static void fx_bic_r7() { FX_BIC(7); } +static void fx_bic_r8() { FX_BIC(8); } +static void fx_bic_r9() { FX_BIC(9); } +static void fx_bic_r10() { FX_BIC(10); } +static void fx_bic_r11() { FX_BIC(11); } +static void fx_bic_r12() { FX_BIC(12); } +static void fx_bic_r13() { FX_BIC(13); } +static void fx_bic_r14() { FX_BIC(14); } +static void fx_bic_r15() { FX_BIC(15); } + +/* 71-7f(ALT2) - and #n - reister & immediate */ +#define FX_AND_I(imm) \ +uint32 v = SREG & imm; \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_and_i1() { FX_AND_I(1); } +static void fx_and_i2() { FX_AND_I(2); } +static void fx_and_i3() { FX_AND_I(3); } +static void fx_and_i4() { FX_AND_I(4); } +static void fx_and_i5() { FX_AND_I(5); } +static void fx_and_i6() { FX_AND_I(6); } +static void fx_and_i7() { FX_AND_I(7); } +static void fx_and_i8() { FX_AND_I(8); } +static void fx_and_i9() { FX_AND_I(9); } +static void fx_and_i10() { FX_AND_I(10); } +static void fx_and_i11() { FX_AND_I(11); } +static void fx_and_i12() { FX_AND_I(12); } +static void fx_and_i13() { FX_AND_I(13); } +static void fx_and_i14() { FX_AND_I(14); } +static void fx_and_i15() { FX_AND_I(15); } + +/* 71-7f(ALT3) - bic #n - reister & ~immediate */ +#define FX_BIC_I(imm) \ +uint32 v = SREG & ~imm; \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_bic_i1() { FX_BIC_I(1); } +static void fx_bic_i2() { FX_BIC_I(2); } +static void fx_bic_i3() { FX_BIC_I(3); } +static void fx_bic_i4() { FX_BIC_I(4); } +static void fx_bic_i5() { FX_BIC_I(5); } +static void fx_bic_i6() { FX_BIC_I(6); } +static void fx_bic_i7() { FX_BIC_I(7); } +static void fx_bic_i8() { FX_BIC_I(8); } +static void fx_bic_i9() { FX_BIC_I(9); } +static void fx_bic_i10() { FX_BIC_I(10); } +static void fx_bic_i11() { FX_BIC_I(11); } +static void fx_bic_i12() { FX_BIC_I(12); } +static void fx_bic_i13() { FX_BIC_I(13); } +static void fx_bic_i14() { FX_BIC_I(14); } +static void fx_bic_i15() { FX_BIC_I(15); } + +/* 80-8f - mult rn - 8 bit to 16 bit signed multiply, register * register */ +#define FX_MULT(reg) \ +uint32 v = (uint32)(SEX8(SREG) * SEX8(GSU.avReg[reg])); \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_mult_r0() { FX_MULT(0); } +static void fx_mult_r1() { FX_MULT(1); } +static void fx_mult_r2() { FX_MULT(2); } +static void fx_mult_r3() { FX_MULT(3); } +static void fx_mult_r4() { FX_MULT(4); } +static void fx_mult_r5() { FX_MULT(5); } +static void fx_mult_r6() { FX_MULT(6); } +static void fx_mult_r7() { FX_MULT(7); } +static void fx_mult_r8() { FX_MULT(8); } +static void fx_mult_r9() { FX_MULT(9); } +static void fx_mult_r10() { FX_MULT(10); } +static void fx_mult_r11() { FX_MULT(11); } +static void fx_mult_r12() { FX_MULT(12); } +static void fx_mult_r13() { FX_MULT(13); } +static void fx_mult_r14() { FX_MULT(14); } +static void fx_mult_r15() { FX_MULT(15); } + +/* 80-8f(ALT1) - umult rn - 8 bit to 16 bit unsigned multiply, register * register */ +#define FX_UMULT(reg) \ +uint32 v = USEX8(SREG) * USEX8(GSU.avReg[reg]); \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_umult_r0() { FX_UMULT(0); } +static void fx_umult_r1() { FX_UMULT(1); } +static void fx_umult_r2() { FX_UMULT(2); } +static void fx_umult_r3() { FX_UMULT(3); } +static void fx_umult_r4() { FX_UMULT(4); } +static void fx_umult_r5() { FX_UMULT(5); } +static void fx_umult_r6() { FX_UMULT(6); } +static void fx_umult_r7() { FX_UMULT(7); } +static void fx_umult_r8() { FX_UMULT(8); } +static void fx_umult_r9() { FX_UMULT(9); } +static void fx_umult_r10() { FX_UMULT(10); } +static void fx_umult_r11() { FX_UMULT(11); } +static void fx_umult_r12() { FX_UMULT(12); } +static void fx_umult_r13() { FX_UMULT(13); } +static void fx_umult_r14() { FX_UMULT(14); } +static void fx_umult_r15() { FX_UMULT(15); } + +/* 80-8f(ALT2) - mult #n - 8 bit to 16 bit signed multiply, register * immediate */ +#define FX_MULT_I(imm) \ +uint32 v = (uint32) (SEX8(SREG) * ((int32)imm)); \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_mult_i0() { FX_MULT_I(0); } +static void fx_mult_i1() { FX_MULT_I(1); } +static void fx_mult_i2() { FX_MULT_I(2); } +static void fx_mult_i3() { FX_MULT_I(3); } +static void fx_mult_i4() { FX_MULT_I(4); } +static void fx_mult_i5() { FX_MULT_I(5); } +static void fx_mult_i6() { FX_MULT_I(6); } +static void fx_mult_i7() { FX_MULT_I(7); } +static void fx_mult_i8() { FX_MULT_I(8); } +static void fx_mult_i9() { FX_MULT_I(9); } +static void fx_mult_i10() { FX_MULT_I(10); } +static void fx_mult_i11() { FX_MULT_I(11); } +static void fx_mult_i12() { FX_MULT_I(12); } +static void fx_mult_i13() { FX_MULT_I(13); } +static void fx_mult_i14() { FX_MULT_I(14); } +static void fx_mult_i15() { FX_MULT_I(15); } + +/* 80-8f(ALT3) - umult #n - 8 bit to 16 bit unsigned multiply, register * immediate */ +#define FX_UMULT_I(imm) \ +uint32 v = USEX8(SREG) * ((uint32)imm); \ +R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_umult_i0() { FX_UMULT_I(0); } +static void fx_umult_i1() { FX_UMULT_I(1); } +static void fx_umult_i2() { FX_UMULT_I(2); } +static void fx_umult_i3() { FX_UMULT_I(3); } +static void fx_umult_i4() { FX_UMULT_I(4); } +static void fx_umult_i5() { FX_UMULT_I(5); } +static void fx_umult_i6() { FX_UMULT_I(6); } +static void fx_umult_i7() { FX_UMULT_I(7); } +static void fx_umult_i8() { FX_UMULT_I(8); } +static void fx_umult_i9() { FX_UMULT_I(9); } +static void fx_umult_i10() { FX_UMULT_I(10); } +static void fx_umult_i11() { FX_UMULT_I(11); } +static void fx_umult_i12() { FX_UMULT_I(12); } +static void fx_umult_i13() { FX_UMULT_I(13); } +static void fx_umult_i14() { FX_UMULT_I(14); } +static void fx_umult_i15() { FX_UMULT_I(15); } + +/* 90 - sbk - store word to last accessed RAM address */ +static void fx_sbk() +{ + RAM(GSU.vLastRamAdr) = (uint8)SREG; + RAM(GSU.vLastRamAdr^1) = (uint8)(SREG>>8); + CLRFLAGS; + R15++; +} + +/* 91-94 - link #n - R11 = R15 + immediate */ +#define FX_LINK_I(lkn) R11 = R15 + lkn; CLRFLAGS; R15++ +static void fx_link_i1() { FX_LINK_I(1); } +static void fx_link_i2() { FX_LINK_I(2); } +static void fx_link_i3() { FX_LINK_I(3); } +static void fx_link_i4() { FX_LINK_I(4); } + +/* 95 - sex - sign extend 8 bit to 16 bit */ +static void fx_sex() +{ + uint32 v = (uint32)SEX8(SREG); + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 96 - asr - aritmetric shift right by one */ +static void fx_asr() +{ + uint32 v; + GSU.vCarry = SREG & 1; + v = (uint32)(SEX16(SREG)>>1); + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 96(ALT1) - div2 - aritmetric shift right by one */ +static void fx_div2() +{ + uint32 v; + int32 s = SEX16(SREG); + GSU.vCarry = s & 1; + if(s == -1) + v = 0; + else + v = (uint32)(s>>1); + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 97 - ror - rotate right by one */ +static void fx_ror() +{ + uint32 v = (USEX16(SREG)>>1) | (GSU.vCarry<<15); + GSU.vCarry = SREG & 1; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + TESTR14; + CLRFLAGS; +} + +/* 98-9d - jmp rn - jump to address of register */ +#define FX_JMP(reg) \ +R15 = GSU.avReg[reg]; \ +CLRFLAGS; +static void fx_jmp_r8() { FX_JMP(8); } +static void fx_jmp_r9() { FX_JMP(9); } +static void fx_jmp_r10() { FX_JMP(10); } +static void fx_jmp_r11() { FX_JMP(11); } +static void fx_jmp_r12() { FX_JMP(12); } +static void fx_jmp_r13() { FX_JMP(13); } + +/* 98-9d(ALT1) - ljmp rn - set program bank to source register and jump to address of register */ +#define FX_LJMP(reg) \ +GSU.vPrgBankReg = GSU.avReg[reg] & 0x7f; \ +GSU.pvPrgBank = GSU.apvRomBank[GSU.vPrgBankReg]; \ +R15 = SREG; \ +GSU.bCacheActive = FALSE; fx_cache(); R15--; +static void fx_ljmp_r8() { FX_LJMP(8); } +static void fx_ljmp_r9() { FX_LJMP(9); } +static void fx_ljmp_r10() { FX_LJMP(10); } +static void fx_ljmp_r11() { FX_LJMP(11); } +static void fx_ljmp_r12() { FX_LJMP(12); } +static void fx_ljmp_r13() { FX_LJMP(13); } + +/* 9e - lob - set upper byte to zero (keep low byte) */ +static void fx_lob() +{ + uint32 v = USEX8(SREG); + R15++; DREG = v; + GSU.vSign = v<<8; + GSU.vZero = v<<8; + TESTR14; + CLRFLAGS; +} + +/* 9f - fmult - 16 bit to 32 bit signed multiplication, upper 16 bits only */ +static void fx_fmult() +{ + uint32 v; + uint32 c = (uint32) (SEX16(SREG) * SEX16(R6)); + v = c >> 16; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + GSU.vCarry = (c >> 15) & 1; + TESTR14; + CLRFLAGS; +} + +/* 9f(ALT1) - lmult - 16 bit to 32 bit signed multiplication */ +static void fx_lmult() +{ + uint32 v; + uint32 c = (uint32) (SEX16(SREG) * SEX16(R6)); + R4 = c; + v = c >> 16; + R15++; DREG = v; + GSU.vSign = v; + GSU.vZero = v; + /* XXX R6 or R4? */ + GSU.vCarry = (R4 >> 15) & 1; /* should it be bit 15 of R4 instead? */ + TESTR14; + CLRFLAGS; +} + +/* a0-af - ibt rn,#pp - immediate byte transfer */ +#define FX_IBT(reg) \ +uint8 v = PIPE; R15++; \ +FETCHPIPE; R15++; \ +GSU.avReg[reg] = SEX8(v); \ +CLRFLAGS; +static void fx_ibt_r0() { FX_IBT(0); } +static void fx_ibt_r1() { FX_IBT(1); } +static void fx_ibt_r2() { FX_IBT(2); } +static void fx_ibt_r3() { FX_IBT(3); } +static void fx_ibt_r4() { FX_IBT(4); } +static void fx_ibt_r5() { FX_IBT(5); } +static void fx_ibt_r6() { FX_IBT(6); } +static void fx_ibt_r7() { FX_IBT(7); } +static void fx_ibt_r8() { FX_IBT(8); } +static void fx_ibt_r9() { FX_IBT(9); } +static void fx_ibt_r10() { FX_IBT(10); } +static void fx_ibt_r11() { FX_IBT(11); } +static void fx_ibt_r12() { FX_IBT(12); } +static void fx_ibt_r13() { FX_IBT(13); } +static void fx_ibt_r14() { FX_IBT(14); READR14; } +static void fx_ibt_r15() { FX_IBT(15); } + +/* a0-af(ALT1) - lms rn,(yy) - load word from RAM (short address) */ +#define FX_LMS(reg) \ +GSU.vLastRamAdr = ((uint32)PIPE) << 1; \ +R15++; FETCHPIPE; R15++; \ +GSU.avReg[reg] = (uint32)RAM(GSU.vLastRamAdr); \ +GSU.avReg[reg] |= ((uint32)RAM(GSU.vLastRamAdr+1))<<8; \ +CLRFLAGS; +static void fx_lms_r0() { FX_LMS(0); } +static void fx_lms_r1() { FX_LMS(1); } +static void fx_lms_r2() { FX_LMS(2); } +static void fx_lms_r3() { FX_LMS(3); } +static void fx_lms_r4() { FX_LMS(4); } +static void fx_lms_r5() { FX_LMS(5); } +static void fx_lms_r6() { FX_LMS(6); } +static void fx_lms_r7() { FX_LMS(7); } +static void fx_lms_r8() { FX_LMS(8); } +static void fx_lms_r9() { FX_LMS(9); } +static void fx_lms_r10() { FX_LMS(10); } +static void fx_lms_r11() { FX_LMS(11); } +static void fx_lms_r12() { FX_LMS(12); } +static void fx_lms_r13() { FX_LMS(13); } +static void fx_lms_r14() { FX_LMS(14); READR14; } +static void fx_lms_r15() { FX_LMS(15); } + +/* a0-af(ALT2) - sms (yy),rn - store word in RAM (short address) */ +/* If rn == r15, is the value of r15 before or after the extra byte is read? */ +#define FX_SMS(reg) \ +uint32 v = GSU.avReg[reg]; \ +GSU.vLastRamAdr = ((uint32)PIPE) << 1; \ +R15++; FETCHPIPE; \ +RAM(GSU.vLastRamAdr) = (uint8)v; \ +RAM(GSU.vLastRamAdr+1) = (uint8)(v>>8); \ +CLRFLAGS; R15++; +static void fx_sms_r0() { FX_SMS(0); } +static void fx_sms_r1() { FX_SMS(1); } +static void fx_sms_r2() { FX_SMS(2); } +static void fx_sms_r3() { FX_SMS(3); } +static void fx_sms_r4() { FX_SMS(4); } +static void fx_sms_r5() { FX_SMS(5); } +static void fx_sms_r6() { FX_SMS(6); } +static void fx_sms_r7() { FX_SMS(7); } +static void fx_sms_r8() { FX_SMS(8); } +static void fx_sms_r9() { FX_SMS(9); } +static void fx_sms_r10() { FX_SMS(10); } +static void fx_sms_r11() { FX_SMS(11); } +static void fx_sms_r12() { FX_SMS(12); } +static void fx_sms_r13() { FX_SMS(13); } +static void fx_sms_r14() { FX_SMS(14); } +static void fx_sms_r15() { FX_SMS(15); } + +/* b0-bf - from rn - set source register */ +/* b0-bf(B) - moves rn - move register to register, and set flags, (if B flag is set) */ +#define FX_FFXROM(reg) \ +if(TF(B)) { uint32 v = GSU.avReg[reg]; R15++; DREG = v; \ +GSU.vOverflow = (v&0x80) << 16; GSU.vSign = v; GSU.vZero = v; TESTR14; CLRFLAGS; } \ +else { GSU.pvSreg = &GSU.avReg[reg]; R15++; } +static void fx_from_r0() { FX_FFXROM(0); } +static void fx_from_r1() { FX_FFXROM(1); } +static void fx_from_r2() { FX_FFXROM(2); } +static void fx_from_r3() { FX_FFXROM(3); } +static void fx_from_r4() { FX_FFXROM(4); } +static void fx_from_r5() { FX_FFXROM(5); } +static void fx_from_r6() { FX_FFXROM(6); } +static void fx_from_r7() { FX_FFXROM(7); } +static void fx_from_r8() { FX_FFXROM(8); } +static void fx_from_r9() { FX_FFXROM(9); } +static void fx_from_r10() { FX_FFXROM(10); } +static void fx_from_r11() { FX_FFXROM(11); } +static void fx_from_r12() { FX_FFXROM(12); } +static void fx_from_r13() { FX_FFXROM(13); } +static void fx_from_r14() { FX_FFXROM(14); } +static void fx_from_r15() { FX_FFXROM(15); } + +/* c0 - hib - move high-byte to low-byte */ +static void fx_hib() +{ + uint32 v = USEX8(SREG>>8); + R15++; DREG = v; + GSU.vSign = v<<8; + GSU.vZero = v<<8; + TESTR14; + CLRFLAGS; +} + +/* c1-cf - or rn */ +#define FX_OR(reg) \ +uint32 v = SREG | GSU.avReg[reg]; R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_or_r1() { FX_OR(1); } +static void fx_or_r2() { FX_OR(2); } +static void fx_or_r3() { FX_OR(3); } +static void fx_or_r4() { FX_OR(4); } +static void fx_or_r5() { FX_OR(5); } +static void fx_or_r6() { FX_OR(6); } +static void fx_or_r7() { FX_OR(7); } +static void fx_or_r8() { FX_OR(8); } +static void fx_or_r9() { FX_OR(9); } +static void fx_or_r10() { FX_OR(10); } +static void fx_or_r11() { FX_OR(11); } +static void fx_or_r12() { FX_OR(12); } +static void fx_or_r13() { FX_OR(13); } +static void fx_or_r14() { FX_OR(14); } +static void fx_or_r15() { FX_OR(15); } + +/* c1-cf(ALT1) - xor rn */ +#define FX_XOR(reg) \ +uint32 v = SREG ^ GSU.avReg[reg]; R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_xor_r1() { FX_XOR(1); } +static void fx_xor_r2() { FX_XOR(2); } +static void fx_xor_r3() { FX_XOR(3); } +static void fx_xor_r4() { FX_XOR(4); } +static void fx_xor_r5() { FX_XOR(5); } +static void fx_xor_r6() { FX_XOR(6); } +static void fx_xor_r7() { FX_XOR(7); } +static void fx_xor_r8() { FX_XOR(8); } +static void fx_xor_r9() { FX_XOR(9); } +static void fx_xor_r10() { FX_XOR(10); } +static void fx_xor_r11() { FX_XOR(11); } +static void fx_xor_r12() { FX_XOR(12); } +static void fx_xor_r13() { FX_XOR(13); } +static void fx_xor_r14() { FX_XOR(14); } +static void fx_xor_r15() { FX_XOR(15); } + +/* c1-cf(ALT2) - or #n */ +#define FX_OR_I(imm) \ +uint32 v = SREG | imm; R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_or_i1() { FX_OR_I(1); } +static void fx_or_i2() { FX_OR_I(2); } +static void fx_or_i3() { FX_OR_I(3); } +static void fx_or_i4() { FX_OR_I(4); } +static void fx_or_i5() { FX_OR_I(5); } +static void fx_or_i6() { FX_OR_I(6); } +static void fx_or_i7() { FX_OR_I(7); } +static void fx_or_i8() { FX_OR_I(8); } +static void fx_or_i9() { FX_OR_I(9); } +static void fx_or_i10() { FX_OR_I(10); } +static void fx_or_i11() { FX_OR_I(11); } +static void fx_or_i12() { FX_OR_I(12); } +static void fx_or_i13() { FX_OR_I(13); } +static void fx_or_i14() { FX_OR_I(14); } +static void fx_or_i15() { FX_OR_I(15); } + +/* c1-cf(ALT3) - xor #n */ +#define FX_XOR_I(imm) \ +uint32 v = SREG ^ imm; R15++; DREG = v; \ +GSU.vSign = v; \ +GSU.vZero = v; \ +TESTR14; \ +CLRFLAGS; +static void fx_xor_i1() { FX_XOR_I(1); } +static void fx_xor_i2() { FX_XOR_I(2); } +static void fx_xor_i3() { FX_XOR_I(3); } +static void fx_xor_i4() { FX_XOR_I(4); } +static void fx_xor_i5() { FX_XOR_I(5); } +static void fx_xor_i6() { FX_XOR_I(6); } +static void fx_xor_i7() { FX_XOR_I(7); } +static void fx_xor_i8() { FX_XOR_I(8); } +static void fx_xor_i9() { FX_XOR_I(9); } +static void fx_xor_i10() { FX_XOR_I(10); } +static void fx_xor_i11() { FX_XOR_I(11); } +static void fx_xor_i12() { FX_XOR_I(12); } +static void fx_xor_i13() { FX_XOR_I(13); } +static void fx_xor_i14() { FX_XOR_I(14); } +static void fx_xor_i15() { FX_XOR_I(15); } + +/* d0-de - inc rn - increase by one */ +#define FX_INC(reg) \ +GSU.avReg[reg] += 1; \ +GSU.vSign = GSU.avReg[reg]; \ +GSU.vZero = GSU.avReg[reg]; \ +CLRFLAGS; R15++; +static void fx_inc_r0() { FX_INC(0); } +static void fx_inc_r1() { FX_INC(1); } +static void fx_inc_r2() { FX_INC(2); } +static void fx_inc_r3() { FX_INC(3); } +static void fx_inc_r4() { FX_INC(4); } +static void fx_inc_r5() { FX_INC(5); } +static void fx_inc_r6() { FX_INC(6); } +static void fx_inc_r7() { FX_INC(7); } +static void fx_inc_r8() { FX_INC(8); } +static void fx_inc_r9() { FX_INC(9); } +static void fx_inc_r10() { FX_INC(10); } +static void fx_inc_r11() { FX_INC(11); } +static void fx_inc_r12() { FX_INC(12); } +static void fx_inc_r13() { FX_INC(13); } +static void fx_inc_r14() { FX_INC(14); READR14; } + +/* df - getc - transfer ROM buffer to color register */ +static void fx_getc() +{ +#ifndef FX_DO_ROMBUFFER + uint8 c; + c = FXROM(R14); +#else + uint8 c = GSU.vRomBuffer; +#endif + if(GSU.vPlotOptionReg & 0x04) + c = (c&0xf0) | (c>>4); + if(GSU.vPlotOptionReg & 0x08) + { + GSU.vColorReg &= 0xf0; + GSU.vColorReg |= c & 0x0f; + } + else + GSU.vColorReg = USEX8(c); + CLRFLAGS; + R15++; +} + +/* df(ALT2) - ramb - set current RAM bank */ +static void fx_ramb() +{ + GSU.vRamBankReg = SREG & (FX_RAM_BANKS-1); + GSU.pvRamBank = GSU.apvRamBank[GSU.vRamBankReg & 0x3]; + CLRFLAGS; + R15++; +} + +/* df(ALT3) - romb - set current ROM bank */ +static void fx_romb() +{ + GSU.vRomBankReg = USEX8(SREG) & 0x7f; + GSU.pvRomBank = GSU.apvRomBank[GSU.vRomBankReg]; + CLRFLAGS; + R15++; +} + +/* e0-ee - dec rn - decrement by one */ +#define FX_DEC(reg) \ +GSU.avReg[reg] -= 1; \ +GSU.vSign = GSU.avReg[reg]; \ +GSU.vZero = GSU.avReg[reg]; \ +CLRFLAGS; R15++; +static void fx_dec_r0() { FX_DEC(0); } +static void fx_dec_r1() { FX_DEC(1); } +static void fx_dec_r2() { FX_DEC(2); } +static void fx_dec_r3() { FX_DEC(3); } +static void fx_dec_r4() { FX_DEC(4); } +static void fx_dec_r5() { FX_DEC(5); } +static void fx_dec_r6() { FX_DEC(6); } +static void fx_dec_r7() { FX_DEC(7); } +static void fx_dec_r8() { FX_DEC(8); } +static void fx_dec_r9() { FX_DEC(9); } +static void fx_dec_r10() { FX_DEC(10); } +static void fx_dec_r11() { FX_DEC(11); } +static void fx_dec_r12() { FX_DEC(12); } +static void fx_dec_r13() { FX_DEC(13); } +static void fx_dec_r14() { FX_DEC(14); READR14; } + +/* ef - getb - get byte from ROM at address R14 */ +static void fx_getb() +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + v = (uint32)FXROM(R14); +#else + v = (uint32)GSU.vRomBuffer; +#endif + R15++; DREG = v; + TESTR14; + CLRFLAGS; +} + +/* ef(ALT1) - getbh - get high-byte from ROM at address R14 */ +static void fx_getbh() +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + uint32 c; + c = (uint32)FXROM(R14); +#else + uint32 c = USEX8(GSU.vRomBuffer); +#endif + v = USEX8(SREG) | (c<<8); + R15++; DREG = v; + TESTR14; + CLRFLAGS; +} + +/* ef(ALT2) - getbl - get low-byte from ROM at address R14 */ +static void fx_getbl() +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + uint32 c; + c = (uint32)FXROM(R14); +#else + uint32 c = USEX8(GSU.vRomBuffer); +#endif + v = (SREG & 0xff00) | c; + R15++; DREG = v; + TESTR14; + CLRFLAGS; +} + +/* ef(ALT3) - getbs - get sign extended byte from ROM at address R14 */ +static void fx_getbs() +{ + uint32 v; +#ifndef FX_DO_ROMBUFFER + int8 c; + c = FXROM(R14); + v = SEX8(c); +#else + v = SEX8(GSU.vRomBuffer); +#endif + R15++; DREG = v; + TESTR14; + CLRFLAGS; +} + +/* f0-ff - iwt rn,#xx - immediate word transfer to register */ +#define FX_IWT(reg) \ +uint32 v = PIPE; R15++; FETCHPIPE; R15++; \ +v |= USEX8(PIPE) << 8; FETCHPIPE; R15++; \ +GSU.avReg[reg] = v; \ +CLRFLAGS; +static void fx_iwt_r0() { FX_IWT(0); } +static void fx_iwt_r1() { FX_IWT(1); } +static void fx_iwt_r2() { FX_IWT(2); } +static void fx_iwt_r3() { FX_IWT(3); } +static void fx_iwt_r4() { FX_IWT(4); } +static void fx_iwt_r5() { FX_IWT(5); } +static void fx_iwt_r6() { FX_IWT(6); } +static void fx_iwt_r7() { FX_IWT(7); } +static void fx_iwt_r8() { FX_IWT(8); } +static void fx_iwt_r9() { FX_IWT(9); } +static void fx_iwt_r10() { FX_IWT(10); } +static void fx_iwt_r11() { FX_IWT(11); } +static void fx_iwt_r12() { FX_IWT(12); } +static void fx_iwt_r13() { FX_IWT(13); } +static void fx_iwt_r14() { FX_IWT(14); READR14; } +static void fx_iwt_r15() { FX_IWT(15); } + +/* f0-ff(ALT1) - lm rn,(xx) - load word from RAM */ +#define FX_LM(reg) \ +GSU.vLastRamAdr = PIPE; R15++; FETCHPIPE; R15++; \ +GSU.vLastRamAdr |= USEX8(PIPE) << 8; FETCHPIPE; R15++; \ +GSU.avReg[reg] = RAM(GSU.vLastRamAdr); \ +GSU.avReg[reg] |= USEX8(RAM(GSU.vLastRamAdr^1)) << 8; \ +CLRFLAGS; +static void fx_lm_r0() { FX_LM(0); } +static void fx_lm_r1() { FX_LM(1); } +static void fx_lm_r2() { FX_LM(2); } +static void fx_lm_r3() { FX_LM(3); } +static void fx_lm_r4() { FX_LM(4); } +static void fx_lm_r5() { FX_LM(5); } +static void fx_lm_r6() { FX_LM(6); } +static void fx_lm_r7() { FX_LM(7); } +static void fx_lm_r8() { FX_LM(8); } +static void fx_lm_r9() { FX_LM(9); } +static void fx_lm_r10() { FX_LM(10); } +static void fx_lm_r11() { FX_LM(11); } +static void fx_lm_r12() { FX_LM(12); } +static void fx_lm_r13() { FX_LM(13); } +static void fx_lm_r14() { FX_LM(14); READR14; } +static void fx_lm_r15() { FX_LM(15); } + +/* f0-ff(ALT2) - sm (xx),rn - store word in RAM */ +/* If rn == r15, is the value of r15 before or after the extra bytes are read? */ +#define FX_SM(reg) \ +uint32 v = GSU.avReg[reg]; \ +GSU.vLastRamAdr = PIPE; R15++; FETCHPIPE; R15++; \ +GSU.vLastRamAdr |= USEX8(PIPE) << 8; FETCHPIPE; \ +RAM(GSU.vLastRamAdr) = (uint8)v; \ +RAM(GSU.vLastRamAdr^1) = (uint8)(v>>8); \ +CLRFLAGS; R15++; +static void fx_sm_r0() { FX_SM(0); } +static void fx_sm_r1() { FX_SM(1); } +static void fx_sm_r2() { FX_SM(2); } +static void fx_sm_r3() { FX_SM(3); } +static void fx_sm_r4() { FX_SM(4); } +static void fx_sm_r5() { FX_SM(5); } +static void fx_sm_r6() { FX_SM(6); } +static void fx_sm_r7() { FX_SM(7); } +static void fx_sm_r8() { FX_SM(8); } +static void fx_sm_r9() { FX_SM(9); } +static void fx_sm_r10() { FX_SM(10); } +static void fx_sm_r11() { FX_SM(11); } +static void fx_sm_r12() { FX_SM(12); } +static void fx_sm_r13() { FX_SM(13); } +static void fx_sm_r14() { FX_SM(14); } +static void fx_sm_r15() { FX_SM(15); } + +/*** GSU executions functions ***/ + +static uint32 fx_run(uint32 nInstructions) +{ + GSU.vCounter = nInstructions; + READR14; + while( TF(G) && (GSU.vCounter-- > 0) ) + FX_STEP; + /* +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15-1) | (USEX8(GSU.vPrgBankReg)<<16); +#endif +*/ + return (nInstructions - GSU.vInstCount); +} + +static uint32 fx_run_to_breakpoint(uint32 nInstructions) +{ + uint32 vCounter = 0; + while(TF(G) && vCounter < nInstructions) + { + vCounter++; + FX_STEP; + if(USEX16(R15) == GSU.vBreakPoint) + { + GSU.vErrorCode = FX_BREAKPOINT; + break; + } + } + /* +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15-1) | (USEX8(GSU.vPrgBankReg)<<16); +#endif +*/ + return vCounter; +} + +static uint32 fx_step_over(uint32 nInstructions) +{ + uint32 vCounter = 0; + while(TF(G) && vCounter < nInstructions) + { + vCounter++; + FX_STEP; + if(USEX16(R15) == GSU.vBreakPoint) + { + GSU.vErrorCode = FX_BREAKPOINT; + break; + } + if(USEX16(R15) == GSU.vStepPoint) + break; + } + /* +#ifndef FX_ADDRESS_CHECK + GSU.vPipeAdr = USEX16(R15-1) | (USEX8(GSU.vPrgBankReg)<<16); +#endif +*/ + return vCounter; +} + +#ifdef FX_FUNCTION_TABLE +uint32 (*FX_FUNCTION_TABLE[])(uint32) = +#else +uint32 (*fx_apfFunctionTable[])(uint32) = +#endif +{ + &fx_run, + &fx_run_to_breakpoint, + &fx_step_over, +}; + +/*** Special table for the different plot configurations ***/ + +#ifdef FX_PLOT_TABLE +void (*FX_PLOT_TABLE[])() = +#else +void (*fx_apfPlotTable[])() = +#endif +{ + &fx_plot_2bit, &fx_plot_4bit, &fx_plot_4bit, &fx_plot_8bit, &fx_plot_obj, + &fx_rpix_2bit, &fx_rpix_4bit, &fx_rpix_4bit, &fx_rpix_8bit, &fx_rpix_obj, +}; + +/*** Opcode table ***/ + +#ifdef FX_OPCODE_TABLE +void (*FX_OPCODE_TABLE[])() = +#else +void (*fx_apfOpcodeTable[])() = +#endif +{ + /* + * ALT0 Table + */ + /* 00 - 0f */ + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + /* 10 - 1f */ + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + /* 20 - 2f */ + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + /* 30 - 3f */ + &fx_stw_r0, &fx_stw_r1, &fx_stw_r2, &fx_stw_r3, &fx_stw_r4, &fx_stw_r5, &fx_stw_r6, &fx_stw_r7, + &fx_stw_r8, &fx_stw_r9, &fx_stw_r10, &fx_stw_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + /* 40 - 4f */ + &fx_ldw_r0, &fx_ldw_r1, &fx_ldw_r2, &fx_ldw_r3, &fx_ldw_r4, &fx_ldw_r5, &fx_ldw_r6, &fx_ldw_r7, + &fx_ldw_r8, &fx_ldw_r9, &fx_ldw_r10, &fx_ldw_r11, &fx_plot_2bit,&fx_swap, &fx_color, &fx_not, + /* 50 - 5f */ + &fx_add_r0, &fx_add_r1, &fx_add_r2, &fx_add_r3, &fx_add_r4, &fx_add_r5, &fx_add_r6, &fx_add_r7, + &fx_add_r8, &fx_add_r9, &fx_add_r10, &fx_add_r11, &fx_add_r12, &fx_add_r13, &fx_add_r14, &fx_add_r15, + /* 60 - 6f */ + &fx_sub_r0, &fx_sub_r1, &fx_sub_r2, &fx_sub_r3, &fx_sub_r4, &fx_sub_r5, &fx_sub_r6, &fx_sub_r7, + &fx_sub_r8, &fx_sub_r9, &fx_sub_r10, &fx_sub_r11, &fx_sub_r12, &fx_sub_r13, &fx_sub_r14, &fx_sub_r15, + /* 70 - 7f */ + &fx_merge, &fx_and_r1, &fx_and_r2, &fx_and_r3, &fx_and_r4, &fx_and_r5, &fx_and_r6, &fx_and_r7, + &fx_and_r8, &fx_and_r9, &fx_and_r10, &fx_and_r11, &fx_and_r12, &fx_and_r13, &fx_and_r14, &fx_and_r15, + /* 80 - 8f */ + &fx_mult_r0, &fx_mult_r1, &fx_mult_r2, &fx_mult_r3, &fx_mult_r4, &fx_mult_r5, &fx_mult_r6, &fx_mult_r7, + &fx_mult_r8, &fx_mult_r9, &fx_mult_r10, &fx_mult_r11, &fx_mult_r12, &fx_mult_r13, &fx_mult_r14, &fx_mult_r15, + /* 90 - 9f */ + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_asr, &fx_ror, + &fx_jmp_r8, &fx_jmp_r9, &fx_jmp_r10, &fx_jmp_r11, &fx_jmp_r12, &fx_jmp_r13, &fx_lob, &fx_fmult, + /* a0 - af */ + &fx_ibt_r0, &fx_ibt_r1, &fx_ibt_r2, &fx_ibt_r3, &fx_ibt_r4, &fx_ibt_r5, &fx_ibt_r6, &fx_ibt_r7, + &fx_ibt_r8, &fx_ibt_r9, &fx_ibt_r10, &fx_ibt_r11, &fx_ibt_r12, &fx_ibt_r13, &fx_ibt_r14, &fx_ibt_r15, + /* b0 - bf */ + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + /* c0 - cf */ + &fx_hib, &fx_or_r1, &fx_or_r2, &fx_or_r3, &fx_or_r4, &fx_or_r5, &fx_or_r6, &fx_or_r7, + &fx_or_r8, &fx_or_r9, &fx_or_r10, &fx_or_r11, &fx_or_r12, &fx_or_r13, &fx_or_r14, &fx_or_r15, + /* d0 - df */ + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_getc, + /* e0 - ef */ + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getb, + /* f0 - ff */ + &fx_iwt_r0, &fx_iwt_r1, &fx_iwt_r2, &fx_iwt_r3, &fx_iwt_r4, &fx_iwt_r5, &fx_iwt_r6, &fx_iwt_r7, + &fx_iwt_r8, &fx_iwt_r9, &fx_iwt_r10, &fx_iwt_r11, &fx_iwt_r12, &fx_iwt_r13, &fx_iwt_r14, &fx_iwt_r15, + + /* + * ALT1 Table + */ + + /* 00 - 0f */ + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + /* 10 - 1f */ + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + /* 20 - 2f */ + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + /* 30 - 3f */ + &fx_stb_r0, &fx_stb_r1, &fx_stb_r2, &fx_stb_r3, &fx_stb_r4, &fx_stb_r5, &fx_stb_r6, &fx_stb_r7, + &fx_stb_r8, &fx_stb_r9, &fx_stb_r10, &fx_stb_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + /* 40 - 4f */ + &fx_ldb_r0, &fx_ldb_r1, &fx_ldb_r2, &fx_ldb_r3, &fx_ldb_r4, &fx_ldb_r5, &fx_ldb_r6, &fx_ldb_r7, + &fx_ldb_r8, &fx_ldb_r9, &fx_ldb_r10, &fx_ldb_r11, &fx_rpix_2bit,&fx_swap, &fx_cmode, &fx_not, + /* 50 - 5f */ + &fx_adc_r0, &fx_adc_r1, &fx_adc_r2, &fx_adc_r3, &fx_adc_r4, &fx_adc_r5, &fx_adc_r6, &fx_adc_r7, + &fx_adc_r8, &fx_adc_r9, &fx_adc_r10, &fx_adc_r11, &fx_adc_r12, &fx_adc_r13, &fx_adc_r14, &fx_adc_r15, + /* 60 - 6f */ + &fx_sbc_r0, &fx_sbc_r1, &fx_sbc_r2, &fx_sbc_r3, &fx_sbc_r4, &fx_sbc_r5, &fx_sbc_r6, &fx_sbc_r7, + &fx_sbc_r8, &fx_sbc_r9, &fx_sbc_r10, &fx_sbc_r11, &fx_sbc_r12, &fx_sbc_r13, &fx_sbc_r14, &fx_sbc_r15, + /* 70 - 7f */ + &fx_merge, &fx_bic_r1, &fx_bic_r2, &fx_bic_r3, &fx_bic_r4, &fx_bic_r5, &fx_bic_r6, &fx_bic_r7, + &fx_bic_r8, &fx_bic_r9, &fx_bic_r10, &fx_bic_r11, &fx_bic_r12, &fx_bic_r13, &fx_bic_r14, &fx_bic_r15, + /* 80 - 8f */ + &fx_umult_r0,&fx_umult_r1,&fx_umult_r2, &fx_umult_r3, &fx_umult_r4, &fx_umult_r5, &fx_umult_r6, &fx_umult_r7, + &fx_umult_r8,&fx_umult_r9,&fx_umult_r10,&fx_umult_r11,&fx_umult_r12,&fx_umult_r13,&fx_umult_r14,&fx_umult_r15, + /* 90 - 9f */ + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_div2, &fx_ror, + &fx_ljmp_r8, &fx_ljmp_r9, &fx_ljmp_r10, &fx_ljmp_r11, &fx_ljmp_r12, &fx_ljmp_r13, &fx_lob, &fx_lmult, + /* a0 - af */ + &fx_lms_r0, &fx_lms_r1, &fx_lms_r2, &fx_lms_r3, &fx_lms_r4, &fx_lms_r5, &fx_lms_r6, &fx_lms_r7, + &fx_lms_r8, &fx_lms_r9, &fx_lms_r10, &fx_lms_r11, &fx_lms_r12, &fx_lms_r13, &fx_lms_r14, &fx_lms_r15, + /* b0 - bf */ + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + /* c0 - cf */ + &fx_hib, &fx_xor_r1, &fx_xor_r2, &fx_xor_r3, &fx_xor_r4, &fx_xor_r5, &fx_xor_r6, &fx_xor_r7, + &fx_xor_r8, &fx_xor_r9, &fx_xor_r10, &fx_xor_r11, &fx_xor_r12, &fx_xor_r13, &fx_xor_r14, &fx_xor_r15, + /* d0 - df */ + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_getc, + /* e0 - ef */ + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbh, + /* f0 - ff */ + &fx_lm_r0, &fx_lm_r1, &fx_lm_r2, &fx_lm_r3, &fx_lm_r4, &fx_lm_r5, &fx_lm_r6, &fx_lm_r7, + &fx_lm_r8, &fx_lm_r9, &fx_lm_r10, &fx_lm_r11, &fx_lm_r12, &fx_lm_r13, &fx_lm_r14, &fx_lm_r15, + + /* + * ALT2 Table + */ + + /* 00 - 0f */ + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + /* 10 - 1f */ + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + /* 20 - 2f */ + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + /* 30 - 3f */ + &fx_stw_r0, &fx_stw_r1, &fx_stw_r2, &fx_stw_r3, &fx_stw_r4, &fx_stw_r5, &fx_stw_r6, &fx_stw_r7, + &fx_stw_r8, &fx_stw_r9, &fx_stw_r10, &fx_stw_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + /* 40 - 4f */ + &fx_ldw_r0, &fx_ldw_r1, &fx_ldw_r2, &fx_ldw_r3, &fx_ldw_r4, &fx_ldw_r5, &fx_ldw_r6, &fx_ldw_r7, + &fx_ldw_r8, &fx_ldw_r9, &fx_ldw_r10, &fx_ldw_r11, &fx_plot_2bit,&fx_swap, &fx_color, &fx_not, + /* 50 - 5f */ + &fx_add_i0, &fx_add_i1, &fx_add_i2, &fx_add_i3, &fx_add_i4, &fx_add_i5, &fx_add_i6, &fx_add_i7, + &fx_add_i8, &fx_add_i9, &fx_add_i10, &fx_add_i11, &fx_add_i12, &fx_add_i13, &fx_add_i14, &fx_add_i15, + /* 60 - 6f */ + &fx_sub_i0, &fx_sub_i1, &fx_sub_i2, &fx_sub_i3, &fx_sub_i4, &fx_sub_i5, &fx_sub_i6, &fx_sub_i7, + &fx_sub_i8, &fx_sub_i9, &fx_sub_i10, &fx_sub_i11, &fx_sub_i12, &fx_sub_i13, &fx_sub_i14, &fx_sub_i15, + /* 70 - 7f */ + &fx_merge, &fx_and_i1, &fx_and_i2, &fx_and_i3, &fx_and_i4, &fx_and_i5, &fx_and_i6, &fx_and_i7, + &fx_and_i8, &fx_and_i9, &fx_and_i10, &fx_and_i11, &fx_and_i12, &fx_and_i13, &fx_and_i14, &fx_and_i15, + /* 80 - 8f */ + &fx_mult_i0, &fx_mult_i1, &fx_mult_i2, &fx_mult_i3, &fx_mult_i4, &fx_mult_i5, &fx_mult_i6, &fx_mult_i7, + &fx_mult_i8, &fx_mult_i9, &fx_mult_i10, &fx_mult_i11, &fx_mult_i12, &fx_mult_i13, &fx_mult_i14, &fx_mult_i15, + /* 90 - 9f */ + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_asr, &fx_ror, + &fx_jmp_r8, &fx_jmp_r9, &fx_jmp_r10, &fx_jmp_r11, &fx_jmp_r12, &fx_jmp_r13, &fx_lob, &fx_fmult, + /* a0 - af */ + &fx_sms_r0, &fx_sms_r1, &fx_sms_r2, &fx_sms_r3, &fx_sms_r4, &fx_sms_r5, &fx_sms_r6, &fx_sms_r7, + &fx_sms_r8, &fx_sms_r9, &fx_sms_r10, &fx_sms_r11, &fx_sms_r12, &fx_sms_r13, &fx_sms_r14, &fx_sms_r15, + /* b0 - bf */ + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + /* c0 - cf */ + &fx_hib, &fx_or_i1, &fx_or_i2, &fx_or_i3, &fx_or_i4, &fx_or_i5, &fx_or_i6, &fx_or_i7, + &fx_or_i8, &fx_or_i9, &fx_or_i10, &fx_or_i11, &fx_or_i12, &fx_or_i13, &fx_or_i14, &fx_or_i15, + /* d0 - df */ + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_ramb, + /* e0 - ef */ + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbl, + /* f0 - ff */ + &fx_sm_r0, &fx_sm_r1, &fx_sm_r2, &fx_sm_r3, &fx_sm_r4, &fx_sm_r5, &fx_sm_r6, &fx_sm_r7, + &fx_sm_r8, &fx_sm_r9, &fx_sm_r10, &fx_sm_r11, &fx_sm_r12, &fx_sm_r13, &fx_sm_r14, &fx_sm_r15, + + /* + * ALT3 Table + */ + + /* 00 - 0f */ + &fx_stop, &fx_nop, &fx_cache, &fx_lsr, &fx_rol, &fx_bra, &fx_bge, &fx_blt, + &fx_bne, &fx_beq, &fx_bpl, &fx_bmi, &fx_bcc, &fx_bcs, &fx_bvc, &fx_bvs, + /* 10 - 1f */ + &fx_to_r0, &fx_to_r1, &fx_to_r2, &fx_to_r3, &fx_to_r4, &fx_to_r5, &fx_to_r6, &fx_to_r7, + &fx_to_r8, &fx_to_r9, &fx_to_r10, &fx_to_r11, &fx_to_r12, &fx_to_r13, &fx_to_r14, &fx_to_r15, + /* 20 - 2f */ + &fx_with_r0, &fx_with_r1, &fx_with_r2, &fx_with_r3, &fx_with_r4, &fx_with_r5, &fx_with_r6, &fx_with_r7, + &fx_with_r8, &fx_with_r9, &fx_with_r10, &fx_with_r11, &fx_with_r12, &fx_with_r13, &fx_with_r14, &fx_with_r15, + /* 30 - 3f */ + &fx_stb_r0, &fx_stb_r1, &fx_stb_r2, &fx_stb_r3, &fx_stb_r4, &fx_stb_r5, &fx_stb_r6, &fx_stb_r7, + &fx_stb_r8, &fx_stb_r9, &fx_stb_r10, &fx_stb_r11, &fx_loop, &fx_alt1, &fx_alt2, &fx_alt3, + /* 40 - 4f */ + &fx_ldb_r0, &fx_ldb_r1, &fx_ldb_r2, &fx_ldb_r3, &fx_ldb_r4, &fx_ldb_r5, &fx_ldb_r6, &fx_ldb_r7, + &fx_ldb_r8, &fx_ldb_r9, &fx_ldb_r10, &fx_ldb_r11, &fx_rpix_2bit,&fx_swap, &fx_cmode, &fx_not, + /* 50 - 5f */ + &fx_adc_i0, &fx_adc_i1, &fx_adc_i2, &fx_adc_i3, &fx_adc_i4, &fx_adc_i5, &fx_adc_i6, &fx_adc_i7, + &fx_adc_i8, &fx_adc_i9, &fx_adc_i10, &fx_adc_i11, &fx_adc_i12, &fx_adc_i13, &fx_adc_i14, &fx_adc_i15, + /* 60 - 6f */ + &fx_cmp_r0, &fx_cmp_r1, &fx_cmp_r2, &fx_cmp_r3, &fx_cmp_r4, &fx_cmp_r5, &fx_cmp_r6, &fx_cmp_r7, + &fx_cmp_r8, &fx_cmp_r9, &fx_cmp_r10, &fx_cmp_r11, &fx_cmp_r12, &fx_cmp_r13, &fx_cmp_r14, &fx_cmp_r15, + /* 70 - 7f */ + &fx_merge, &fx_bic_i1, &fx_bic_i2, &fx_bic_i3, &fx_bic_i4, &fx_bic_i5, &fx_bic_i6, &fx_bic_i7, + &fx_bic_i8, &fx_bic_i9, &fx_bic_i10, &fx_bic_i11, &fx_bic_i12, &fx_bic_i13, &fx_bic_i14, &fx_bic_i15, + /* 80 - 8f */ + &fx_umult_i0,&fx_umult_i1,&fx_umult_i2, &fx_umult_i3, &fx_umult_i4, &fx_umult_i5, &fx_umult_i6, &fx_umult_i7, + &fx_umult_i8,&fx_umult_i9,&fx_umult_i10,&fx_umult_i11,&fx_umult_i12,&fx_umult_i13,&fx_umult_i14,&fx_umult_i15, + /* 90 - 9f */ + &fx_sbk, &fx_link_i1, &fx_link_i2, &fx_link_i3, &fx_link_i4, &fx_sex, &fx_div2, &fx_ror, + &fx_ljmp_r8, &fx_ljmp_r9, &fx_ljmp_r10, &fx_ljmp_r11, &fx_ljmp_r12, &fx_ljmp_r13, &fx_lob, &fx_lmult, + /* a0 - af */ + &fx_lms_r0, &fx_lms_r1, &fx_lms_r2, &fx_lms_r3, &fx_lms_r4, &fx_lms_r5, &fx_lms_r6, &fx_lms_r7, + &fx_lms_r8, &fx_lms_r9, &fx_lms_r10, &fx_lms_r11, &fx_lms_r12, &fx_lms_r13, &fx_lms_r14, &fx_lms_r15, + /* b0 - bf */ + &fx_from_r0, &fx_from_r1, &fx_from_r2, &fx_from_r3, &fx_from_r4, &fx_from_r5, &fx_from_r6, &fx_from_r7, + &fx_from_r8, &fx_from_r9, &fx_from_r10, &fx_from_r11, &fx_from_r12, &fx_from_r13, &fx_from_r14, &fx_from_r15, + /* c0 - cf */ + &fx_hib, &fx_xor_i1, &fx_xor_i2, &fx_xor_i3, &fx_xor_i4, &fx_xor_i5, &fx_xor_i6, &fx_xor_i7, + &fx_xor_i8, &fx_xor_i9, &fx_xor_i10, &fx_xor_i11, &fx_xor_i12, &fx_xor_i13, &fx_xor_i14, &fx_xor_i15, + /* d0 - df */ + &fx_inc_r0, &fx_inc_r1, &fx_inc_r2, &fx_inc_r3, &fx_inc_r4, &fx_inc_r5, &fx_inc_r6, &fx_inc_r7, + &fx_inc_r8, &fx_inc_r9, &fx_inc_r10, &fx_inc_r11, &fx_inc_r12, &fx_inc_r13, &fx_inc_r14, &fx_romb, + /* e0 - ef */ + &fx_dec_r0, &fx_dec_r1, &fx_dec_r2, &fx_dec_r3, &fx_dec_r4, &fx_dec_r5, &fx_dec_r6, &fx_dec_r7, + &fx_dec_r8, &fx_dec_r9, &fx_dec_r10, &fx_dec_r11, &fx_dec_r12, &fx_dec_r13, &fx_dec_r14, &fx_getbs, + /* f0 - ff */ + &fx_lm_r0, &fx_lm_r1, &fx_lm_r2, &fx_lm_r3, &fx_lm_r4, &fx_lm_r5, &fx_lm_r6, &fx_lm_r7, + &fx_lm_r8, &fx_lm_r9, &fx_lm_r10, &fx_lm_r11, &fx_lm_r12, &fx_lm_r13, &fx_lm_r14, &fx_lm_r15, +}; + diff --git a/src/getppu_table.h b/src/getppu_table.h new file mode 100644 index 0000000..6a6c10c --- /dev/null +++ b/src/getppu_table.h @@ -0,0 +1,8195 @@ +S9xGetPPU_func_t S9xGetPPU_func[0x10000]= { +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus,S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, +S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, +S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, +S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_ppu_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_16x8_mul, S9xGetPPU_16x8_mul, S9xGetPPU_16x8_mul, S9xGetPPU_latch_counters, +S9xGetPPU_read_oam, S9xGetPPU_read_low_vram, S9xGetPPU_read_high_vram, S9xGetPPU_read_pal_data, S9xGetPPU_h_counter, S9xGetPPU_v_counter, S9xGetPPU_redraw, S9xGetPPU_vclock, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, S9xGetPPU_spctool, +S9xGetPPU_read_wram, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, S9xGetPPU_openbus, +S9xGetPPU_openbus, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_model_5c77_20, S9xGetPPU_model_5c77_0, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_mode_srtc, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, S9xGetPPU_superfx, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, S9xGetPPU_sa1, +}; + diff --git a/src/gfx.cpp b/src/gfx.cpp new file mode 100644 index 0000000..ba1cbd5 --- /dev/null +++ b/src/gfx.cpp @@ -0,0 +1,4990 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" + +#include "memmap.h" +#include "ppu.h" +#include "cpuexec.h" +#include "display.h" +#include "gfx.h" +#include "apu.h" +#include "cheats.h" +#include "screenshot.h" + +#include "snes4all.h" +#include "videogl.h" + +#define M7 19 +#define M8 19 + +#ifdef USE_BG_FORCED +#define PPU_BG_Forced PPU.BG_Forced +#else +#define PPU_BG_Forced 0 +#endif + +//#define SHOW_TODO + +void output_png(); +void ComputeClipWindows (); +static void S9xDisplayFrameRate (); +static void S9xDisplayString (const char *string); + +extern uint8 BitShifts[8][4]; +extern uint8 TileShifts[8][4]; +extern uint8 PaletteShifts[8][4]; +extern uint8 PaletteMasks[8][4]; +extern uint8 Depths[8][4]; +extern uint8 BGSizes [2]; + +extern NormalTileRenderer DrawTilePtr; +extern ClippedTileRenderer DrawClippedTilePtr; +extern NormalTileRenderer DrawHiResTilePtr; +extern ClippedTileRenderer DrawHiResClippedTilePtr; +#ifdef USE_GL +#define CallDrawHiResTilePtr (*DrawHiResTilePtr) +#define CallDrawHiResClippedTilePtr (*DrawClippedTile16) +#else +#define CallDrawHiResTilePtr DrawTile16 +#define CallDrawHiResClippedTilePtr DrawClippedTile16 +#endif +extern LargePixelRenderer DrawLargePixelPtr; + +extern struct SBG BG; + +extern struct SLineData LineData[240]; +extern struct SLineMatrixData LineMatrixData [240]; + +extern uint8 Mode7Depths [2]; + +#define CLIP_10_BIT_SIGNED(a) \ + ((a) & ((1 << 10) - 1)) + (((((a) & (1 << 13)) ^ (1 << 13)) - (1 << 13)) >> 3) + +#define ON_MAIN(N) \ +(GFX.r212c & (1 << (N)) && \ + !(PPU_BG_Forced & (1 << (N)))) + +#define SUB_OR_ADD(N) \ +(GFX.r2131 & (1 << (N))) + +#define ON_SUB(N) \ +((GFX.r2130 & 0x30) != 0x30 && \ + (GFX.r2130 & 2) && \ + (GFX.r212d & (1 << N)) && \ + !(PPU_BG_Forced & (1 << (N)))) + +#define ANYTHING_ON_SUB \ +((GFX.r2130 & 0x30) != 0x30 && \ + (GFX.r2130 & 2) && \ + (GFX.r212d & 0x1f)) + +#define ADD_OR_SUB_ON_ANYTHING \ +(GFX.r2131 & 0x3f) + +#define GFX_PIXSIZE 1 + +#define BLACK BUILD_PIXEL(0,0,0) + +void DrawTile (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTilex2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTilex2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTilex2x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTilex2x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawLargePixel (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTile16x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTile16x2x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16x2x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawLargePixel16 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Add (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Add (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Add1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Add1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Sub (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Sub (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Sub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16FixedSub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16FixedSub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Add (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Add1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Sub (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Sub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawTilehw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTilehw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTilex2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTilex2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTilex2x2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTilex2x2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawLargePixelhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawTile16hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTile16x2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16x2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawTile16x2x2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); +void DrawClippedTile16x2x2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +void DrawLargePixel16hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Addhw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Addhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Add1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Add1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16FixedAdd1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16FixedAdd1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Subhw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Subhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16Sub1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16Sub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawTile16FixedSub1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount); + +void DrawClippedTile16FixedSub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Addhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Add1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Subhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void DrawLargePixel16Sub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +void S9xGraphicsInitTiles () { +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16hw; + DrawClippedTilePtr = DrawClippedTile16hw; + DrawLargePixelPtr = DrawLargePixel16hw; + DrawHiResTilePtr= DrawTile16hw; + DrawHiResClippedTilePtr = DrawClippedTile16hw; + } else +#endif + { + DrawTilePtr = DrawTile16; + DrawClippedTilePtr = DrawClippedTile16; + DrawLargePixelPtr = DrawLargePixel16; + DrawHiResTilePtr= DrawTile16; + DrawHiResClippedTilePtr = DrawClippedTile16; + } + S9xFixColourBrightness (); +} + +bool8 S9xGraphicsInit () +{ + register uint32 PixelOdd = 1; + register uint32 PixelEven = 2; + +#ifdef GFX_MULTI_FORMAT + if (GFX.BuildPixel == NULL) + S9xSetRenderPixelFormat (RGB565); +#endif + + for (uint8 bitshift = 0; bitshift < 4; bitshift++) + { + for (register int i = 0; i < 16; i++) + { + register uint32 h = 0; + register uint32 l = 0; + +#if defined(LSB_FIRST) + if (i & 8) + h |= PixelOdd; + if (i & 4) + h |= PixelOdd << 8; + if (i & 2) + h |= PixelOdd << 16; + if (i & 1) + h |= PixelOdd << 24; + if (i & 8) + l |= PixelOdd; + if (i & 4) + l |= PixelOdd << 8; + if (i & 2) + l |= PixelOdd << 16; + if (i & 1) + l |= PixelOdd << 24; +#else + if (i & 8) + h |= (PixelOdd << 24); + if (i & 4) + h |= (PixelOdd << 16); + if (i & 2) + h |= (PixelOdd << 8); + if (i & 1) + h |= PixelOdd; + if (i & 8) + l |= (PixelOdd << 24); + if (i & 4) + l |= (PixelOdd << 16); + if (i & 2) + l |= (PixelOdd << 8); + if (i & 1) + l |= PixelOdd; +#endif + + odd_high[bitshift][i] = h; + odd_low[bitshift][i] = l; + h = l = 0; + +#if defined(LSB_FIRST) + if (i & 8) + h |= PixelEven; + if (i & 4) + h |= PixelEven << 8; + if (i & 2) + h |= PixelEven << 16; + if (i & 1) + h |= PixelEven << 24; + if (i & 8) + l |= PixelEven; + if (i & 4) + l |= PixelEven << 8; + if (i & 2) + l |= PixelEven << 16; + if (i & 1) + l |= PixelEven << 24; +#else + if (i & 8) + h |= (PixelEven << 24); + if (i & 4) + h |= (PixelEven << 16); + if (i & 2) + h |= (PixelEven << 8); + if (i & 1) + h |= PixelEven; + if (i & 8) + l |= (PixelEven << 24); + if (i & 4) + l |= (PixelEven << 16); + if (i & 2) + l |= (PixelEven << 8); + if (i & 1) + l |= PixelEven; +#endif + + even_high[bitshift][i] = h; + even_low[bitshift][i] = l; + } + PixelEven <<= 2; + PixelOdd <<= 2; + } + + GFX.Delta = (GFX.SubScreen - GFX.Screen) >> 1; + GFX.DepthDelta = GFX.SubZBuffer - GFX.ZBuffer; + +#ifdef USE_GL + GFX.InfoStringTimeout = 0; + GFX.InfoString = NULL; +#endif + +#ifdef USE_BG_FORCED + PPU_BG_Forced = 0; +#endif + IPPU.OBJChanged = TRUE; + +#ifdef DIRECT_COLOR_MAP + IPPU.DirectColourMapsNeedRebuild = TRUE; +#endif + GFX.PixSize = 1; + + S9xGraphicsInitTiles(); + + { + if (!(GFX.X2 = (uint16 *) malloc (sizeof (uint16) * 0x10000))) + return (FALSE); + + if (!(GFX.ZERO_OR_X2 = (uint16 *) malloc (sizeof (uint16) * 0x10000)) || + !(GFX.ZERO = (uint16 *) malloc (sizeof (uint16) * 0x10000))) + { + if (GFX.ZERO_OR_X2) + { + free ((char *) GFX.ZERO_OR_X2); + GFX.ZERO_OR_X2 = NULL; + } + if (GFX.X2) + { + free ((char *) GFX.X2); + GFX.X2 = NULL; + } + return (FALSE); + } + uint32 r, g, b; + + // Build a lookup table that multiplies a packed RGB value by 2 with + // saturation. + for (r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r << 1; + if (r2 > MAX_RED) + r2 = MAX_RED; + for (g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g << 1; + if (g2 > MAX_GREEN) + g2 = MAX_GREEN; + for (b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b << 1; + if (b2 > MAX_BLUE) + b2 = MAX_BLUE; + GFX.X2 [BUILD_PIXEL2 (r, g, b)] = BUILD_PIXEL2 (r2, g2, b2); + GFX.X2 [BUILD_PIXEL2 (r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2 (r2, g2, b2); + } + } + } + ZeroMemory (GFX.ZERO, 0x10000 * sizeof (uint16)); + ZeroMemory (GFX.ZERO_OR_X2, 0x10000 * sizeof (uint16)); + // Build a lookup table that if the top bit of the color value is zero + // then the value is zero, otherwise multiply the value by 2. Used by + // the color subtraction code. + +#if defined(OLD_COLOUR_BLENDING) + for (r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r; + if (!(r2 & 0x10)) + r2 = 0; + else + r2 = (r2 << 1) & MAX_RED; + + for (g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g; + if (!(g2 & GREEN_HI_BIT)) + g2 = 0; + else + g2 = (g2 << 1) & MAX_GREEN; + + for (b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b; + if (!(b2 & 0x10)) + b2 = 0; + else + b2 = (b2 << 1) & MAX_BLUE; + + GFX.ZERO_OR_X2 [BUILD_PIXEL2 (r, g, b)] = BUILD_PIXEL2 (r2, g2, b2); + GFX.ZERO_OR_X2 [BUILD_PIXEL2 (r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2 (r2, g2, b2); + } + } + } +#else + for (r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r; + if (!(r2 & 0x10)) + r2 = 0; + else + r2 = (r2 << 1) & MAX_RED; + + if (!r2) + r2 = 1; + for (g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g; + if (!(g2 & GREEN_HI_BIT)) + g2 = 0; + else + g2 = (g2 << 1) & MAX_GREEN; + + if (!g2) + g2 = 1; + for (b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b; + if (!(b2 & 0x10)) + b2 = 0; + else + b2 = (b2 << 1) & MAX_BLUE; + + if (!b2) + b2 = 1; + GFX.ZERO_OR_X2 [BUILD_PIXEL2 (r, g, b)] = BUILD_PIXEL2 (r2, g2, b2); + GFX.ZERO_OR_X2 [BUILD_PIXEL2 (r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2 (r2, g2, b2); + } + } + } +#endif + + // Build a lookup table that if the top bit of the color value is zero + // then the value is zero, otherwise its just the value. + for (r = 0; r <= MAX_RED; r++) + { + uint32 r2 = r; + if (!(r2 & 0x10)) + r2 = 0; + else + r2 &= ~0x10; + + for (g = 0; g <= MAX_GREEN; g++) + { + uint32 g2 = g; + if (!(g2 & GREEN_HI_BIT)) + g2 = 0; + else + g2 &= ~GREEN_HI_BIT; + for (b = 0; b <= MAX_BLUE; b++) + { + uint32 b2 = b; + if (!(b2 & 0x10)) + b2 = 0; + else + b2 &= ~0x10; + + GFX.ZERO [BUILD_PIXEL2 (r, g, b)] = BUILD_PIXEL2 (r2, g2, b2); + GFX.ZERO [BUILD_PIXEL2 (r, g, b) & ~ALPHA_BITS_MASK] = BUILD_PIXEL2 (r2, g2, b2); + } + } + } + } + + return (TRUE); +} + +void S9xGraphicsDeinit (void) +{ + // Free any memory allocated in S9xGraphicsInit + if (GFX.X2) + { + free ((char *) GFX.X2); + GFX.X2 = NULL; + } + if (GFX.ZERO_OR_X2) + { + free ((char *) GFX.ZERO_OR_X2); + GFX.ZERO_OR_X2 = NULL; + } + if (GFX.ZERO) + { + free ((char *) GFX.ZERO); + GFX.ZERO = NULL; + } +} + +#ifdef DIRECT_COLOR_MAP +void S9xBuildDirectColourMaps () +{ + for (uint32 p = 0; p < 8; p++) + { + for (uint32 c = 0; c < 256; c++) + { +// XXX: Brightness + DirectColourMaps [p][c] = BUILD_PIXEL (((c & 7) << 2) | ((p & 1) << 1), + ((c & 0x38) >> 1) | (p & 2), + ((c & 0xc0) >> 3) | (p & 4)); + } + } + IPPU.DirectColourMapsNeedRebuild = FALSE; +} +#endif + +void S9xStartScreenRefresh () +{ +#ifndef USE_OLD_START_REFRESH + S9xUpdateJoypads (); + CMemory_FillRAM[0x4210] = Model->_5A22; + CPU.Flags &= ~NMI_FLAG; +#endif +#ifdef USE_GL + if (GFX.InfoStringTimeout > 0 && --GFX.InfoStringTimeout == 0) + GFX.InfoString = NULL; +#endif + + if (IPPU.RenderThisFrame) + { +#if 0 + if (!S9xInitUpdate ()) + { + IPPU.RenderThisFrame = FALSE; + return; + } +#endif + IPPU.RenderedFramesCount++; + IPPU.PreviousLine = IPPU.CurrentLine = 0; + IPPU.MaxBrightness = PPU.Brightness; + IPPU.LatchedBlanking = PPU.ForcedBlanking; + if(PPU.BGMode == 5 || PPU.BGMode == 6) + IPPU.Interlace = (CMemory_FillRAM[0x2133] & 1); + { + IPPU.RenderedScreenHeight = PPU.ScreenHeight; +/* + IPPU.DoubleWidthPixels = FALSE; + IPPU.DoubleHeightPixels = FALSE; +*/ + } + PPU.RecomputeClipWindows = TRUE; + GFX.DepthDelta = GFX.SubZBuffer - GFX.ZBuffer; + GFX.Delta = (GFX.SubScreen - GFX.Screen) >> 1; + } +#if defined(DISPLAY_FRAMERATE) && !defined(DEBUG_FRAMESKIP) + if (++IPPU.FrameCount % CMemory_ROMFramesPerSecond == 0) + { + IPPU.DisplayedRenderedFrameCount = IPPU.RenderedFramesCount; + IPPU.RenderedFramesCount = 0; + IPPU.FrameCount = 0; + } +#endif +} + + +void RenderLine (uint8 C) { + snes4all_prof_start(2); + if (IPPU.RenderThisFrame) { + LineData[C].BG[0].VOffset = PPU.BG[0].VOffset + 1; + LineData[C].BG[0].HOffset = PPU.BG[0].HOffset; + LineData[C].BG[1].VOffset = PPU.BG[1].VOffset + 1; + LineData[C].BG[1].HOffset = PPU.BG[1].HOffset; + + if (PPU.BGMode == 7) { + struct SLineMatrixData *p = &LineMatrixData [C]; + p->MatrixA = PPU.MatrixA; + p->MatrixB = PPU.MatrixB; + p->MatrixC = PPU.MatrixC; + p->MatrixD = PPU.MatrixD; + p->CentreX = PPU.CentreX; + p->CentreY = PPU.CentreY; + } else { + if (Settings.StarfoxHack && !PPU.BG[2].VOffset && + PPU.BG[2].HOffset == 0xe000) { + LineData[C].BG[2].VOffset = 0xe1; + LineData[C].BG[2].HOffset = 0; + } else { + LineData[C].BG[2].VOffset = PPU.BG[2].VOffset + 1; + LineData[C].BG[2].HOffset = PPU.BG[2].HOffset; + LineData[C].BG[3].VOffset = PPU.BG[3].VOffset + 1; + LineData[C].BG[3].HOffset = PPU.BG[3].HOffset; + } + } + IPPU.CurrentLine = C + 1; + } else { + // if we're not rendering this frame, we still need to update this + // XXX: Check ForceBlank? Or anything else? + if(IPPU.OBJChanged) + S9xSetupOBJ(); + PPU.RangeTimeOver |= GFX.OBJLines[C].RTOFlags; + } + snes4all_prof_end(2); +} + +void S9xEndScreenRefresh () +{ +//puts("S9xEndScreenRefresh"); + snes4all_prof_start(3); +#ifndef USE_OLD_END_REFRESH + IPPU.HDMA = 0; + // Bits 7 and 6 of $4212 are computed when read in S9xGetPPU. + IPPU.MaxBrightness = PPU.Brightness; + PPU.ForcedBlanking = (CMemory_FillRAM [0x2100] >> 7) & 1; + + if(!PPU.ForcedBlanking){ + PPU.OAMAddr = PPU.SavedOAMAddr; + { + uint8 tmp = 0; + if(PPU.OAMPriorityRotation) + tmp = (PPU.OAMAddr&0xFE)>>1; + if((PPU.OAMFlip&1) || PPU.FirstSprite!=tmp){ + PPU.FirstSprite=tmp; + IPPU.OBJChanged=TRUE; + } + } + PPU.OAMFlip = 0; + } + + CMemory_FillRAM[0x4210] = 0x80 |Model->_5A22; + if (CMemory_FillRAM[0x4200] & 0x80) + { + CPU.NMIActive = TRUE; + CPU.Flags |= NMI_FLAG; + CPU.NMICycleCount = CPU.NMITriggerPoint; + } +#endif +#ifdef USE_GL + static uint8 last_bgmode=0; + if (PPU.BGMode == 7 && videogl_hw_render && last_bgmode!=7) + ZeroMemory((uint32 *)GFX.Screen,SNES4ALL_SCREEN_PITCH*240); + last_bgmode=PPU.BGMode; +#endif +//printf("S9xEndScreenRefresh %i\n",IPPU.RenderThisFrame); +// IPPU.HDMAStarted = FALSE; + if (IPPU.RenderThisFrame) + { + FLUSH_REDRAW_END (); +/* + if (IPPU.ColorsChanged) + { + uint32 saved = PPU.CGDATA[0]; + IPPU.ColorsChanged = FALSE; +// S9xSetPalette (); + PPU.CGDATA[0] = saved; + } +*/ + +//take screenshot here. +#ifndef DREAMCAST + if(Settings.TakeScreenshot) + S9xDoScreenshot(SNES_WIDTH, IPPU.RenderedScreenHeight); +#endif +#if defined(DISPLAY_FRAMERATE) && !defined(DEBUG_FRAMESKIP) + if (snes4all_displayframerate) + S9xDisplayFrameRate (); +#endif +#ifdef USE_GL + if (GFX.InfoString) + S9xDisplayString (GFX.InfoString); +#endif + + S9xDeinitUpdate (SNES_WIDTH, IPPU.RenderedScreenHeight, + TRUE); + } + S9xApplyCheats (); + if (CPU.SRAMModified) + { + if (!CPU.AutoSaveTimer) + { + if (!(CPU.AutoSaveTimer = Settings.AutoSaveDelay * CMemory_ROMFramesPerSecond)) + CPU.SRAMModified = FALSE; + } + else + { + if (!--CPU.AutoSaveTimer) + { + S9xAutoSaveSRAM (); + CPU.SRAMModified = FALSE; + } + } + } + snes4all_prof_end(3); +} + +#ifdef USE_GL +void S9xSetInfoString (const char *string) +{ + GFX.InfoString = string; + GFX.InfoStringTimeout = 120; +} +#endif + +static __inline__ void SelectTileRenderer (bool8 normal) +{ + if (normal) + { +//puts("SelectTileRender normal"); +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16hw; + DrawClippedTilePtr = DrawClippedTile16hw; + DrawLargePixelPtr = DrawLargePixel16hw; + } else +#endif + { + DrawTilePtr = DrawTile16; + DrawClippedTilePtr = DrawClippedTile16; + DrawLargePixelPtr = DrawLargePixel16; + } + } + else + { + if (GFX.r2131 & 0x80) + { + if (GFX.r2131 & 0x40) + { + if (GFX.r2130 & 2) + { +//puts("SelectTileRender Sub1_2"); +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16Sub1_2hw; + DrawClippedTilePtr = DrawClippedTile16Sub1_2hw; + }else +#endif + { + DrawTilePtr = DrawTile16Sub1_2; + DrawClippedTilePtr = DrawClippedTile16Sub1_2; + } + } + else + { +//puts("SelectTileRender FixedSub1_2"); + // Fixed colour substraction +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16FixedSub1_2hw; + DrawClippedTilePtr = DrawClippedTile16FixedSub1_2hw; + }else +#endif + { + DrawTilePtr = DrawTile16FixedSub1_2; + DrawClippedTilePtr = DrawClippedTile16FixedSub1_2; + } + } +#ifdef USE_GL + if (videogl_hw_render) + DrawLargePixelPtr = DrawLargePixel16Sub1_2hw; + else +#endif + DrawLargePixelPtr = DrawLargePixel16Sub1_2; + } + else + { +//puts("SelectTileRender Sub"); +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16Subhw; + DrawClippedTilePtr = DrawClippedTile16Subhw; + DrawLargePixelPtr = DrawLargePixel16Subhw; + }else +#endif + { + DrawTilePtr = DrawTile16Sub; + DrawClippedTilePtr = DrawClippedTile16Sub; + DrawLargePixelPtr = DrawLargePixel16Sub; + } + } + } + else + { + if (GFX.r2131 & 0x40) + { + if (GFX.r2130 & 2) + { +//puts("SelectTileRender Add1_2"); +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16Add1_2hw; + DrawClippedTilePtr = DrawClippedTile16Add1_2hw; + } else +#endif + { + DrawTilePtr = DrawTile16Add1_2; + DrawClippedTilePtr = DrawClippedTile16Add1_2; + } + } + else + { +//puts("SelectTileRender FixedAdd1_2"); + // Fixed colour addition +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16FixedAdd1_2hw; + DrawClippedTilePtr = DrawClippedTile16FixedAdd1_2hw; + } else +#endif + { + DrawTilePtr = DrawTile16FixedAdd1_2; + DrawClippedTilePtr = DrawClippedTile16FixedAdd1_2; + } + } +#ifdef USE_GL + if (videogl_hw_render) + DrawLargePixelPtr = DrawLargePixel16Add1_2hw; + else +#endif + DrawLargePixelPtr = DrawLargePixel16Add1_2; + } + else + { +//puts("SelectTileRender Add"); +#ifdef USE_GL + if (videogl_hw_render) { + DrawTilePtr = DrawTile16Addhw; + DrawClippedTilePtr = DrawClippedTile16Addhw; + DrawLargePixelPtr = DrawLargePixel16Addhw; + }else +#endif + { + DrawTilePtr = DrawTile16Add; + DrawClippedTilePtr = DrawClippedTile16Add; + DrawLargePixelPtr = DrawLargePixel16Add; + } + } + } + } +} + +void S9xSetupOBJ () +{ +//return; +//static int cuantos=0; +//cuantos++; +//if (cuantos!=2) return; +//puts("SetupOBJ"); +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "Entering SetupOBJS()\n"); +#endif + int SmallWidth, SmallHeight; + int LargeWidth, LargeHeight; + + switch (PPU.OBJSizeSelect) + { + case 0: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 16; + break; + case 1: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 32; + break; + case 2: + SmallWidth = SmallHeight = 8; + LargeWidth = LargeHeight = 64; + break; + case 3: + SmallWidth = SmallHeight = 16; + LargeWidth = LargeHeight = 32; + break; + case 4: + SmallWidth = SmallHeight = 16; + LargeWidth = LargeHeight = 64; + break; + default: + case 5: + SmallWidth = SmallHeight = 32; + LargeWidth = LargeHeight = 64; + break; + case 6: + SmallWidth = 16; SmallHeight = 32; + LargeWidth = 32; LargeHeight = 64; + break; + case 7: + SmallWidth = 16; SmallHeight = 32; + LargeWidth = LargeHeight = 32; + break; + } + if(IPPU.InterlaceSprites) + { + SmallHeight>>=1; LargeHeight>>=1; + } +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "Sizes are %dx%d and %dx%d\n", SmallWidth, SmallHeight, LargeWidth, LargeHeight); +#endif + + /* OK, we have three cases here. Either there's no priority, priority is + * normal FirstSprite, or priority is FirstSprite+Y. The first two are + * easy, the last is somewhat more ... interesting. So we split them up. */ + + int Height; + uint8 S; + +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "Priority rotation=%d, OAMAddr=%d -> ", PPU.OAMPriorityRotation, PPU.OAMAddr*2 | (PPU.OAMFlip&1)); +#endif + if(!PPU.OAMPriorityRotation || !(PPU.OAMFlip&PPU.OAMAddr&1)){ +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "normal FirstSprite = %02x\n", PPU.FirstSprite); +#endif + /* normal case */ + uint8 LineOBJ[SNES_HEIGHT_EXTENDED]; + ZeroMemory(LineOBJ, sizeof(LineOBJ)); + for(int i=0; i-GFX.OBJWidths[S] && HPos<=256) + { + if(HPos<0){ + GFX.OBJVisibleTiles[S]=(GFX.OBJWidths[S]+HPos+7)>>3; + } else if(HPos+GFX.OBJWidths[S]>=257){ + GFX.OBJVisibleTiles[S]=(257-HPos+7)>>3; + } else { + GFX.OBJVisibleTiles[S]=GFX.OBJWidths[S]>>3; + } + for(uint8 line=0, Y=(uint8)(PPU.OBJ[S].VPos&0xff); line=SNES_HEIGHT_EXTENDED) continue; + if(LineOBJ[Y]>=32){ + GFX.OBJLines[Y].RTOFlags|=0x40; +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "%d: OBJ %02x ranged over\n", Y, S); +#endif + continue; + } +#ifdef USE_GL + if ((!((line)&7))||(!videogl_hw_render)) +#endif + { + GFX.OBJLines[Y].Tiles-=GFX.OBJVisibleTiles[S]; + if(GFX.OBJLines[Y].Tiles<0) GFX.OBJLines[Y].RTOFlags|=0x80; +//printf("GFX.OBJLines[Y=%i].OBJ[LineOBJ[Y]=%i].Sprite=S=%i (%i)\n",Y,LineOBJ[Y],S,!((line)&7)); + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Sprite=S; + if(PPU.OBJ[S].VFlip){ + // Yes, Width not Height. It so happens that the + // sprites with H=2*W flip as two WxW sprites. + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Line=line^(GFX.OBJWidths[S]-1); + } else { + GFX.OBJLines[Y].OBJ[LineOBJ[Y]].Line=line; + } + LineOBJ[Y]++; + } + } + } + S=(S+1)&0x7F; + } while(S!=FirstSprite); +//} while(0); +//} + + for(int Y=1; Y-GFX.OBJWidths[S] && HPos<=256) + { + if(HPos<0){ + GFX.OBJVisibleTiles[S]=(GFX.OBJWidths[S]+HPos+7)>>3; + } else if(HPos+GFX.OBJWidths[S]>=257){ + GFX.OBJVisibleTiles[S]=(257-HPos+7)>>3; + } else { + GFX.OBJVisibleTiles[S]=GFX.OBJWidths[S]>>3; + } + for(uint8 line=0, Y=(uint8)(PPU.OBJ[S].VPos&0xff); line=SNES_HEIGHT_EXTENDED) continue; + if(PPU.OBJ[S].VFlip){ + // Yes, Width not Height. It so happens that the + // sprites with H=2*W flip as two WxW sprites. + OBJOnLine[Y][S]=(line^(GFX.OBJWidths[S]-1)) | 0x80; + } else { + OBJOnLine[Y][S]=line | 0x80; + } + } + } + } + + /* Now go through and pull out those OBJ that are actually visible. */ + int j; + for(int Y=0; Y=32){ + GFX.OBJLines[Y].RTOFlags|=0x40; +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "%d: OBJ %02x ranged over\n", Y, S); +#endif + break; + } + GFX.OBJLines[Y].Tiles-=GFX.OBJVisibleTiles[S]; + if(GFX.OBJLines[Y].Tiles<0) GFX.OBJLines[Y].RTOFlags|=0x80; + GFX.OBJLines[Y].OBJ[j].Sprite=S; + GFX.OBJLines[Y].OBJ[j++].Line=OBJOnLine[Y][S]&~0x80; + } + S=(S+1)&0x7F; + } while(S!=FirstSprite); + if(j<32) GFX.OBJLines[Y].OBJ[j].Sprite=-1; + } + } + +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) { + fprintf(stderr, "Sprites per line:\n"); + for(int xxx=0; xxx=0; j++){ + fprintf(stderr, " %02x.%d", GFX.OBJLines[xxx].OBJ[j].Sprite, GFX.OBJLines[xxx].OBJ[j].Line); + } + fprintf(stderr, "\n"); + } + + fprintf(stderr, "Exiting SetupObj()\n"); + } +#endif + + IPPU.OBJChanged = FALSE; +} + +void DrawOBJS (bool8 OnMain = FALSE, uint8 D = 0) +{ +//puts("DrawOBJS"); +//return; +//printf("DrawOBJS %i, %i\n",OnMain,D); +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "Entering DrawOBJS() for %d-%d\n", GFX.StartY, GFX.EndY); +#endif + CHECK_SOUND(); + + BG.BitShift = 4; + BG.TileShift = 5; + BG.TileAddress = PPU.OBJNameBase; + BG.StartPalette = 128; + BG.PaletteShift = 4; + BG.PaletteMask = 7; + BG.Buffer = IPPU.TileCache [TILE_4BIT]; + BG.Buffered = IPPU.TileCached [TILE_4BIT]; + BG.NameSelect = PPU.OBJNameSelect; +#ifdef DIRECT_COLOR_MAP + BG.DirectColourMode = FALSE; +#endif + +// GFX.PixSize = 1; + + struct { + uint16 Pos; + bool8 Value; + } Windows[7]; + int clipcount = GFX.pCurrentClip->Count [4]; + if (!clipcount){ + Windows[0].Pos=0; + Windows[0].Value=TRUE; + Windows[1].Pos=256; + Windows[1].Value=FALSE; + Windows[2].Pos=1000; + Windows[2].Value=FALSE; + } else { + Windows[0].Pos=1000; + Windows[0].Value=FALSE; + for(int clip=0, i=1; clipRight[clip][4]<=GFX.pCurrentClip->Left[clip][4]) continue; + int j; + for(j=0; jLeft[clip][4]; j++); + if(jLeft[clip][4]){ + Windows[j].Value = TRUE; + } else { + if(jLeft[clip][4]; + Windows[j].Value = TRUE; + i++; + } + for(j=0; jRight[clip][4]; j++); + if(j>=i || Windows[j].Pos!=GFX.pCurrentClip->Right[clip][4]){ + if(jRight[clip][4]; + Windows[j].Value = FALSE; + i++; + } + } + } + +#ifdef MK_DEBUG_RTO +if(Settings.BGLayering) { + fprintf(stderr, "Windows:\n"); + for(int xxx=0; xxx<6; xxx++){ fprintf(stderr, "%d: %d = %d\n", xxx, Windows[xxx].Pos, Windows[xxx].Value); } +} +#endif + + GFX.Z1 = D + 2; +#ifdef USE_GL + for(int NS=0x7f;NS>=0;NS--){ + if (!videogl_hw_render) NS=0; +#endif + for(uint32 Y=GFX.StartY, Offset=getY2(Y); Y<=GFX.EndY; Y++, Offset+=SNES4ALL_SCREEN_PITCH2){ +#ifdef MK_DEBUG_RTO + bool8 Flag=0; +#endif + int I = 0; +#ifdef MK_DISABLE_TIME_OVER + int tiles=0; +#else + int tiles=GFX.OBJLines[Y].Tiles; +#endif +//printf("Y=%i S=%i\n",Y,GFX.OBJLines[Y].OBJ[0].Sprite); + for (int S = GFX.OBJLines[Y].OBJ[I].Sprite; S >= 0 && I<32; S = GFX.OBJLines[Y].OBJ[++I].Sprite) + { +#ifdef USE_GL + if(videogl_hw_render) { +// if (S!=NS) continue; + if (SNS) break; + } +#endif +//printf("S=%i, Y=%i, I=%i, next=%i, Z1=%i\n",S,Y,I,GFX.OBJLines[Y].OBJ[I+1].Sprite,GFX.Z1); + tiles+=GFX.OBJVisibleTiles[S]; + if(tiles<=0){ +#ifdef MK_DEBUG_RTO +if(Settings.BGLayering) { + if(!Flag){ Flag=1; fprintf(stderr, "Line %d:", Y); } + fprintf(stderr, " [%02x]", S); +} +#endif + continue; + } + +#ifdef MK_DEBUG_RTO +if(Settings.BGLayering) { + if(!Flag){ Flag=1; fprintf(stderr, "Line %d:", Y); } + fprintf(stderr, " %02x", S); +} +#endif + +#ifdef USE_GL + if (!videogl_hw_render) +#endif + if (OnMain && SUB_OR_ADD(4)) + { + SelectTileRenderer (!GFX.Pseudo && PPU.OBJ [S].Palette < 4); + } + + int BaseTile = (((GFX.OBJLines[Y].OBJ[I].Line<<1) + (PPU.OBJ[S].Name&0xf0))&0xf0) | (PPU.OBJ[S].Name&0x100) | (PPU.OBJ[S].Palette << 10); + int TileX = PPU.OBJ[S].Name&0x0f; +#ifndef USE_GL + int TileLine = (GFX.OBJLines[Y].OBJ[I].Line&7)*8; +#else + int TileLine, TileCount; + if (videogl_hw_render) { + TileLine=0; + TileCount=8; + if (GFX.OBJLines[Y].OBJ[I].Line&7) + BaseTile |= V_FLIP; + } else { + TileLine = (GFX.OBJLines[Y].OBJ[I].Line&7)*8; + TileCount = 1; + } + +#endif + int TileInc = 1; + + if (PPU.OBJ[S].HFlip) + { + TileX = (TileX + (GFX.OBJWidths[S] >> 3) - 1) & 0x0f; + BaseTile |= H_FLIP; + TileInc = -1; + } + + GFX.Z2 = (PPU.OBJ[S].Priority + 1) * 4 + D; + + bool8 WinStat=TRUE; + int WinIdx=0, NextPos=-1000; + int X=PPU.OBJ[S].HPos; if(X==-256) X=256; + for(int t=tiles, O=Offset+X*GFX_PIXSIZE; X<=256 && X=NextPos){ + for(; WinIdx<7 && Windows[WinIdx].Pos<=X; WinIdx++); + if(!WinIdx) WinStat=FALSE; + else WinStat=Windows[WinIdx-1].Value; + NextPos=(WinIdx<7)?Windows[WinIdx].Pos:1000; + } + + if(X+8X+8) NextPos=X+8; + } + } + } + } +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) if(Flag) fprintf(stderr, "\n"); +#endif + } +#ifdef USE_GL + } +#endif +#ifdef MK_DEBUG_RTO + if(Settings.BGLayering) fprintf(stderr, "Exiting DrawOBJS() for %d-%d\n", GFX.StartY, GFX.EndY); +#endif +} + +void DrawBackgroundMosaic (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +{ + CHECK_SOUND(); + + uint32 Tile; + uint16 *SC0; + uint16 *SC1; + uint16 *SC2; + uint16 *SC3; + uint8 depths [2] = {Z1, Z2}; + + if (!BGMode) + BG.StartPalette = bg << 5; + else + BG.StartPalette = 0; + + SC0 = (uint16 *) &CMemory_VRAM[PPU.BG[bg].SCBase << 1]; + + if (PPU.BG[bg].SCSize & 1) + SC1 = SC0 + 1024; + else + SC1 = SC0; + + if(((uint8*)SC1-CMemory_VRAM)>=0x10000) + SC1-=0x08000; + + + if (PPU.BG[bg].SCSize & 2) + SC2 = SC1 + 1024; + else + SC2 = SC0; + + if(((uint8*)SC2-CMemory_VRAM)>=0x10000) + SC2-=0x08000; + + + if (PPU.BG[bg].SCSize & 1) + SC3 = SC2 + 1024; + else + SC3 = SC2; + + if(((uint8*)SC3-CMemory_VRAM)>=0x10000) + SC3-=0x08000; + + uint32 Lines; + uint32 OffsetMask; + uint32 OffsetShift; + + if (BG.TileSize == 16) + { + OffsetMask = 0x3ff; + OffsetShift = 4; + } + else + { + OffsetMask = 0x1ff; + OffsetShift = 3; + } + + int m5 = (BGMode == 5 || BGMode == 6) ? 1 : 0; + + for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y += Lines) + { + uint32 VOffset = LineData [Y].BG[bg].VOffset; + uint32 HOffset = LineData [Y].BG[bg].HOffset; + uint32 MosaicOffset = Y % PPU.Mosaic; + + for (Lines = 1; Lines < PPU.Mosaic - MosaicOffset; Lines++) + if ((VOffset != LineData [Y + Lines].BG[bg].VOffset) || + (HOffset != LineData [Y + Lines].BG[bg].HOffset)) + break; + + uint32 MosaicLine = VOffset + Y - MosaicOffset; + + if (Y + Lines > GFX.EndY) + Lines = GFX.EndY + 1 - Y; + uint32 VirtAlign = (MosaicLine & 7) << 3; + + uint16 *b1; + uint16 *b2; + + uint32 ScreenLine = MosaicLine >> OffsetShift; + uint32 Rem16 = MosaicLine & 15; + + if (ScreenLine & 0x20) + b1 = SC2, b2 = SC3; + else + b1 = SC0, b2 = SC1; + + b1 += (ScreenLine & 0x1f) << 5; + b2 += (ScreenLine & 0x1f) << 5; + uint16 *t; + uint32 Left = 0; + uint32 Right = 256 << m5; + + HOffset <<= m5; + + uint32 ClipCount = GFX.pCurrentClip->Count [bg]; + uint32 HPos = HOffset; + uint32 PixWidth = (PPU.Mosaic << m5); + + + if (!ClipCount) + ClipCount = 1; + + for (uint32 clip = 0; clip < ClipCount; clip++) + { + if (GFX.pCurrentClip->Count [bg]) + { + Left = GFX.pCurrentClip->Left [clip][bg] << m5; + Right = GFX.pCurrentClip->Right [clip][bg] << m5; + + uint32 r = Left % (PPU.Mosaic << m5); + HPos = HOffset + Left; + PixWidth = (PPU.Mosaic << m5) - r; + } + uint32 s = getY2(Y) + Left * GFX_PIXSIZE; + for (uint32 x = Left; x < Right; x += PixWidth, + s += PixWidth * GFX_PIXSIZE, + HPos += PixWidth, PixWidth = (PPU.Mosaic << m5)) + { + uint32 Quot = (HPos & OffsetMask) >> 3; + + if (x + PixWidth >= Right) + PixWidth = Right - x; + + if (BG.TileSize == 8 && !m5) + { + if (Quot > 31) + t = b2 + (Quot & 0x1f); + else + t = b1 + Quot; + } + else + { + if (Quot > 63) + t = b2 + ((Quot >> 1) & 0x1f); + else + t = b1 + (Quot >> 1); + } + + Tile = READ_2BYTES (t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + + // Draw tile... + if (BG.TileSize != 8) + { + if (Tile & H_FLIP) + { + // Horizontal flip, but what about vertical flip ? + if (Tile & V_FLIP) + { + // Both horzontal & vertical flip + if (Rem16 < 8) + { + (*DrawLargePixelPtr) (Tile + 17 - (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + else + { + (*DrawLargePixelPtr) (Tile + 1 - (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + } + else + { + // Horizontal flip only + if (Rem16 > 7) + { + (*DrawLargePixelPtr) (Tile + 17 - (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + else + { + (*DrawLargePixelPtr) (Tile + 1 - (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + } + } + else + { + // No horizontal flip, but is there a vertical flip ? + if (Tile & V_FLIP) + { + // Vertical flip only + if (Rem16 < 8) + { + (*DrawLargePixelPtr) (Tile + 16 + (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + else + { + (*DrawLargePixelPtr) (Tile + (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + } + else + { + // Normal unflipped + if (Rem16 > 7) + { + (*DrawLargePixelPtr) (Tile + 16 + (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + else + { + (*DrawLargePixelPtr) (Tile + (Quot & 1), s, + HPos & 7, PixWidth, + VirtAlign, Lines); + } + } + } + } + else + (*DrawLargePixelPtr) (Tile + (Quot & 1) * m5, s, HPos & 7, PixWidth, + VirtAlign, Lines); + } + } + } +} + +void DrawBackgroundOffset (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +{ + CHECK_SOUND(); + + uint32 Tile; + uint16 *SC0; + uint16 *SC1; + uint16 *SC2; + uint16 *SC3; + uint16 *BPS0; + uint16 *BPS1; + uint16 *BPS2; + uint16 *BPS3; + uint32 Width; + int VOffsetOffset = BGMode == 4 ? 0 : 32; + uint8 depths [2] = {Z1, Z2}; + + BG.StartPalette = 0; + + BPS0 = (uint16 *) &CMemory_VRAM[PPU.BG[2].SCBase << 1]; + + if (PPU.BG[2].SCSize & 1) + BPS1 = BPS0 + 1024; + else + BPS1 = BPS0; + + if (PPU.BG[2].SCSize & 2) + BPS2 = BPS1 + 1024; + else + BPS2 = BPS0; + + if (PPU.BG[2].SCSize & 1) + BPS3 = BPS2 + 1024; + else + BPS3 = BPS2; + + SC0 = (uint16 *) &CMemory_VRAM[PPU.BG[bg].SCBase << 1]; + + if (PPU.BG[bg].SCSize & 1) + SC1 = SC0 + 1024; + else + SC1 = SC0; + + if(((uint8*)SC1-CMemory_VRAM)>=0x10000) + SC1-=0x08000; + + + if (PPU.BG[bg].SCSize & 2) + SC2 = SC1 + 1024; + else + SC2 = SC0; + + if(((uint8*)SC2-CMemory_VRAM)>=0x10000) + SC2-=0x08000; + + + if (PPU.BG[bg].SCSize & 1) + SC3 = SC2 + 1024; + else + SC3 = SC2; + + if(((uint8*)SC3-CMemory_VRAM)>=0x10000) + SC3-=0x08000; + + + static const int Lines = 1; + int OffsetMask; + int OffsetShift; + int OffsetEnableMask = 1 << (bg + 13); + + if (BG.TileSize == 16) + { + OffsetMask = 0x3ff; + OffsetShift = 4; + } + else + { + OffsetMask = 0x1ff; + OffsetShift = 3; + } + + for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y++) + { + uint32 VOff = LineData [Y].BG[2].VOffset - 1; +// uint32 VOff = LineData [Y].BG[2].VOffset; + uint32 HOff = LineData [Y].BG[2].HOffset; + + int VirtAlign; + int ScreenLine = VOff >> 3; + int t1; + int t2; + uint16 *s0; + uint16 *s1; + uint16 *s2; + + if (ScreenLine & 0x20) + s1 = BPS2, s2 = BPS3; + else + s1 = BPS0, s2 = BPS1; + + s1 += (ScreenLine & 0x1f) << 5; + s2 += (ScreenLine & 0x1f) << 5; + + if(BGMode != 4) + { + if((ScreenLine & 0x1f) == 0x1f) + { + if(ScreenLine & 0x20) + VOffsetOffset = BPS0 - BPS2 - 0x1f*32; + else + VOffsetOffset = BPS2 - BPS0 - 0x1f*32; + } + else + { + VOffsetOffset = 32; + } + } + + int clipcount = GFX.pCurrentClip->Count [bg]; + if (!clipcount) + clipcount = 1; + + for (int clip = 0; clip < clipcount; clip++) + { + uint32 Left; + uint32 Right; + + if (!GFX.pCurrentClip->Count [bg]) + { + Left = 0; + Right = 256; + } + else + { + Left = GFX.pCurrentClip->Left [clip][bg]; + Right = GFX.pCurrentClip->Right [clip][bg]; + + if (Right <= Left) + continue; + } + + uint32 VOffset; + uint32 HOffset; + //added: + uint32 LineHOffset=LineData [Y].BG[bg].HOffset; + + uint32 Offset; + uint32 HPos; + uint32 Quot; + uint32 Count; + uint16 *t; + uint32 Quot2; + uint32 VCellOffset; + uint32 HCellOffset; + uint16 *b1; + uint16 *b2; + uint32 TotalCount = 0; + uint32 MaxCount = 8; + + uint32 s = Left * GFX_PIXSIZE + getY2(Y); + bool8 left_hand_edge = (!Left); + Width = Right - Left; + + if (Left & 7) + MaxCount = 8 - (Left & 7); + + while (Left < Right) + { + if (left_hand_edge) + { + // The SNES offset-per-tile background mode has a + // hardware limitation that the offsets cannot be set + // for the tile at the left-hand edge of the screen. + VOffset = LineData [Y].BG[bg].VOffset; + + //MKendora; use temp var to reduce memory accesses + //HOffset = LineData [Y].BG[bg].HOffset; + + HOffset = LineHOffset; + //End MK + + left_hand_edge = FALSE; + } + else + + { + // All subsequent offset tile data is shifted left by one, + // hence the - 1 below. + + Quot2 = ((HOff + Left - 1) & OffsetMask) >> 3; + + if (Quot2 > 31) + s0 = s2 + (Quot2 & 0x1f); + else + s0 = s1 + Quot2; + + HCellOffset = READ_2BYTES (s0); + + if (BGMode == 4) + { + VOffset = LineData [Y].BG[bg].VOffset; + + //MKendora another mem access hack + //HOffset = LineData [Y].BG[bg].HOffset; + HOffset=LineHOffset; + //end MK + + if ((HCellOffset & OffsetEnableMask)) + { + if (HCellOffset & 0x8000) + VOffset = HCellOffset + 1; + else + HOffset = HCellOffset; + } + } + else + { + VCellOffset = READ_2BYTES (s0 + VOffsetOffset); + if ((VCellOffset & OffsetEnableMask)) + VOffset = VCellOffset + 1; + else + VOffset = LineData [Y].BG[bg].VOffset; + + //MKendora Strike Gunner fix + if ((HCellOffset & OffsetEnableMask)) + { + //HOffset= HCellOffset; + + HOffset = (HCellOffset & ~7)|(LineHOffset&7); + //HOffset |= LineData [Y].BG[bg].HOffset&7; + } + else + HOffset=LineHOffset; + //HOffset = LineData [Y].BG[bg].HOffset - + //Settings.StrikeGunnerOffsetHack; + //HOffset &= (~7); + //end MK + } + } + VirtAlign = ((Y + VOffset) & 7) << 3; + ScreenLine = (VOffset + Y) >> OffsetShift; + + if (((VOffset + Y) & 15) > 7) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + + if (ScreenLine & 0x20) + b1 = SC2, b2 = SC3; + else + b1 = SC0, b2 = SC1; + + b1 += (ScreenLine & 0x1f) << 5; + b2 += (ScreenLine & 0x1f) << 5; + + HPos = (HOffset + Left) & OffsetMask; + + Quot = HPos >> 3; + + if (BG.TileSize == 8) + { + if (Quot > 31) + t = b2 + (Quot & 0x1f); + else + t = b1 + Quot; + } + else + { + if (Quot > 63) + t = b2 + ((Quot >> 1) & 0x1f); + else + t = b1 + (Quot >> 1); + } + + if (MaxCount + TotalCount > Width) + MaxCount = Width - TotalCount; + + Offset = HPos & 7; + + //Count =1; + Count = 8 - Offset; + if (Count > MaxCount) + Count = MaxCount; + + s -= Offset * GFX_PIXSIZE; + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + + if (BG.TileSize == 8) + (*DrawClippedTilePtr) (Tile, s, Offset, Count, VirtAlign, Lines); + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + (*DrawClippedTilePtr) (Tile + t1 + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + (*DrawClippedTilePtr) (Tile + t2 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + { + // H flip only + (*DrawClippedTilePtr) (Tile + t1 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + else + { + // V flip only + (*DrawClippedTilePtr) (Tile + t2 + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + + Left += Count; + TotalCount += Count; + s += (Offset + Count) * GFX_PIXSIZE; + MaxCount = 8; + } + } + } +} + +#if 0 +void DrawBackgroundMode5 (uint32 /* BGMODE */, uint32 bg, uint8 Z1, uint8 Z2) +{ + CHECK_SOUND(); + +// GFX.PixSize = 1; + uint8 depths [2] = {Z1, Z2}; + + uint32 Tile; + uint16 *SC0; + uint16 *SC1; + uint16 *SC2; + uint16 *SC3; + uint32 Width; + + BG.StartPalette = 0; + + SC0 = (uint16 *) &CMemory_VRAM[PPU.BG[bg].SCBase << 1]; + + if ((PPU.BG[bg].SCSize & 1)) + SC1 = SC0 + 1024; + else + SC1 = SC0; + + if((SC1-(unsigned short*)CMemory_VRAM)>0x10000) + SC1=(uint16*)&CMemory_VRAM[(((uint8*)SC1)-CMemory_VRAM)%0x10000]; + + if ((PPU.BG[bg].SCSize & 2)) + SC2 = SC1 + 1024; + else SC2 = SC0; + + if(((uint8*)SC2-CMemory_VRAM)>=0x10000) + SC2-=0x08000; + + + + if ((PPU.BG[bg].SCSize & 1)) + SC3 = SC2 + 1024; + else + SC3 = SC2; + + if(((uint8*)SC3-CMemory_VRAM)>=0x10000) + SC3-=0x08000; + + + + int Lines; + int VOffsetMask; + int VOffsetShift; + + if (BG.TileSize == 16) + { + VOffsetMask = 0x3ff; + VOffsetShift = 4; + } + else + { + VOffsetMask = 0x1ff; + VOffsetShift = 3; + } + int endy = IPPU.Interlace ? 1 + (GFX.EndY << 1) : GFX.EndY; + + for (int Y = IPPU.Interlace ? GFX.StartY << 1 : GFX.StartY; Y <= endy; Y += Lines) + { + int y = IPPU.Interlace ? (Y >> 1) : Y; + uint32 VOffset = LineData [y].BG[bg].VOffset; + uint32 HOffset = LineData [y].BG[bg].HOffset; + int VirtAlign = (Y + VOffset) & 7; + + for (Lines = 1; Lines < 8 - VirtAlign; Lines++) + if ((VOffset != LineData [y + Lines].BG[bg].VOffset) || + (HOffset != LineData [y + Lines].BG[bg].HOffset)) + break; + + HOffset <<= 1; + if (Y + Lines > endy) + Lines = endy + 1 - Y; + VirtAlign <<= 3; + + int ScreenLine = (VOffset + Y) >> VOffsetShift; + int t1; + int t2; + if (((VOffset + Y) & 15) > 7) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + uint16 *b1; + uint16 *b2; + + if (ScreenLine & 0x20) + b1 = SC2, b2 = SC3; + else + b1 = SC0, b2 = SC1; + + b1 += (ScreenLine & 0x1f) << 5; + b2 += (ScreenLine & 0x1f) << 5; + + int clipcount = GFX.pCurrentClip->Count [bg]; + if (!clipcount) + clipcount = 1; + for (int clip = 0; clip < clipcount; clip++) + { + int Left; + int Right; + + if (!GFX.pCurrentClip->Count [bg]) + { + Left = 0; + Right = 512; + } + else + { + Left = GFX.pCurrentClip->Left [clip][bg] * 2; + Right = GFX.pCurrentClip->Right [clip][bg] * 2; + + if (Right <= Left) + continue; + } + + uint32 s = Left * GFX_PIXSIZE + getY2(Y); + uint32 HPos = (HOffset + Left * GFX_PIXSIZE) & 0x3ff; + + uint32 Quot = HPos >> 3; + uint32 Count = 0; + + uint16 *t; + if (Quot > 63) + t = b2 + ((Quot >> 1) & 0x1f); + else + t = b1 + (Quot >> 1); + + Width = Right - Left; + // Left hand edge clipped tile + if (HPos & 7) + { + int Offset = (HPos & 7); + Count = 8 - Offset; + if (Count > Width) + Count = Width; + s -= Offset; + Tile = READ_2BYTES (t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + + if (BG.TileSize == 8) + { + if (!(Tile & H_FLIP)) + { + // Normal, unflipped + CallDrawHiResClippedTilePtr (Tile + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + { + // H flip + CallDrawHiResClippedTilePtr (Tile + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + CallDrawHiResClippedTilePtr (Tile + t1 + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + CallDrawHiResClippedTilePtr (Tile + t2 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + { + // H flip only + CallDrawHiResClippedTilePtr (Tile + t1 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + else + { + // V flip only + CallDrawHiResClippedTilePtr (Tile + t2 + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + + t += Quot & 1; + if (Quot == 63) + t = b2; + else if (Quot == 127) + t = b1; + Quot++; + s += 8; + } + + // Middle, unclipped tiles + Count = Width - Count; + int Middle = Count >> 3; + Count &= 7; + for (int C = Middle; C > 0; s += 8, Quot++, C--) + { + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + if (BG.TileSize == 8) + { + if (!(Tile & H_FLIP)) + { + // Normal, unflipped + CallDrawHiResTilePtr (Tile + (Quot & 1), + s, VirtAlign, Lines); + } + else + { + // H flip + CallDrawHiResTilePtr (Tile + 1 - (Quot & 1), + s, VirtAlign, Lines); + } + } + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + CallDrawHiResTilePtr (Tile + t1 + (Quot & 1), + s, VirtAlign, Lines); + } + else + if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + CallDrawHiResTilePtr (Tile + t2 + 1 - (Quot & 1), + s, VirtAlign, Lines); + } + else + { + // H flip only + CallDrawHiResTilePtr (Tile + t1 + 1 - (Quot & 1), + s, VirtAlign, Lines); + } + } + else + { + // V flip only + CallDrawHiResTilePtr (Tile + t2 + (Quot & 1), + s, VirtAlign, Lines); + } + } + + t += Quot & 1; + if (Quot == 63) + t = b2; + else + if (Quot == 127) + t = b1; + } + + // Right-hand edge clipped tiles + if (Count) + { + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + if (BG.TileSize == 8) + { + if (!(Tile & H_FLIP)) + { + // Normal, unflipped + CallDrawHiResClippedTilePtr (Tile + (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + else + { + // H flip + CallDrawHiResClippedTilePtr (Tile + 1 - (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + } + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + CallDrawHiResClippedTilePtr (Tile + t1 + (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + else + if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + CallDrawHiResClippedTilePtr (Tile + t2 + 1 - (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + else + { + // H flip only + CallDrawHiResClippedTilePtr (Tile + t1 + 1 - (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + } + else + { + // V flip only + CallDrawHiResClippedTilePtr (Tile + t2 + (Quot & 1), + s, 0, Count, VirtAlign, Lines); + } + } + } + } + } +} +#endif + +void DrawBackground (uint32 BGMode, uint32 bg, uint8 Z1, uint8 Z2) +{ +//return; +//static int cuenta=0; +//cuenta++; +//if (cuenta!=1) return; +//printf("DrawBackground, BGMode=%i, bg=%i, Z1=%i, Z2=%i\n",BGMode,bg,Z1,Z2); +// GFX.PixSize = 1; + + BG.TileSize = BGSizes [PPU.BG[bg].BGSize]; + BG.BitShift = BitShifts[BGMode][bg]; + BG.TileShift = TileShifts[BGMode][bg]; + BG.TileAddress = PPU.BG[bg].NameBase << 1; + BG.NameSelect = 0; + BG.Buffer = IPPU.TileCache [Depths [BGMode][bg]]; + BG.Buffered = IPPU.TileCached [Depths [BGMode][bg]]; +//printf("BG.Buffered = %i\n",Depths[BGMode][bg]); + BG.PaletteShift = PaletteShifts[BGMode][bg]; + BG.PaletteMask = PaletteMasks[BGMode][bg]; +#ifdef DIRECT_COLOR_MAP + BG.DirectColourMode = (BGMode == 3 || BGMode == 4) && !bg && + (GFX.r2130 & 1); +#endif + +#ifdef USE_GL + if (BG.BitShift>4) videogl_8bit_tiles=1; +// if (videogl_clip_enabled<=bg) { + if (!videogl_clip) { + videogl_clip_enabled=bg; + videogl_clip=GFX.pCurrentClip; + } else { + unsigned aleft=0; + unsigned aright=256; + unsigned fleft=0; + unsigned fright=256; + for (int i=0;iCount[videogl_clip_enabled];i++) { + unsigned Left=videogl_clip->Left[i][videogl_clip_enabled]; + unsigned Right=videogl_clip->Right[i][videogl_clip_enabled]; + if (Right<=Left) continue; + if (Left>aleft) aleft=Left; + if (RightCount[bg];i++) { + unsigned Left=GFX.pCurrentClip->Left[i][bg]; + unsigned Right=GFX.pCurrentClip->Right[i][bg]; + if (Right<=Left) continue; + if (Left>fleft) fleft=Left; + if (Rightaright) { + videogl_clip_enabled=bg; + videogl_clip=GFX.pCurrentClip; + } + } +#endif + if (PPU.BGMosaic [bg] && PPU.Mosaic > 1) + { + DrawBackgroundMosaic (BGMode, bg, Z1, Z2); + return; + + } +#ifdef USE_GL + if (!videogl_hw_render) +#endif + switch (BGMode) + { + case 2: + case 4: // Used by Puzzle Bobble + DrawBackgroundOffset (BGMode, bg, Z1, Z2); + return; + + case 5: + case 6: // XXX: is also offset per tile. + break; + } + CHECK_SOUND(); + + uint32 Tile; + uint16 *SC0; + uint16 *SC1; + uint16 *SC2; + uint16 *SC3; + uint32 Width; + uint8 depths [2] = {Z1, Z2}; + + if (!BGMode) + BG.StartPalette = bg << 5; + else BG.StartPalette = 0; + + SC0 = (uint16 *) &CMemory_VRAM[PPU.BG[bg].SCBase << 1]; + + if (PPU.BG[bg].SCSize & 1) + SC1 = SC0 + 1024; + else + SC1 = SC0; + + if(SC1>=(unsigned short*)(CMemory_VRAM+0x10000)) + SC1=(uint16*)&CMemory_VRAM[((uint8*)SC1-&CMemory_VRAM[0])%0x10000]; + + if (PPU.BG[bg].SCSize & 2) + SC2 = SC1 + 1024; + else + SC2 = SC0; + + if(((uint8*)SC2-CMemory_VRAM)>=0x10000) + SC2-=0x08000; + + if (PPU.BG[bg].SCSize & 1) + SC3 = SC2 + 1024; + else + SC3 = SC2; + + if(((uint8*)SC3-CMemory_VRAM)>=0x10000) + SC3-=0x08000; + + + + int Lines; + int OffsetMask; + int OffsetShift; + + if (BG.TileSize == 16) + { + OffsetMask = 0x3ff; + OffsetShift = 4; + } + else + { + OffsetMask = 0x1ff; + OffsetShift = 3; + } +//static int cuantos=0; +//cuantos++; +//if (cuantos!=3) return; +//printf("BGMode=%i, Y=%i(%i) to %i\n",BGMode,(GFX.StartY&7?GFX.StartY-((GFX.StartY+8)&7):GFX.StartY),GFX.StartY,GFX.EndY); +#if 0 + //def USE_GL + for (uint32 Y = (GFX.StartY&7?GFX.StartY-((GFX.StartY+8)&7):GFX.StartY); Y <= GFX.EndY; Y += Lines) +#else + for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y += Lines) +#endif + { +//if (Y>0) { Lines=1; continue;} +//printf("%i Y=%i\n",cuantos,Y); + uint32 VOffset = LineData [Y].BG[bg].VOffset; + uint32 HOffset = LineData [Y].BG[bg].HOffset; + int VirtAlign = (Y + VOffset) & 7; +//printf("Y=%i, VOffset=%i, VirtAlign=%i, HOffset=%i\n",Y,VOffset,VirtAlign,HOffset); + + for (Lines = 1; Lines < 8 - VirtAlign; Lines++) + if ((VOffset != LineData [Y + Lines].BG[bg].VOffset) || + (HOffset != LineData [Y + Lines].BG[bg].HOffset)) + break; + + if (Y + Lines > GFX.EndY) + Lines = GFX.EndY + 1 - Y; + + VirtAlign <<= 3; +#ifdef USE_GL +// if (VirtAlign && Y) continue; +// if (Y+8>GFX.EndY) break; +#endif + + uint32 ScreenLine = (VOffset + Y) >> OffsetShift; + uint32 t1; + uint32 t2; + if (((VOffset + Y) & 15) > 7) + { + t1 = 16; + t2 = 0; + } + else + { + t1 = 0; + t2 = 16; + } + uint16 *b1; + uint16 *b2; + + if (ScreenLine & 0x20) + b1 = SC2, b2 = SC3; + else + b1 = SC0, b2 = SC1; + + b1 += (ScreenLine & 0x1f) << 5; + b2 += (ScreenLine & 0x1f) << 5; + + int clipcount = GFX.pCurrentClip->Count [bg]; + if (!clipcount) + clipcount = 1; + for (int clip = 0; clip < clipcount; clip++) + { + uint32 Left; + uint32 Right; + + if (!GFX.pCurrentClip->Count [bg]) + { + Left = 0; + Right = 256; + } + else + { + Left = GFX.pCurrentClip->Left [clip][bg]; + Right = GFX.pCurrentClip->Right [clip][bg]; + + if (Right <= Left) + continue; + } + + uint32 s = Left * GFX_PIXSIZE + getY2(Y); +//printf("s=%X (%i,%i), Left=%i, Y=%i\n",s,(((unsigned)s)&0xff),((unsigned)s)>>8,Left,Y); + uint32 HPos = (HOffset + Left) & OffsetMask; + + uint32 Quot = HPos >> 3; + uint32 Count = 0; + + uint16 *t; + if (BG.TileSize == 8) + { + if (Quot > 31) + t = b2 + (Quot & 0x1f); + else + t = b1 + Quot; + } + else + { + if (Quot > 63) + t = b2 + ((Quot >> 1) & 0x1f); + else + t = b1 + (Quot >> 1); + } + + Width = Right - Left; + // Left hand edge clipped tile + if (HPos & 7) + { + uint32 Offset = (HPos & 7); + Count = 8 - Offset; + if (Count > Width) + Count = Width; + s -= Offset * GFX_PIXSIZE; + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + +#if 1 + if (BG.TileSize == 8) + { + (*DrawClippedTilePtr) (Tile, s, Offset, Count, VirtAlign, + Lines); + } + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + (*DrawClippedTilePtr) (Tile + t1 + (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + (*DrawClippedTilePtr) (Tile + t2 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + else + { + // H flip only + (*DrawClippedTilePtr) (Tile + t1 + 1 - (Quot & 1), + s, Offset, Count, VirtAlign, Lines); + } + } + else + { + // V flip only + (*DrawClippedTilePtr) (Tile + t2 + (Quot & 1), s, + Offset, Count, VirtAlign, Lines); + } + } +#endif + + if (BG.TileSize == 8) + { + t++; + if (Quot == 31) + t = b2; + else if (Quot == 63) + t = b1; + } + else + { + t += Quot & 1; + if (Quot == 63) + t = b2; + else if (Quot == 127) + t = b1; + } + Quot++; + s += 8 * GFX_PIXSIZE; + } + + // Middle, unclipped tiles + Count = Width - Count; + int Middle = Count >> 3; + Count &= 7; + for (int C = Middle; C > 0; s += 8 * GFX_PIXSIZE, Quot++, C--) + { + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + +#if 1 + if (BG.TileSize != 8) + { + if (Tile & H_FLIP) + { + // Horizontal flip, but what about vertical flip ? + if (Tile & V_FLIP) + { + // Both horzontal & vertical flip + (*DrawTilePtr) (Tile + t2 + 1 - (Quot & 1), s, + VirtAlign, Lines); + } + else + { + // Horizontal flip only + (*DrawTilePtr) (Tile + t1 + 1 - (Quot & 1), s, + VirtAlign, Lines); + } + } + else + { + // No horizontal flip, but is there a vertical flip ? + if (Tile & V_FLIP) + { + // Vertical flip only + (*DrawTilePtr) (Tile + t2 + (Quot & 1), s, + VirtAlign, Lines); + } + else + { + // Normal unflipped + (*DrawTilePtr) (Tile + t1 + (Quot & 1), s, + VirtAlign, Lines); + } + } + } + else +#endif + { +//if ((C==7 && Y==79 && cuantos==1) || (C==12 && Y==63 && cuantos==2)) + (*DrawTilePtr) (Tile, s, VirtAlign, Lines); + } + + if (BG.TileSize == 8) + { + t++; + if (Quot == 31) + t = b2; + else + if (Quot == 63) + t = b1; + } + else + { + t += Quot & 1; + if (Quot == 63) + t = b2; + else + if (Quot == 127) + t = b1; + } + } + // Right-hand edge clipped tiles + if (Count) + { + Tile = READ_2BYTES(t); + GFX.Z1 = GFX.Z2 = depths [(Tile & 0x2000) >> 13]; + +#if 1 + if (BG.TileSize == 8) + (*DrawClippedTilePtr) (Tile, s, 0, Count, VirtAlign, + Lines); + else + { + if (!(Tile & (V_FLIP | H_FLIP))) + { + // Normal, unflipped + (*DrawClippedTilePtr) (Tile + t1 + (Quot & 1), s, 0, + Count, VirtAlign, Lines); + } + else if (Tile & H_FLIP) + { + if (Tile & V_FLIP) + { + // H & V flip + (*DrawClippedTilePtr) (Tile + t2 + 1 - (Quot & 1), + s, 0, Count, VirtAlign, + Lines); + } + else + { + // H flip only + (*DrawClippedTilePtr) (Tile + t1 + 1 - (Quot & 1), + s, 0, Count, VirtAlign, + Lines); + } + } + else + { + // V flip only + (*DrawClippedTilePtr) (Tile + t2 + (Quot & 1), + s, 0, Count, VirtAlign, + Lines); + } + } +#endif + } + } + } +} + +#ifdef DIRECT_COLOR_MAP +#define CHECK_DIRECTCOLOUR \ + if (GFX.r2130 & 1) \ + { \ + if (IPPU.DirectColourMapsNeedRebuild) \ + S9xBuildDirectColourMaps (); \ + GFX.ScreenColors = DirectColourMaps [0]; \ + } \ + else +#else +#define CHECK_DIRECTCOLOUR +#endif + +#define RENDER_BACKGROUND_MODE7(TYPE,FUNC) \ + CHECK_SOUND(); \ +\ + uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ +\ + int aa, cc; \ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + uint32 ClipCount = GFX.pCurrentClip->Count [bg]; \ +\ + if (!ClipCount) \ + ClipCount = 1; \ +\ + Screen += getY(GFX.StartY); \ + uint8 *Depth = GFX.DB + getY2(GFX.StartY); \ + struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ +\ + for (uint32 Line = GFX.StartY; Line <= GFX.EndY; Line++, Screen += SNES4ALL_SCREEN_PITCH, Depth += SNES4ALL_SCREEN_PITCH2, l++) \ + { \ + int yy; \ +\ + int32 HOffset = ((int32) LineData [Line].BG[0].HOffset << M7) >> M7; \ + int32 VOffset = ((int32) LineData [Line].BG[0].VOffset << M7) >> M7; \ +\ + int32 CentreX = ((int32) l->CentreX << M7) >> M7; \ + int32 CentreY = ((int32) l->CentreY << M7) >> M7; \ +\ + if (PPU.Mode7VFlip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ +\ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ +\ + int BB = l->MatrixB * yy + (CentreX << 8); \ + int DD = l->MatrixD * yy + (CentreY << 8); \ +\ + for (uint32 clip = 0; clip < ClipCount; clip++) \ + { \ + if (GFX.pCurrentClip->Count [bg]) \ + { \ + Left = GFX.pCurrentClip->Left [clip][bg]; \ + Right = GFX.pCurrentClip->Right [clip][bg]; \ + if (Right <= Left) \ + continue; \ + } \ + TYPE *p = (TYPE *) Screen + Left; \ + uint8 *d = Depth + Left; \ +\ + if (PPU.Mode7HFlip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ +\ + int xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = l->MatrixA * xx; \ + int CC = l->MatrixC * xx; \ +\ + if (!PPU.Mode7Repeat) \ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++, d++) \ + { \ + int X = ((AA + BB) >> 8) & 0x3ff; \ + int Y = ((CC + DD) >> 8) & 0x3ff; \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + *p = (FUNC); \ + *d = GFX.Z1; \ + } \ + } \ + } \ + else \ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++, d++) \ + { \ + int X = ((AA + BB) >> 8); \ + int Y = ((CC + DD) >> 8); \ +\ + if (!((X | Y) & ~0x3ff)) \ + { \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + *p = (FUNC); \ + *d = GFX.Z1; \ + } \ + } \ + else \ + { \ + if (PPU.Mode7Repeat == 3) \ + { \ + X = (x + HOffset) & 7; \ + Y = (yy + CentreY) & 7; \ + uint32 b = *(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + *p = (FUNC); \ + *d = GFX.Z1; \ + } \ + } \ + } \ + } \ + } \ + } \ + } + +#ifdef USE_GL + +static void DrawBGMode7Background16_nogl (uint8 *Screen, int bg) { RENDER_BACKGROUND_MODE7 (uint16, GFX.ScreenColors [b & GFX.Mode7Mask]); } + +#define RENDER_BACKGROUND_MODE7_GL(TYPE,FUNC) \ + videogl_used_screen=GFX.Z1=Mode7Depths[0]; \ + CHECK_SOUND(); \ +\ + const uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ +\ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + const uint32 repeat=PPU.Mode7Repeat; \ + const uint8 mask=GFX.Mode7Mask; \ + const uint32 endY=GFX.EndY; \ + const uint32 hflip=PPU.Mode7HFlip; \ + const uint32 vflip=PPU.Mode7VFlip; \ + const uint32 currentCount=GFX.pCurrentClip->Count [bg]; \ +\ + Screen += getY(GFX.StartY); \ + const struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ +\ + for (uint32 Line = GFX.StartY; Line <= endY; Line++, Screen += SNES4ALL_SCREEN_PITCH, l++) \ + { \ + int yy; \ +\ + const int32 HOffset = ((int32) LineData [Line].BG[0].HOffset << M7) >> M7; \ + const int32 VOffset = ((int32) LineData [Line].BG[0].VOffset << M7) >> M7; \ +\ + const int32 CentreX = ((int32) l->CentreX << M7) >> M7; \ + const int32 CentreY = ((int32) l->CentreY << M7) >> M7; \ +\ + if (vflip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ +\ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ +\ + const int BB = l->MatrixB * yy + (CentreX << 8); \ + const int DD = l->MatrixD * yy + (CentreY << 8); \ +\ + for (uint32 clip = 0; clip < currentCount; clip++) \ + { \ + { \ + Left = GFX.pCurrentClip->Left [clip][bg]; \ + Right = GFX.pCurrentClip->Right [clip][bg]; \ + if (Right <= Left) \ + continue; \ + } \ + TYPE *p = (TYPE *) Screen + Left; \ + int aa, cc; \ +\ + if (hflip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ +\ + const int xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = (l->MatrixA * xx) + BB; \ + int CC = (l->MatrixC * xx) + DD; \ +\ + if (!repeat) \ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8) & 0x3ff; \ + const int Y = ((CC) >> 8) & 0x3ff; \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + } \ + else \ + { \ + if (repeat==3) { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8); \ + const int Y = ((CC) >> 8); \ + if (!((X | Y) & ~0x3ff)) \ + { \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + else \ + { \ + const int X = (x + HOffset) & 7; \ + const int Y = (yy + CentreY) & 7; \ + const uint8 b = mask & (*(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + } \ + } else { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8); \ + const int Y = ((CC) >> 8); \ + if (!((X | Y) & ~0x3ff)) \ + { \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } else { \ + const uint8 b = 0; \ + *p = (FUNC); \ + } \ + } \ + } \ + } \ + } \ + } +static void DrawBGMode7Background16_gl (uint8 *Screen, int bg) { + const unsigned short back_zero=IPPU.ScreenColors[0]; + IPPU.ScreenColors[0]=0; + RENDER_BACKGROUND_MODE7_GL (uint16, GFX.ScreenColors [b]) + IPPU.ScreenColors[0]=back_zero; + videogl_screen_endY=GFX.EndY; +} + +#define RENDER_BACKGROUND_MODE7_GL_noclip_repeat0(TYPE,FUNC) \ + videogl_used_screen=GFX.Z1=Mode7Depths[0]; \ + CHECK_SOUND(); \ +\ + const uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ +\ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + const uint8 mask=GFX.Mode7Mask; \ + const uint32 endY=GFX.EndY; \ + const uint32 hflip=PPU.Mode7HFlip; \ + const uint32 vflip=PPU.Mode7VFlip; \ +\ + Screen += getY(GFX.StartY); \ + const struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ +\ + for (uint32 Line = GFX.StartY; Line <= endY; Line++, Screen += SNES4ALL_SCREEN_PITCH, l++) \ + { \ + int yy; \ +\ + const int32 HOffset = ((int32) LineData [Line].BG[0].HOffset << M7) >> M7; \ + const int32 VOffset = ((int32) LineData [Line].BG[0].VOffset << M7) >> M7; \ +\ + const int32 CentreX = ((int32) l->CentreX << M7) >> M7; \ + const int32 CentreY = ((int32) l->CentreY << M7) >> M7; \ +\ + if (vflip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ +\ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ +\ + const int BB = l->MatrixB * yy + (CentreX << 8); \ + const int DD = l->MatrixD * yy + (CentreY << 8); \ +\ + TYPE *p = (TYPE *) Screen + Left; \ + int aa, cc; \ +\ + if (hflip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ +\ + const int xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = (l->MatrixA * xx) + BB; \ + int CC = (l->MatrixC * xx) + DD; \ +\ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8) & 0x3ff; \ + const int Y = ((CC) >> 8) & 0x3ff; \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + } +static void DrawBGMode7Background16_gl_noclip_repeat0 (uint8 *Screen, int bg) { + const unsigned short back_zero=IPPU.ScreenColors[0]; + IPPU.ScreenColors[0]=0; + RENDER_BACKGROUND_MODE7_GL_noclip_repeat0 (uint16, GFX.ScreenColors [b]) + IPPU.ScreenColors[0]=back_zero; + videogl_screen_endY=GFX.EndY; +} + +#define RENDER_BACKGROUND_MODE7_GL_noclip_repeat3(TYPE,FUNC) \ + videogl_used_screen=GFX.Z1=Mode7Depths[0]; \ + CHECK_SOUND(); \ +\ + const uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ +\ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + const uint8 mask=GFX.Mode7Mask; \ + const uint32 endY=GFX.EndY; \ + const uint32 hflip=PPU.Mode7HFlip; \ + const uint32 vflip=PPU.Mode7VFlip; \ +\ + Screen += getY(GFX.StartY); \ + const struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ +\ + for (uint32 Line = GFX.StartY; Line <= endY; Line++, Screen += SNES4ALL_SCREEN_PITCH, l++) \ + { \ + int yy; \ +\ + const int32 HOffset = ((int32) LineData [Line].BG[0].HOffset << M7) >> M7; \ + const int32 VOffset = ((int32) LineData [Line].BG[0].VOffset << M7) >> M7; \ +\ + const int32 CentreX = ((int32) l->CentreX << M7) >> M7; \ + const int32 CentreY = ((int32) l->CentreY << M7) >> M7; \ +\ + if (vflip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ +\ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ +\ + const int BB = l->MatrixB * yy + (CentreX << 8); \ + const int DD = l->MatrixD * yy + (CentreY << 8); \ +\ + { \ + TYPE *p = (TYPE *) Screen + Left; \ + int aa, cc; \ +\ + if (hflip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ +\ + const int xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = (l->MatrixA * xx) + BB; \ + int CC = (l->MatrixC * xx) + DD; \ +\ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8); \ + const int Y = ((CC) >> 8); \ + if (!((X | Y) & ~0x3ff)) \ + { \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + else \ + { \ + const int X = (x + HOffset) & 7; \ + const int Y = (yy + CentreY) & 7; \ + const uint8 b = mask & (*(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } \ + } \ + } \ + } \ + } +static void DrawBGMode7Background16_gl_noclip_repeat3 (uint8 *Screen, int bg) { + unsigned short back_zero=IPPU.ScreenColors[0]; + IPPU.ScreenColors[0]=0; + RENDER_BACKGROUND_MODE7_GL_noclip_repeat3 (uint16, GFX.ScreenColors [b]) + IPPU.ScreenColors[0]=back_zero; + videogl_screen_endY=GFX.EndY; +} + +#define RENDER_BACKGROUND_MODE7_GL_noclip(TYPE,FUNC) \ + videogl_used_screen=GFX.Z1=Mode7Depths[0]; \ + CHECK_SOUND(); \ +\ + const uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ +\ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + const uint32 repeat=PPU.Mode7Repeat; \ + const uint8 mask=GFX.Mode7Mask; \ + const uint32 endY=GFX.EndY; \ + const uint32 hflip=PPU.Mode7HFlip; \ + const uint32 vflip=PPU.Mode7VFlip; \ +\ + Screen += getY(GFX.StartY); \ + const struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ +\ + for (uint32 Line = GFX.StartY; Line <= endY; Line++, Screen += SNES4ALL_SCREEN_PITCH, l++) \ + { \ + int yy; \ +\ + const int32 HOffset = ((int32) LineData [Line].BG[0].HOffset << M7) >> M7; \ + const int32 VOffset = ((int32) LineData [Line].BG[0].VOffset << M7) >> M7; \ +\ + const int32 CentreX = ((int32) l->CentreX << M7) >> M7; \ + const int32 CentreY = ((int32) l->CentreY << M7) >> M7; \ +\ + if (vflip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ +\ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ +\ + const int BB = l->MatrixB * yy + (CentreX << 8); \ + const int DD = l->MatrixD * yy + (CentreY << 8); \ +\ + { \ + TYPE *p = (TYPE *) Screen + Left; \ + int aa, cc; \ +\ + if (hflip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ +\ + const int xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA = (l->MatrixA * xx) + BB; \ + int CC = (l->MatrixC * xx) + DD; \ +\ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++) \ + { \ + const int X = ((AA) >> 8); \ + const int Y = ((CC) >> 8); \ + if (!((X | Y) & ~0x3ff)) \ + { \ + const uint8 b = mask & (*( ((uint8 *)(VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7))) + ((Y & 7) << 4) + ((X & 7) << 1))); \ + *p = (FUNC); \ + } else { \ + const uint8 b = 0; \ + *p = (FUNC); \ + } \ + } \ + } \ + } \ + } +static void DrawBGMode7Background16_gl_noclip (uint8 *Screen, int bg) { + unsigned short back_zero=IPPU.ScreenColors[0]; + IPPU.ScreenColors[0]=0; + RENDER_BACKGROUND_MODE7_GL_noclip (uint16, GFX.ScreenColors [b]) + IPPU.ScreenColors[0]=back_zero; + videogl_screen_endY=GFX.EndY; +} + +static __inline__ void DrawBGMode7Background16 (uint8 *Screen, int bg) { + if (videogl_hw_render) { +/* + extern bool8 backRenderThisFrame; + if (!backRenderThisFrame) { + videogl_screen_endY=GFX.EndY; + videogl_used_screen=GFX.Z1=Mode7Depths[0]; + return; + } +*/ + if (GFX.pCurrentClip->Count [bg]) { + DrawBGMode7Background16_gl(Screen,bg); + return; + } else { + switch(PPU.Mode7Repeat){ + case 0: DrawBGMode7Background16_gl_noclip_repeat0(Screen,bg); return; + case 3: DrawBGMode7Background16_gl_noclip_repeat3(Screen,bg); return; + default: DrawBGMode7Background16_gl_noclip(Screen,bg); return; + } + } + } + DrawBGMode7Background16_nogl(Screen,bg); +} + +#else + +static void DrawBGMode7Background16 (uint8 *Screen, int bg) { + RENDER_BACKGROUND_MODE7 (uint16, GFX.ScreenColors [b & GFX.Mode7Mask]); +} +#endif + +#if defined(USE_MODE7_TRANS) || !defined(USE_GL) +static void DrawBGMode7Background16Add (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_ADD (GFX.ScreenColors [b & GFX.Mode7Mask], + p [GFX.Delta]) : + COLOR_ADD (GFX.ScreenColors [b & GFX.Mode7Mask], + GFX.FixedColour)) : + GFX.ScreenColors [b & GFX.Mode7Mask]); +} + +static void DrawBGMode7Background16Add1_2 (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_ADD1_2 (GFX.ScreenColors [b & GFX.Mode7Mask], + p [GFX.Delta]) : + COLOR_ADD (GFX.ScreenColors [b & GFX.Mode7Mask], + GFX.FixedColour)) : + GFX.ScreenColors [b & GFX.Mode7Mask]); +} + +static void DrawBGMode7Background16Sub (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_SUB (GFX.ScreenColors [b & GFX.Mode7Mask], + p [GFX.Delta]) : + COLOR_SUB (GFX.ScreenColors [b & GFX.Mode7Mask], + GFX.FixedColour)) : + GFX.ScreenColors [b & GFX.Mode7Mask]); +} + +static void DrawBGMode7Background16Sub1_2 (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7 (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_SUB1_2 (GFX.ScreenColors [b & GFX.Mode7Mask], + p [GFX.Delta]) : + COLOR_SUB (GFX.ScreenColors [b & GFX.Mode7Mask], + GFX.FixedColour)) : + GFX.ScreenColors [b & GFX.Mode7Mask]); +} +#endif + +#define RENDER_BACKGROUND_MODE7_i(TYPE,FUNC,COLORFUNC) \ + CHECK_SOUND(); \ +\ + uint8 *VRAM1 = CMemory_VRAM + 1; \ + CHECK_DIRECTCOLOUR \ + GFX.ScreenColors = IPPU.ScreenColors; \ + \ + int aa, cc; \ + int dir; \ + int startx, endx; \ + uint32 Left = 0; \ + uint32 Right = 256; \ + uint32 ClipCount = GFX.pCurrentClip->Count [bg]; \ + \ + if (!ClipCount) \ + ClipCount = 1; \ + \ + Screen += getY(GFX.StartY); \ + uint8 *Depth = GFX.DB + getY2(GFX.StartY); \ + struct SLineMatrixData *l = &LineMatrixData [GFX.StartY]; \ + bool8 allowSimpleCase = FALSE; \ + if (!l->MatrixB && !l->MatrixC && (l->MatrixA == 0x0100) && (l->MatrixD == 0x0100) \ + && !LineMatrixData[GFX.EndY].MatrixB && !LineMatrixData[GFX.EndY].MatrixC \ + && (LineMatrixData[GFX.EndY].MatrixA == 0x0100) && (LineMatrixData[GFX.EndY].MatrixD == 0x0100) \ + ) \ + allowSimpleCase = TRUE; \ + \ + for (uint32 Line = GFX.StartY; Line <= GFX.EndY; Line++, Screen += SNES4ALL_SCREEN_PITCH, Depth += SNES4ALL_SCREEN_PITCH2, l++) \ + { \ + int yy; \ + \ + int HOffset = ((int) LineData [Line].BG[0].HOffset << M7) >> M7; \ + int VOffset = ((int) LineData [Line].BG[0].VOffset << M7) >> M7; \ + \ + int CentreX = ((int) l->CentreX << M7) >> M7; \ + int CentreY = ((int) l->CentreY << M7) >> M7; \ + \ + if (PPU.Mode7VFlip) \ + yy = 255 - (int) Line; \ + else \ + yy = Line; \ + \ + \ + yy += CLIP_10_BIT_SIGNED(VOffset - CentreY); \ + bool8 simpleCase = FALSE; \ + int BB; \ + int DD; \ + /* Make a special case for the identity matrix, since it's a common case and */ \ + /* can be done much more quickly without special effects */ \ + if (allowSimpleCase && !l->MatrixB && !l->MatrixC && (l->MatrixA == 0x0100) && (l->MatrixD == 0x0100)) \ + { \ + BB = CentreX << 8; \ + DD = (yy + CentreY) << 8; \ + simpleCase = TRUE; \ + } \ + else \ + { \ + BB = l->MatrixB * yy + (CentreX << 8); \ + DD = l->MatrixD * yy + (CentreY << 8); \ + } \ + \ + for (uint32 clip = 0; clip < ClipCount; clip++) \ + { \ + if (GFX.pCurrentClip->Count [bg]) \ + { \ + Left = GFX.pCurrentClip->Left [clip][bg]; \ + Right = GFX.pCurrentClip->Right [clip][bg]; \ + if (Right <= Left) \ + continue; \ + } \ + TYPE *p = (TYPE *) Screen + Left; \ + uint8 *d = Depth + Left; \ + \ + if (PPU.Mode7HFlip) \ + { \ + startx = Right - 1; \ + endx = Left - 1; \ + dir = -1; \ + aa = -l->MatrixA; \ + cc = -l->MatrixC; \ + } \ + else \ + { \ + startx = Left; \ + endx = Right; \ + dir = 1; \ + aa = l->MatrixA; \ + cc = l->MatrixC; \ + } \ + int xx; \ + \ + xx = startx + CLIP_10_BIT_SIGNED(HOffset - CentreX); \ + int AA, CC = 0; \ + if (simpleCase) \ + { \ + AA = xx << 8; \ + } \ + else \ + { \ + AA = l->MatrixA * xx; \ + CC = l->MatrixC * xx; \ + } \ + if (simpleCase) \ + { \ + if (!PPU.Mode7Repeat) \ + { \ + int x = startx; \ + do \ + { \ + int X = ((AA + BB) >> 8) & 0x3ff; \ + int Y = (DD >> 8) & 0x3ff; \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + TYPE theColor = COLORFUNC; \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + AA += aa, p++, d++; \ + x += dir; \ + } while (x != endx); \ + } \ + else \ + { \ + int x = startx; \ + do { \ + int X = (AA + BB) >> 8; \ + int Y = DD >> 8; \ +\ + if (!((X | Y) & ~0x3ff)) \ + { \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + TYPE theColor = COLORFUNC; \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + else if (PPU.Mode7Repeat == 3) \ + { \ + X = (x + HOffset) & 7; \ + Y = (yy + CentreY) & 7; \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + TYPE theColor = COLORFUNC; \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + AA += aa; p++; d++; \ + x += dir; \ + } while (x != endx); \ + } \ + } \ + else if (!PPU.Mode7Repeat) \ + { \ + /* The bilinear interpolator: get the colors at the four points surrounding */ \ + /* the location of one point in the _sampled_ image, and weight them according */ \ + /* to their (city block) distance. It's very smooth, but blurry with "close up" */ \ + /* points. */ \ + \ + /* 460 (slightly less than 2 source pixels per displayed pixel) is an educated */ \ + /* guess for where bilinear filtering will become a poor method for averaging. */ \ + /* (When reducing the image, the weighting used by a bilinear filter becomes */ \ + /* arbitrary, and a simple mean is a better way to represent the source image.) */ \ + /* You can think of this as a kind of mipmapping. */ \ + if ((aa < 460 && aa > -460) && (cc < 460 && cc > -460)) \ + {\ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++, d++) \ + { \ + uint32 xPos = AA + BB; \ + uint32 xPix = xPos >> 8; \ + uint32 yPos = CC + DD; \ + uint32 yPix = yPos >> 8; \ + uint32 X = xPix & 0x3ff; \ + uint32 Y = yPix & 0x3ff; \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + /* X10 and Y01 are the X and Y coordinates of the next source point over. */ \ + uint32 X10 = (xPix + dir) & 0x3ff; \ + uint32 Y01 = (yPix + (PPU.Mode7VFlip?-1:1)) & 0x3ff; \ + uint8 *TileData10 = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X10 >> 2) & ~1)] << 7); \ + uint8 *TileData11 = VRAM1 + (CMemory_VRAM[((Y01 & ~7) << 5) + ((X10 >> 2) & ~1)] << 7); \ + uint8 *TileData01 = VRAM1 + (CMemory_VRAM[((Y01 & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 p1 = COLORFUNC; \ + p1 = (p1 & FIRST_THIRD_COLOR_MASK) | ((p1 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData10 + ((Y & 7) << 4) + ((X10 & 7) << 1)); \ + uint32 p2 = COLORFUNC; \ + p2 = (p2 & FIRST_THIRD_COLOR_MASK) | ((p2 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData11 + ((Y01 & 7) << 4) + ((X10 & 7) << 1)); \ + uint32 p4 = COLORFUNC; \ + p4 = (p4 & FIRST_THIRD_COLOR_MASK) | ((p4 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData01 + ((Y01 & 7) << 4) + ((X & 7) << 1)); \ + uint32 p3 = COLORFUNC; \ + p3 = (p3 & FIRST_THIRD_COLOR_MASK) | ((p3 & SECOND_COLOR_MASK) << 16); \ + /* Xdel, Ydel: position (in 1/32nds) between the points */ \ + uint32 Xdel = (xPos >> 3) & 0x1F; \ + uint32 Ydel = (yPos >> 3) & 0x1F; \ + uint32 XY = (Xdel*Ydel) >> 5; \ + uint32 area1 = 0x20 + XY - Xdel - Ydel; \ + uint32 area2 = Xdel - XY; \ + uint32 area3 = Ydel - XY; \ + uint32 area4 = XY; \ + if(PPU.Mode7HFlip){ \ + uint32 tmp=area1; area1=area2; area2=tmp; \ + tmp=area3; area3=area4; area4=tmp; \ + } \ + if(PPU.Mode7VFlip){ \ + uint32 tmp=area1; area1=area3; area3=tmp; \ + tmp=area2; area2=area4; area4=tmp; \ + } \ + uint32 tempColor = ((area1 * p1) + \ + (area2 * p2) + \ + (area3 * p3) + \ + (area4 * p4)) >> 5; \ + TYPE theColor = (tempColor & FIRST_THIRD_COLOR_MASK) | ((tempColor >> 16) & SECOND_COLOR_MASK); \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + } \ + else \ + /* The oversampling method: get the colors at four corners of a square */ \ + /* in the _displayed_ image, and average them. It's sharp and clean, but */ \ + /* gives the usual huge pixels when the source image gets "close." */ \ + { \ + /* Find the dimensions of the square in the source image whose corners will be examined. */ \ + uint32 aaDelX = aa >> 1; \ + uint32 ccDelX = cc >> 1; \ + uint32 bbDelY = l->MatrixB >> 1; \ + uint32 ddDelY = l->MatrixD >> 1; \ + /* Offset the location within the source image so that the four sampled points */ \ + /* center around where the single point would otherwise have been drawn. */ \ + BB -= (bbDelY >> 1); \ + DD -= (ddDelY >> 1); \ + AA -= (aaDelX >> 1); \ + CC -= (ccDelX >> 1); \ + uint32 BB10 = BB + aaDelX; \ + uint32 BB01 = BB + bbDelY; \ + uint32 BB11 = BB + aaDelX + bbDelY; \ + uint32 DD10 = DD + ccDelX; \ + uint32 DD01 = DD + ddDelY; \ + uint32 DD11 = DD + ccDelX + ddDelY; \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++, d++) \ + { \ + uint32 X = ((AA + BB) >> 8) & 0x3ff; \ + uint32 Y = ((CC + DD) >> 8) & 0x3ff; \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + /* X, Y, X10, Y10, etc. are the coordinates of the four pixels within the */ \ + /* source image that we're going to examine. */ \ + uint32 X10 = ((AA + BB10) >> 8) & 0x3ff; \ + uint32 Y10 = ((CC + DD10) >> 8) & 0x3ff; \ + uint32 X01 = ((AA + BB01) >> 8) & 0x3ff; \ + uint32 Y01 = ((CC + DD01) >> 8) & 0x3ff; \ + uint32 X11 = ((AA + BB11) >> 8) & 0x3ff; \ + uint32 Y11 = ((CC + DD11) >> 8) & 0x3ff; \ + uint8 *TileData10 = VRAM1 + (CMemory_VRAM[((Y10 & ~7) << 5) + ((X10 >> 2) & ~1)] << 7); \ + uint8 *TileData01 = VRAM1 + (CMemory_VRAM[((Y01 & ~7) << 5) + ((X01 >> 2) & ~1)] << 7); \ + uint8 *TileData11 = VRAM1 + (CMemory_VRAM[((Y11 & ~7) << 5) + ((X11 >> 2) & ~1)] << 7); \ + TYPE p1 = COLORFUNC; \ + b = *(TileData10 + ((Y10 & 7) << 4) + ((X10 & 7) << 1)); \ + TYPE p2 = COLORFUNC; \ + b = *(TileData01 + ((Y01 & 7) << 4) + ((X01 & 7) << 1)); \ + TYPE p3 = COLORFUNC; \ + b = *(TileData11 + ((Y11 & 7) << 4) + ((X11 & 7) << 1)); \ + TYPE p4 = COLORFUNC; \ + TYPE theColor = Q_INTERPOLATE(p1, p2, p3, p4); \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + } \ + } \ + else \ + { \ + for (int x = startx; x != endx; x += dir, AA += aa, CC += cc, p++, d++) \ + { \ + uint32 xPos = AA + BB; \ + uint32 xPix = xPos >> 8; \ + uint32 yPos = CC + DD; \ + uint32 yPix = yPos >> 8; \ + uint32 X = xPix; \ + uint32 Y = yPix; \ + \ +\ + if (!((X | Y) & ~0x3ff)) \ + { \ + uint8 *TileData = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 b = *(TileData + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + /* X10 and Y01 are the X and Y coordinates of the next source point over. */ \ + uint32 X10 = (xPix + dir) & 0x3ff; \ + uint32 Y01 = (yPix + dir) & 0x3ff; \ + uint8 *TileData10 = VRAM1 + (CMemory_VRAM[((Y & ~7) << 5) + ((X10 >> 2) & ~1)] << 7); \ + uint8 *TileData11 = VRAM1 + (CMemory_VRAM[((Y01 & ~7) << 5) + ((X10 >> 2) & ~1)] << 7); \ + uint8 *TileData01 = VRAM1 + (CMemory_VRAM[((Y01 & ~7) << 5) + ((X >> 2) & ~1)] << 7); \ + uint32 p1 = COLORFUNC; \ + p1 = (p1 & FIRST_THIRD_COLOR_MASK) | ((p1 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData10 + ((Y & 7) << 4) + ((X10 & 7) << 1)); \ + uint32 p2 = COLORFUNC; \ + p2 = (p2 & FIRST_THIRD_COLOR_MASK) | ((p2 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData11 + ((Y01 & 7) << 4) + ((X10 & 7) << 1)); \ + uint32 p4 = COLORFUNC; \ + p4 = (p4 & FIRST_THIRD_COLOR_MASK) | ((p4 & SECOND_COLOR_MASK) << 16); \ + b = *(TileData01 + ((Y01 & 7) << 4) + ((X & 7) << 1)); \ + uint32 p3 = COLORFUNC; \ + p3 = (p3 & FIRST_THIRD_COLOR_MASK) | ((p3 & SECOND_COLOR_MASK) << 16); \ + /* Xdel, Ydel: position (in 1/32nds) between the points */ \ + uint32 Xdel = (xPos >> 3) & 0x1F; \ + uint32 Ydel = (yPos >> 3) & 0x1F; \ + uint32 XY = (Xdel*Ydel) >> 5; \ + uint32 area1 = 0x20 + XY - Xdel - Ydel; \ + uint32 area2 = Xdel - XY; \ + uint32 area3 = Ydel - XY; \ + uint32 area4 = XY; \ + uint32 tempColor = ((area1 * p1) + \ + (area2 * p2) + \ + (area3 * p3) + \ + (area4 * p4)) >> 5; \ + TYPE theColor = (tempColor & FIRST_THIRD_COLOR_MASK) | ((tempColor >> 16) & SECOND_COLOR_MASK); \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + else \ + { \ + if (PPU.Mode7Repeat == 3) \ + { \ + X = (x + HOffset) & 7; \ + Y = (yy + CentreY) & 7; \ + uint32 b = *(VRAM1 + ((Y & 7) << 4) + ((X & 7) << 1)); \ + GFX.Z1 = Mode7Depths [(b & GFX.Mode7PriorityMask) >> 7]; \ + if (GFX.Z1 > *d && (b & GFX.Mode7Mask) ) \ + { \ + TYPE theColor = COLORFUNC; \ + *p = (FUNC) | ALPHA_BITS_MASK; \ + *d = GFX.Z1; \ + } \ + } \ + } \ + } \ + } \ + } \ + } + +#ifdef USE_MODE7_INTERPOLATE + +static uint32 Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) +{ + register uint32 x = ((A >> 2) & HIGH_BITS_SHIFTED_TWO_MASK) + + ((B >> 2) & HIGH_BITS_SHIFTED_TWO_MASK) + + ((C >> 2) & HIGH_BITS_SHIFTED_TWO_MASK) + + ((D >> 2) & HIGH_BITS_SHIFTED_TWO_MASK); + register uint32 y = (A & TWO_LOW_BITS_MASK) + + (B & TWO_LOW_BITS_MASK) + + (C & TWO_LOW_BITS_MASK) + + (D & TWO_LOW_BITS_MASK); + y = (y>>2) & TWO_LOW_BITS_MASK; + return x+y; +} + +static void DrawBGMode7Background16_i (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7_i (uint16, theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); +} + +static void DrawBGMode7Background16Add_i (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + (COLOR_ADD (theColor, + p [GFX.Delta])) : + (COLOR_ADD (theColor, + GFX.FixedColour))) : + theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); +} + +static void DrawBGMode7Background16Add1_2_i (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_ADD1_2 (theColor, + p [GFX.Delta]) : + COLOR_ADD (theColor, + GFX.FixedColour)) : + theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); +} + +static void DrawBGMode7Background16Sub_i (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_SUB (theColor, + p [GFX.Delta]) : + COLOR_SUB (theColor, + GFX.FixedColour)) : + theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); +} + +static void DrawBGMode7Background16Sub1_2_i (uint8 *Screen, int bg) +{ + RENDER_BACKGROUND_MODE7_i (uint16, *(d + GFX.DepthDelta) ? + (*(d + GFX.DepthDelta) != 1 ? + COLOR_SUB1_2 (theColor, + p [GFX.Delta]) : + COLOR_SUB (theColor, + GFX.FixedColour)) : + theColor, (GFX.ScreenColors[b & GFX.Mode7Mask])); +} +#endif + +#define _BUILD_SETUP(F) \ +GFX.BuildPixel = BuildPixel##F; \ +GFX.BuildPixel2 = BuildPixel2##F; \ +GFX.DecomposePixel = DecomposePixel##F; \ +RED_LOW_BIT_MASK = RED_LOW_BIT_MASK_##F; \ +GREEN_LOW_BIT_MASK = GREEN_LOW_BIT_MASK_##F; \ +BLUE_LOW_BIT_MASK = BLUE_LOW_BIT_MASK_##F; \ +RED_HI_BIT_MASK = RED_HI_BIT_MASK_##F; \ +GREEN_HI_BIT_MASK = GREEN_HI_BIT_MASK_##F; \ +BLUE_HI_BIT_MASK = BLUE_HI_BIT_MASK_##F; \ +MAX_RED = MAX_RED_##F; \ +MAX_GREEN = MAX_GREEN_##F; \ +MAX_BLUE = MAX_BLUE_##F; \ +GREEN_HI_BIT = ((MAX_GREEN_##F + 1) >> 1); \ +SPARE_RGB_BIT_MASK = SPARE_RGB_BIT_MASK_##F; \ +RGB_LOW_BITS_MASK = (RED_LOW_BIT_MASK_##F | \ + GREEN_LOW_BIT_MASK_##F | \ + BLUE_LOW_BIT_MASK_##F); \ +RGB_HI_BITS_MASK = (RED_HI_BIT_MASK_##F | \ + GREEN_HI_BIT_MASK_##F | \ + BLUE_HI_BIT_MASK_##F); \ +RGB_HI_BITS_MASKx2 = ((RED_HI_BIT_MASK_##F | \ + GREEN_HI_BIT_MASK_##F | \ + BLUE_HI_BIT_MASK_##F) << 1); \ +RGB_REMOVE_LOW_BITS_MASK = ~RGB_LOW_BITS_MASK; \ +FIRST_COLOR_MASK = FIRST_COLOR_MASK_##F; \ +SECOND_COLOR_MASK = SECOND_COLOR_MASK_##F; \ +THIRD_COLOR_MASK = THIRD_COLOR_MASK_##F; \ +ALPHA_BITS_MASK = ALPHA_BITS_MASK_##F; \ +FIRST_THIRD_COLOR_MASK = FIRST_COLOR_MASK | THIRD_COLOR_MASK; \ +TWO_LOW_BITS_MASK = RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1); \ +HIGH_BITS_SHIFTED_TWO_MASK = (( (FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & \ + ~TWO_LOW_BITS_MASK ) >> 2); + +void RenderScreen (uint8 *Screen, bool8 sub, bool8 force_no_add, uint8 D) +{ +//printf("RenderScreen(%i,%i,%i)\n",sub,force_no_add,D); + bool8 BG0; + bool8 BG1; + bool8 BG2; + bool8 BG3; + bool8 OB; + + GFX.S = Screen; + + if (!sub) + { + GFX.pCurrentClip = &IPPU.Clip [0]; + BG0 = ON_MAIN (0); + BG1 = ON_MAIN (1); + BG2 = ON_MAIN (2); + BG3 = (ON_MAIN (3))&&(!PPU.BGMode); + OB = ON_MAIN (4); + } + else + { + GFX.pCurrentClip = &IPPU.Clip [1]; + BG0 = ON_SUB (0); + BG1 = ON_SUB (1); + BG2 = ON_SUB (2); + BG3 = (ON_SUB (3))&&(!PPU.BGMode); + OB = ON_SUB (4); + } + + sub |= force_no_add; + +//printf("BGMode=%i: OB=%i, BG0=%i, BG1=%i, BG2=%i, BG3=%i\n",PPU.BGMode,OB,BG0,BG1,BG2,BG3 && !PPU.BGMode); + if (PPU.BGMode <= 1) + { + if (OB) + { +#ifdef USE_GL + if (videogl_hw_render) + SelectTileRenderer (sub || !ON_SUB(4)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(4)); + DrawOBJS (!sub, D); + } + if (BG0) + { +#ifdef USE_GL + if (videogl_hw_render && (BG1 || BG2 || BG3)) + SelectTileRenderer (sub || !ON_SUB(0)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(0)); + DrawBackground (PPU.BGMode, 0, D + 10, D + 14); + } + if (BG1) + { +#ifdef USE_GL + if (videogl_hw_render && (BG2 || BG3)) + SelectTileRenderer (sub || !ON_SUB(1)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(1)); + DrawBackground (PPU.BGMode, 1, D + 9, D + 13); + } + if (BG2) + { +#ifdef USE_GL + if (videogl_hw_render && BG3) + SelectTileRenderer (sub || !ON_SUB(2)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(2)); + DrawBackground (PPU.BGMode, 2, D + 3, + PPU.BG3Priority ? D + 17 : D + 6); + } + if (BG3) + { +#ifdef USE_GL + if (videogl_hw_render && (BG2 || BG1 || BG0) ) + SelectTileRenderer (sub || !ON_SUB(3)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(3)); + DrawBackground (PPU.BGMode, 3, D + 2, D + 5); + } + } + else if (PPU.BGMode != 7) + { + BG1 = BG1 && (PPU.BGMode != 6); + if (OB) + { +#ifdef USE_GL + if (videogl_hw_render) + SelectTileRenderer (sub || !ON_SUB(4)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(4)); + DrawOBJS (!sub, D); + } + if (BG0) + { +#ifdef USE_GL + if (videogl_hw_render && BG1) + SelectTileRenderer (sub || !ON_SUB(0)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(0)); + DrawBackground (PPU.BGMode, 0, D + 5, D + 13); + } + if (BG1) + { +#ifdef USE_GL + if (videogl_hw_render && (BG0 || OB)) + SelectTileRenderer (sub || !ON_SUB(1)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(1)); + DrawBackground (PPU.BGMode, 1, D + 2, D + 9); + } + } + else + { + if (OB) + { +#ifdef USE_GL + if (videogl_hw_render) + SelectTileRenderer (sub || !ON_SUB(4)); + else +#endif + SelectTileRenderer (sub || !SUB_OR_ADD(4)); + DrawOBJS (!sub, D); + } + if (BG0 || ((CMemory_FillRAM [0x2133] & 0x40) && BG1)) + { + int bg; + + if ((CMemory_FillRAM [0x2133] & 0x40)&&BG1) + { + GFX.Mode7Mask = 0x7f; + GFX.Mode7PriorityMask = 0x80; + Mode7Depths [0] = (BG0?5:1) + D; + Mode7Depths [1] = 9 + D; + bg = 1; + } + else + { + GFX.Mode7Mask = 0xff; + GFX.Mode7PriorityMask = 0; + Mode7Depths [0] = 5 + D; + Mode7Depths [1] = 5 + D; + bg = 0; + } +#if defined(USE_MODE7_TRANS) || !defined(USE_GL) + if (sub || !SUB_OR_ADD(0)) + { +#ifndef USE_MODE7_INTERPOLATE + DrawBGMode7Background16 (Screen, bg); +#else + DrawBGMode7Background16_i (Screen, bg); +#endif + } + else + { + if (GFX.r2131 & 0x80) + { + if (GFX.r2131 & 0x40) + { +#ifndef USE_MODE7_INTERPOLATE + DrawBGMode7Background16Sub1_2 (Screen, bg); +#else + DrawBGMode7Background16Sub1_2_i (Screen, bg); +#endif + } + else + { +#ifndef USE_MODE7_INTERPOLATE + DrawBGMode7Background16Sub (Screen, bg); +#else + DrawBGMode7Background16Sub_i (Screen, bg); +#endif + } + } + else + { + if (GFX.r2131 & 0x40) + { +#ifndef USE_MODE7_INTERPOLATE + DrawBGMode7Background16Add1_2 (Screen, bg); +#else + DrawBGMode7Background16Add1_2_i (Screen, bg); +#endif + } + else + { +#ifndef USE_MODE7_INTERPOLATE + DrawBGMode7Background16Add (Screen, bg); +#else + DrawBGMode7Background16Add_i (Screen, bg); +#endif + } + } + } +#else +// ZeroMemory((uint32 *) (GFX.Screen + getY(GFX.StartY)),SNES4ALL_SCREEN_PITCH*(GFX.EndY-GFX.StartY-1)); + DrawBGMode7Background16 (GFX.Screen, bg); +#endif + } + } +} + + +#if ( defined(DISPLAY_FRAMERATE) && !defined(DEBUG_FRAMESKIP) ) || defined(USE_GL) + +#include "font.h" + +#ifdef USE_GL +static void DisplayChar (uint8 *Screen, uint8 c, int rws) +#else +static void DisplayChar (uint8 *Screen, uint8 c) +#endif +{ + int line = (((c & 0x7f) - 32) >> 4) * font_height; + int offset = (((c & 0x7f) - 32) & 15) * font_width; + int h, w; + uint16 *s = (uint16 *) Screen; +#ifdef USE_GL + for (h = 1; h < font_height; h++, line++, s += rws - font_width) +#else + int rws=SNES4ALL_SCREEN_PITCH2; + for (h = 0; h < font_height; h++, line++, s += rws - font_width) +#endif + { + for (w = 0; w < font_width; w++, s++) + { + uint8 p = font [line][offset + w]; + if (p == '#') + *s=Settings.DisplayColor; + else + if (p == '.') + *s = BLACK; + } + } +} + +static void S9xDisplayFrameRate () +{ +#ifdef USE_GL + uint8 *Screen=(uint8 *)videogl_fps_buffer; + videogl_fps_enabled=1; + memset(Screen,0,64*8*2); +#else + uint8 *Screen = GFX.Screen + 2 + + getY(IPPU.RenderedScreenHeight - font_height - 1); +#endif +#if 1 + char string [16]; + int len = 5; + extern unsigned snes4all_frames_per_second; + + if (Settings.SkipFrames == AUTO_FRAMERATE) + sprintf (string, "%02d/%02d", IPPU.DisplayedRenderedFrameCount, (int) CMemory_ROMFramesPerSecond); + else + sprintf (string, "%d%%", (snes4all_frames_per_second*100)/((int)CMemory_ROMFramesPerSecond)); +#else + char string [32]; + int len; + + sprintf (string, "%.2f",((double)videogl_tiles)/1000.0); +#endif + len=strlen(string); if (len>8) len=8; + + int i; + for (i = 0; i < len; i++) + { +#ifdef USE_GL + DisplayChar (Screen, string [i],64); +#else + DisplayChar (Screen, string [i]); +#endif + Screen += (font_width - 1) * sizeof (uint16); + } +} + +static void S9xDisplayString (const char *string) +{ +#ifdef USE_GL + extern int videogl_info_enabled; + extern void *videogl_info_buffer; + uint8 *Screen=(uint8 *)videogl_info_buffer; + videogl_info_enabled=1; + memset(Screen,0,256*8*2); +#else + uint8 *Screen = GFX.Screen + 2 + + getY(IPPU.RenderedScreenHeight - font_height * 5); +#endif + int len = strlen (string); + int max_chars = SNES_WIDTH / (font_width - 1); + int char_count = 0; + int i; + + for (i = 0; i < len; i++, char_count++) + { + if (char_count >= max_chars || string [i] < 32) + { +#ifdef USE_GL + break; +#else + Screen -= (font_width - 1) * sizeof (uint16) * max_chars; + Screen += getY(font_height); + if (Screen >= GFX.Screen + getY(IPPU.RenderedScreenHeight)) + break; + char_count -= max_chars; +#endif + } +#ifndef USE_GL + if (string [i] < 32) + continue; +#endif +#ifdef USE_GL + DisplayChar (Screen, string [i], 256); +#else + DisplayChar (Screen, string [i]); +#endif + Screen += (font_width - 1) * sizeof (uint16); + } +} +#endif + +void S9xUpdateScreen () +{ +//printf("S9xUpdateScreen %i %i\n",IPPU.PreviousLine,IPPU.CurrentLine); +//printf("S9xUpdateScreen -> BGMode=%i, BG_Forced=%i, r212c=%i\n",PPU.BGMode,PPU_BG_Forced,GFX.r212c); +//fflush(stdout); + const int32 x2 = 1; + + GFX.S = GFX.Screen; + GFX.r2131 = CMemory_FillRAM [0x2131]; + GFX.r212c = CMemory_FillRAM [0x212c]; + GFX.r212d = CMemory_FillRAM [0x212d]; + GFX.r2130 = CMemory_FillRAM [0x2130]; + +#ifdef JP_FIX + + GFX.Pseudo = (CMemory_FillRAM [0x2133] & 8) && + (GFX.r212c & 15) != (GFX.r212d & 15) && + (GFX.r2131 == 0x3f); + +#else + + GFX.Pseudo = (CMemory_FillRAM [0x2133] & 8) && + (GFX.r212c & 15) != (GFX.r212d & 15) && + !(GFX.r2131 & 0x3f); + +#endif + + if (IPPU.OBJChanged) + S9xSetupOBJ (); + + if (PPU.RecomputeClipWindows) + { + ComputeClipWindows (); + PPU.RecomputeClipWindows = FALSE; + } + + GFX.StartY = IPPU.PreviousLine; + if ((GFX.EndY = IPPU.CurrentLine - 1) >= PPU.ScreenHeight) + GFX.EndY = PPU.ScreenHeight - 1; + + // XXX: Check ForceBlank? Or anything else? + PPU.RangeTimeOver |= GFX.OBJLines[GFX.EndY].RTOFlags; + + uint32 starty = GFX.StartY; + uint32 endy = GFX.EndY; + + const uint32 black = BLACK | (BLACK << 16); + + if (Settings.Transparency) + { + if (GFX.Pseudo) + { + GFX.r2131 = 0x5f; + GFX.r212c &= (CMemory_FillRAM [0x212d] | 0xf0); + GFX.r212d |= (CMemory_FillRAM [0x212c] & 0x0f); + GFX.r2130 |= 2; + } + + if (!PPU.ForcedBlanking && ADD_OR_SUB_ON_ANYTHING && + (GFX.r2130 & 0x30) != 0x30 && + !((GFX.r2130 & 0x30) == 0x10 && !IPPU.Clip[1].Count[5])) + { + struct ClipData *pClip; + + GFX.FixedColour = BUILD_PIXEL (IPPU.XB [PPU.FixedColourRed], + IPPU.XB [PPU.FixedColourGreen], + IPPU.XB [PPU.FixedColourBlue]); + + // Clear the z-buffer, marking areas 'covered' by the fixed + // colour as depth 1. + pClip = &IPPU.Clip [1]; + +#ifdef USE_GL + if (/*PPU.BGMode == 7 ||*/ !videogl_hw_render) +#endif + { + // Clear the z-buffer + if (pClip->Count [5]) + { + // Colour window enabled. + for (uint32 y = starty; y <= endy; y++) + { + ZeroMemory_32 (GFX.SubZBuffer + getY2(y), + SNES_WIDTH); + ZeroMemory_32 (GFX.ZBuffer + getY2(y), + SNES_WIDTH); + if (IPPU.Clip [0].Count [5]) + { + uint32 *p = (uint32 *) (GFX.SubScreen + getY(y)); + uint32 *q = (uint32 *) ((uint16 *) p + SNES_WIDTH); + while (p < q) + *p++ = black; + } + for (uint32 c = 0; c < pClip->Count [5]; c++) + { + if (pClip->Right [c][5] > pClip->Left [c][5]) + { + memset (GFX.SubZBuffer + getY2(y) + pClip->Left [c][5] * x2, + 1, (pClip->Right [c][5] - pClip->Left [c][5]) * x2); + if (IPPU.Clip [0].Count [5]) + { + // Blast, have to clear the sub-screen to the fixed-colour + // because there is a colour window in effect clipping + // the main screen that will allow the sub-screen + // 'underneath' to show through. + + uint16 *p = (uint16 *) (GFX.SubScreen + getY(y)); + uint16 *q = p + pClip->Right [c][5] * x2; + p += pClip->Left [c][5] * x2; + + while (p < q) + *p++ = (uint16) GFX.FixedColour; + } + } + } + } + } + else + { + for (uint32 y = starty; y <= endy; y++) + { + ZeroMemory_32 (GFX.ZBuffer + getY2(y), + SNES_WIDTH); + MemSet_32 (GFX.SubZBuffer + getY2(y), 1, + SNES_WIDTH); + + if (IPPU.Clip [0].Count [5]) + { + // Blast, have to clear the sub-screen to the fixed-colour + // because there is a colour window in effect clipping + // the main screen that will allow the sub-screen + // 'underneath' to show through. + + uint32 b = GFX.FixedColour | (GFX.FixedColour << 16); + uint32 *p = (uint32 *) (GFX.SubScreen + getY(y)); + uint32 *q = (uint32 *) ((uint16 *) p + SNES_WIDTH); + + while (p < q) + *p++ = b; + } + } + } + } + if (ANYTHING_ON_SUB) + { + GFX.DB = GFX.SubZBuffer; + RenderScreen (GFX.SubScreen, TRUE, TRUE, SUB_SCREEN_DEPTH); + } + + if (IPPU.Clip [0].Count [5]) + { +#ifdef SHOW_TODO +puts("TODO Trans0"); +#endif +#ifdef USE_GL + if (/*PPU.BGMode != 7 &&*/ videogl_hw_render) { + for(int i=starty/(240.0/VIDEO_GL_RASTER);i 1) + *p = *(p + GFX.Delta); + else + *p = BLACK; + d++; + p++; + } + } + } + + GFX.DB = GFX.ZBuffer; + RenderScreen (GFX.Screen, FALSE, FALSE, MAIN_SCREEN_DEPTH); + + if (SUB_OR_ADD(5)) + { + uint32 back = IPPU.ScreenColors [0]; + uint32 Left = 0; + uint32 Right = 256; + uint32 Count; + + pClip = &IPPU.Clip [0]; +#ifndef USE_GL + for (uint32 y = starty; y <= endy; y++) +#endif + { + if (!(Count = pClip->Count [5])) + { + Left = 0; + Right = 256 * x2; + Count = 1; + } + + for (uint32 b = 0; b < Count; b++) + { + if (pClip->Count [5]) + { + Left = pClip->Left [b][5] * x2; + Right = pClip->Right [b][5] * x2; + if (Right <= Left) + continue; + } + + if (GFX.r2131 & 0x80) + { + if (GFX.r2131 & 0x40) + { +#ifdef SHOW_TODO +puts("TODO Trans1"); +#endif +#ifdef USE_GL + if (videogl_hw_render) { + for(int i=starty/(240.0/VIDEO_GL_RASTER);istarty) + videogl_addfix_y0=starty; + videogl_addfix_x1=Right; + if (videogl_addfix_y1Count [5]) + for(int i=starty/(240.0/VIDEO_GL_RASTER);iCount [5]) + { +#ifdef SHOW_TODO +puts("TODO Trans5"); +#endif +#ifdef USE_GL + if (videogl_hw_render) { + for(int i=starty/(240.0/VIDEO_GL_RASTER);iCount [5]) + { +#ifdef SHOW_TODO +puts("TODO Trans6"); +#endif +#ifdef USE_GL + if (videogl_hw_render) { +#if 0 + videogl_used_sub=1; + videogl_sub_color=back; + videogl_sub_x0=pClip->Left[0][5]; + if (videogl_sub_y0>starty) + videogl_sub_y0=starty; + videogl_sub_x1=pClip->Right[0][5]; + if (videogl_sub_y1Count [5]; b++) + { + uint32 Left = pClip->Left [b][5] * x2; + uint32 Right = pClip->Right [b][5] * x2; + uint16 *p = (uint16 *) (GFX.Screen + getY(y)) + Left; + uint8 *d = GFX.ZBuffer + getY2(y); + uint8 *e = d + Right; + d += Left; + + while (d < e) + { + if ((!*d)) + *p = (int16) back; + d++; + p++; + } + } + } + } + } + else + { +#ifdef SHOW_TODO +printf("TODO Trans7, starty=%i, endy=%i\n",starty,endy); +#endif +#ifdef USE_GL + if (videogl_hw_render) { +#if 0 + videogl_used_sub=1; + videogl_sub_color=back; + videogl_sub_x0=0; + if (videogl_sub_y0>starty) + videogl_sub_y0=starty; + videogl_sub_x1=256; + if (videogl_sub_y1 IPPU.Clip [0].Left [c][5]) + { + uint16 *p = (uint16 *) (GFX.Screen + getY(y)); + uint16 *q = p + IPPU.Clip [0].Right [c][5] * x2; + p += IPPU.Clip [0].Left [c][5] * x2; + + while (p < q) + *p++ = (uint16) back; + } + } + } + } + else + { + for (uint32 y = starty; y <= endy; y++) + { + uint32 *p = (uint32 *) (GFX.Screen + getY(y)); + uint32 *q = (uint32 *) ((uint16 *) p + SNES_WIDTH); + while (p < q) + *p++ = back; + } + } + } + if (!PPU.ForcedBlanking) + { +#ifdef USE_GL + if (/*PPU.BGMode == 7 ||*/ !videogl_hw_render) +#endif + for (uint32 y = starty; y <= endy; y++) + { + ZeroMemory_32 (GFX.ZBuffer + getY2(y), + SNES_WIDTH); + } + GFX.DB = GFX.ZBuffer; + RenderScreen (GFX.Screen, FALSE, TRUE, SUB_SCREEN_DEPTH); + } +#ifdef USE_GL + else if (PPU.BGMode == 7 && videogl_hw_render) + ZeroMemory((uint32 *) (GFX.Screen + getY(GFX.StartY)),SNES4ALL_SCREEN_PITCH*(GFX.EndY-GFX.StartY+1)); +#endif + } + } + else + { + { + register uint32 back = IPPU.ScreenColors [0] | (IPPU.ScreenColors [0] << 16); + if (PPU.ForcedBlanking) + back = black; +#ifndef USE_GL + else +#endif + SelectTileRenderer (TRUE); + +#ifdef USE_GL + for(int i=starty/(240.0/VIDEO_GL_RASTER);i> 1; +uint32 RGB_LOW_BITS_MASK = (RED_LOW_BIT_MASK_RGB565 | + GREEN_LOW_BIT_MASK_RGB565 | + BLUE_LOW_BIT_MASK_RGB565); +uint32 RGB_HI_BITS_MASK = (RED_HI_BIT_MASK_RGB565 | + GREEN_HI_BIT_MASK_RGB565 | + BLUE_HI_BIT_MASK_RGB565); +uint32 RGB_HI_BITS_MASKx2 = (RED_HI_BIT_MASK_RGB565 | + GREEN_HI_BIT_MASK_RGB565 | + BLUE_HI_BIT_MASK_RGB565) << 1; +uint32 RGB_REMOVE_LOW_BITS_MASK = ~RGB_LOW_BITS_MASK; +uint32 FIRST_COLOR_MASK = FIRST_COLOR_MASK_RGB565; +uint32 SECOND_COLOR_MASK = SECOND_COLOR_MASK_RGB565; +uint32 THIRD_COLOR_MASK = THIRD_COLOR_MASK_RGB565; +uint32 ALPHA_BITS_MASK = ALPHA_BITS_MASK_RGB565; +uint32 FIRST_THIRD_COLOR_MASK = 0; +uint32 TWO_LOW_BITS_MASK = 0; +uint32 HIGH_BITS_SHIFTED_TWO_MASK = 0; + +uint32 current_graphic_format = RGB565; +#endif + +uint8 GetBank = 0; +struct SCheatData Cheat; + +volatile SoundStatus so; + +#ifdef ENABLE_ECHO_SOUND +int Echo [24000]; +int DummyEchoBuffer [SOUND_BUFFER_SIZE]; +int EchoBuffer [SOUND_BUFFER_SIZE]; +#endif +int MixBuffer [SOUND_BUFFER_SIZE*2]; +int FilterTaps [8]; +unsigned long Z = 0; +int Loop [16]; + +uint16 SignExtend [2] = { + 0x00, 0xff00 +}; + +//modified per anomie Mode 5 findings +int HDMA_ModeByteCounts [8] = { + 1, 2, 2, 4, 4, 4, 2, 4 +}; + +uint8 BitShifts[8][4] = +{ + {2, 2, 2, 2}, // 0 + {4, 4, 2, 0}, // 1 + {4, 4, 0, 0}, // 2 + {8, 4, 0, 0}, // 3 + {8, 2, 0, 0}, // 4 + {4, 2, 0, 0}, // 5 + {4, 0, 0, 0}, // 6 + {8, 0, 0, 0} // 7 +}; +uint8 TileShifts[8][4] = +{ + {4, 4, 4, 4}, // 0 + {5, 5, 4, 0}, // 1 + {5, 5, 0, 0}, // 2 + {6, 5, 0, 0}, // 3 + {6, 4, 0, 0}, // 4 + {5, 4, 0, 0}, // 5 + {5, 0, 0, 0}, // 6 + {6, 0, 0, 0} // 7 +}; +uint8 PaletteShifts[8][4] = +{ + {2, 2, 2, 2}, // 0 + {4, 4, 2, 0}, // 1 + {4, 4, 0, 0}, // 2 + {0, 4, 0, 0}, // 3 + {0, 2, 0, 0}, // 4 + {4, 2, 0, 0}, // 5 + {4, 0, 0, 0}, // 6 + {0, 0, 0, 0} // 7 +}; +uint8 PaletteMasks[8][4] = +{ + {7, 7, 7, 7}, // 0 + {7, 7, 7, 0}, // 1 + {7, 7, 0, 0}, // 2 + {0, 7, 0, 0}, // 3 + {0, 7, 0, 0}, // 4 + {7, 7, 0, 0}, // 5 + {7, 0, 0, 0}, // 6 + {0, 0, 0, 0} // 7 +}; +uint8 Depths[8][4] = +{ + {TILE_2BIT, TILE_2BIT, TILE_2BIT, TILE_2BIT}, // 0 + {TILE_4BIT, TILE_4BIT, TILE_2BIT, 0}, // 1 + {TILE_4BIT, TILE_4BIT, 0, 0}, // 2 + {TILE_8BIT, TILE_4BIT, 0, 0}, // 3 + {TILE_8BIT, TILE_2BIT, 0, 0}, // 4 + {TILE_4BIT, TILE_2BIT, 0, 0}, // 5 + {TILE_4BIT, 0, 0, 0}, // 6 + {0, 0, 0, 0} // 7 +}; +uint8 BGSizes [2] = { + 8, 16 +}; +uint16 DirectColourMaps [8][256]; + +long FilterValues[4][2] = +{ + {0, 0}, + {240, 0}, + {488, -240}, + {460, -208} +}; + +int NoiseFreq [32] = { + 0, 16, 21, 25, 31, 42, 50, 63, 84, 100, 125, 167, 200, 250, 333, + 400, 500, 667, 800, 1000, 1300, 1600, 2000, 2700, 3200, 4000, + 5300, 6400, 8000, 10700, 16000, 32000 +}; + +uint32 HeadMask [4] = { +#ifdef LSB_FIRST + 0xffffffff, 0xffffff00, 0xffff0000, 0xff000000 +#else + 0xffffffff, 0x00ffffff, 0x0000ffff, 0x000000ff +#endif +}; + +uint32 TailMask [5] = { +#ifdef LSB_FIRST + 0x00000000, 0x000000ff, 0x0000ffff, 0x00ffffff, 0xffffffff +#else + 0x00000000, 0xff000000, 0xffff0000, 0xffffff00, 0xffffffff +#endif +}; + +START_EXTERN_C +uint8 APUROM [64] = +{ + 0xCD,0xEF,0xBD,0xE8,0x00,0xC6,0x1D,0xD0,0xFC,0x8F,0xAA,0xF4,0x8F, + 0xBB,0xF5,0x78,0xCC,0xF4,0xD0,0xFB,0x2F,0x19,0xEB,0xF4,0xD0,0xFC, + 0x7E,0xF4,0xD0,0x0B,0xE4,0xF5,0xCB,0xF4,0xD7,0x00,0xFC,0xD0,0xF3, + 0xAB,0x01,0x10,0xEF,0x7E,0xF4,0x10,0xEB,0xBA,0xF6,0xDA,0x00,0xBA, + 0xF4,0xC4,0xF4,0xDD,0x5D,0xD0,0xDB,0x1F,0x00,0x00,0xC0,0xFF +}; + +#ifdef NETPLAY_SUPPORT +struct SNetPlay NetPlay; +#endif + +// Raw SPC700 instruction cycle lengths +int32 S9xAPUCycleLengths [256] = +{ + /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ + /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, + /* 10 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 4, 6, + /* 20 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 5, 4, + /* 30 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 3, 8, + /* 40 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 6, 6, + /* 50 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 4, 5, 2, 2, 4, 3, + /* 60 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 5, 5, + /* 70 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 6, + /* 80 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 2, 4, 5, + /* 90 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2,12, 5, + /* a0 */ 3, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 2, 4, 4, + /* b0 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 4, + /* c0 */ 3, 8, 4, 5, 4, 5, 4, 7, 2, 5, 6, 4, 5, 2, 4, 9, + /* d0 */ 2, 8, 4, 5, 5, 6, 6, 7, 4, 5, 4, 5, 2, 2, 6, 3, + /* e0 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 4, 5, 3, 4, 3, 4, 3, + /* f0 */ 2, 8, 4, 5, 4, 5, 5, 6, 3, 4, 5, 4, 2, 2, 4, 3 +}; + +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +// Actual data used by CPU emulation, will be scaled by APUReset routine +// to be relative to the 65c816 instruction lengths. +int32 S9xAPUCycles [256] = +{ + /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ + /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, + /* 10 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 4, 6, + /* 20 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 5, 4, + /* 30 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 3, 8, + /* 40 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 6, 6, + /* 50 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 4, 5, 2, 2, 4, 3, + /* 60 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 5, 5, + /* 70 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 6, + /* 80 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 2, 4, 5, + /* 90 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2,12, 5, + /* a0 */ 3, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 2, 4, 4, + /* b0 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 4, + /* c0 */ 3, 8, 4, 5, 4, 5, 4, 7, 2, 5, 6, 4, 5, 2, 4, 9, + /* d0 */ 2, 8, 4, 5, 5, 6, 6, 7, 4, 5, 4, 5, 2, 2, 6, 3, + /* e0 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 4, 5, 3, 4, 3, 4, 3, + /* f0 */ 2, 8, 4, 5, 4, 5, 5, 6, 3, 4, 5, 4, 2, 2, 4, 3 +}; +#endif + +END_EXTERN_C + diff --git a/src/i386/2xsaimmx.asm b/src/i386/2xsaimmx.asm new file mode 100644 index 0000000..af7984c --- /dev/null +++ b/src/i386/2xsaimmx.asm @@ -0,0 +1,2089 @@ +;/*---------------------------------------------------------------------* +; * The following (piece of) code, (part of) the 2xSaI engine, * +; * copyright (c) 1999 - 2001 by Derek Liauw Kie Fa. * +; * Non-Commercial use of this software is allowed and is encouraged, * +; * provided that appropriate credit be given. * +; * You may freely modify this code, but I request * +; * that any improvements to the engine be submitted to me, so * +; * that I can implement these improvements in newer versions of * +; * the software. * +; * If you need more information, have any comments or suggestions, * +; * you can e-mail me. My e-mail: derek-liauw@usa.net. * +; *---------------------------------------------------------------------*/ + +;---------------------- +; 2xSaI version 0.59 WIP, soon to become version 0.60 +;---------------------- + +;%define FAR_POINTER + + + + BITS 32 +%ifdef __DJGPP__ + GLOBAL __2xSaILine + GLOBAL __2xSaISuperEagleLine + GLOBAL __2xSaISuper2xSaILine + GLOBAL _Init_2xSaIMMX + EXTERN _snes9x_clear_change_log + %define snes9x_clear_change_log _snes9x_clear_change_log +%else + GLOBAL _2xSaILine + GLOBAL _2xSaISuperEagleLine + GLOBAL _2xSaISuper2xSaILine + GLOBAL Init_2xSaIMMX + EXTERN snes9x_clear_change_log +%endif + SECTION .text ALIGN = 32 + +%ifdef FAR_POINTER +;EXTERN_C void _2xSaILine (uint8 *srcPtr, uint32 srcPitch, uint32 width, +; uint8 *dstPtr, uint32 dstPitch, uint16 dstSegment); +%else +;EXTERN_C void _2xSaILine (uint8 *srcPtr, uint32 srcPitch, uint32 width, +; uint8 *dstPtr, uint32 dstPitch); +%endif + +srcPtr equ 8 +deltaPtr equ 12 +srcPitch equ 16 +width equ 20 +dstOffset equ 24 +dstPitch equ 28 +dstSegment equ 32 + + + + +colorB0 equ -2 +colorB1 equ 0 +colorB2 equ 2 +colorB3 equ 4 + +color7 equ -2 +color8 equ 0 +color9 equ 2 + +color4 equ -2 +color5 equ 0 +color6 equ 2 +colorS2 equ 4 + +color1 equ -2 +color2 equ 0 +color3 equ 2 +colorS1 equ 4 + +colorA0 equ -2 +colorA1 equ 0 +colorA2 equ 2 +colorA3 equ 4 + + + + +%ifdef __DJGPP__ +__2xSaISuper2xSaILine: +%else +_2xSaISuper2xSaILine: +%endif +; Store some stuff + push ebp + mov ebp, esp + pushad + +; Prepare the destination +%ifdef FAR_POINTER + ; Set the selector + mov eax, [ebp+dstSegment] + mov fs, ax +%endif + mov edx, [ebp+dstOffset] ; edx points to the screen +; Prepare the source + ; eax points to colorA + mov eax, [ebp+srcPtr] ;eax points to colorA + mov ebx, [ebp+srcPitch] ;ebx contains the source pitch + mov ecx, [ebp+width] ;ecx contains the number of pixels to process + ; eax now points to colorB1 + sub eax, ebx ;eax points to B1 which is the base + +; Main Loop +.Loop: push ecx + + cmp byte [snes9x_clear_change_log], 0 + jnz near .SKIP_DELTA_TEST + + ;-----Check Delta------------------ + mov ecx, [ebp+deltaPtr] + + + ;load source img + movq mm0, [eax+colorB0] + movq mm1, [eax+colorB3] + movq mm2, [eax+ebx+color4] + movq mm3, [eax+ebx+colorS2] + movq mm4, [eax+ebx+ebx+color1] + movq mm5, [eax+ebx+ebx+colorS1] + push eax + add eax, ebx + movq mm6, [eax+ebx+ebx+colorA0] + movq mm7, [eax+ebx+ebx+colorA3] + pop eax + + ;compare to delta + pcmpeqw mm0, [ecx+2+colorB0] + pcmpeqw mm1, [ecx+2+colorB3] + pcmpeqw mm2, [ecx+ebx+2+color4] + pcmpeqw mm3, [ecx+ebx+2+colorS2] + pcmpeqw mm4, [ecx+ebx+ebx+2+color1] + pcmpeqw mm5, [ecx+ebx+ebx+2+colorS1] + add ecx, ebx + pcmpeqw mm6, [ecx+ebx+ebx+2+colorA0] + pcmpeqw mm7, [ecx+ebx+ebx+2+colorA3] + sub ecx, ebx + + + ;compose results + pand mm0, mm1 + pand mm2, mm3 + pand mm4, mm5 + pand mm6, mm7 + pand mm0, mm2 + pand mm4, mm6 + pxor mm7, mm7 + pand mm0, mm4 + movq mm6, [eax+colorB0] + pcmpeqw mm7, mm0 ;did any compare give us a zero ? + + movq [ecx+2+colorB0], mm6 + + packsswb mm7, mm7 + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_PROCESS ;no, so we can skip + + ;End Delta +.SKIP_DELTA_TEST: + + ;--------------------------------- + movq mm0, [eax+ebx+color5] + movq mm1, [eax+ebx+color6] + movq mm2, mm0 + movq mm3, mm1 + movq mm4, mm0 + movq mm5, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + movq [I56Pixel], mm0 + movq mm7, mm0 + + ;------------------- + movq mm0, mm7 + movq mm1, mm4 ;5,5,5,6 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + movq [I5556Pixel], mm0 + ;-------------------- + + movq mm0, mm7 + movq mm1, mm5 ;6,6,6,5 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [I5666Pixel], mm0 + + ;------------------------- + ;------------------------- + movq mm0, [eax+ebx+ebx+color2] + movq mm1, [eax+ebx+ebx+color3] + movq mm2, mm0 + movq mm3, mm1 + movq mm4, mm0 + movq mm5, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [I23Pixel], mm0 + movq mm7, mm0 + + ;--------------------- + movq mm0, mm7 + movq mm1, mm4 ;2,2,2,3 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [I2223Pixel], mm0 + + ;---------------------- + movq mm0, mm7 + movq mm1, mm5 ;3,3,3,2 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [I2333Pixel], mm0 + + + ;-------------------- +;//////////////////////////////// +; Decide which "branch" to take +;-------------------------------- + movq mm0, [eax+ebx+color5] + movq mm1, [eax+ebx+color6] + movq mm6, mm0 + movq mm7, mm1 + pcmpeqw mm0, [eax+ebx+ebx+color3] + pcmpeqw mm1, [eax+ebx+ebx+color2] + pcmpeqw mm6, mm7 + + movq mm2, mm0 + movq mm3, mm0 + + pand mm0, mm1 ;colorA == colorD && colorB == colorC + pxor mm7, mm7 + + pcmpeqw mm2, mm7 + pand mm6, mm0 + pand mm2, mm1 ;colorA != colorD && colorB == colorC + + pcmpeqw mm1, mm7 + + pand mm1, mm3 ;colorA == colorD && colorB != colorC + pxor mm0, mm6 + por mm1, mm6 + movq mm7, mm0 + movq [Mask26], mm2 + packsswb mm7, mm7 + movq [Mask35], mm1 + + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_GUESS + +;--------------------------------------------- + movq mm6, mm0 + movq mm4, [eax+ebx+colorA] + movq mm5, [eax+ebx+colorB] + pxor mm7, mm7 + pand mm6, [ONE] + + movq mm0, [eax+colorE] + movq mm1, [eax+ebx+colorG] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+colorF] + movq mm1, [eax+ebx+colorK] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + push eax + add eax, ebx + movq mm0, [eax+ebx+colorH] + movq mm1, [eax+ebx+ebx+colorN] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+ebx+colorL] + movq mm1, [eax+ebx+ebx+colorO] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + pop eax + movq mm1, mm7 + pxor mm0, mm0 + pcmpgtw mm7, mm0 + pcmpgtw mm0, mm1 + + por mm7, [Mask35] + por mm0, [Mask26] + movq [Mask35], mm7 + movq [Mask26], mm0 + +.SKIP_GUESS: + + ;Start the ASSEMBLY !!! eh... compose all the results together to form the final image... + + + movq mm0, [eax+ebx+color5] + movq mm1, [eax+ebx+ebx+color2] + movq mm2, mm0 + movq mm3, mm1 + movq mm4, mm0 + movq mm5, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + ;--------------------------- + + + +%ifdef dfhsdfhsdahdsfhdsfh + + if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) + product2a = INTERPOLATE (color2, color5); + else + if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) + product2a = INTERPOLATE(color2, color5); + else + product2a = color2; + + if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) + product1a = INTERPOLATE (color2, color5); + else + if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) + product1a = INTERPOLATE(color2, color5); + else + product1a = color5; + +%endif + + + movq mm7, [Mask26] + movq mm6, [eax+colorB2] + movq mm5, [eax+ebx+ebx+color2] + movq mm4, [eax+ebx+ebx+color1] + pcmpeqw mm4, mm5 + pcmpeqw mm6, mm5 + pxor mm5, mm5 + pand mm7, mm4 + pcmpeqw mm6, mm5 + pand mm7, mm6 + + + + movq mm6, [eax+ebx+ebx+color3] + movq mm5, [eax+ebx+ebx+color2] + movq mm4, [eax+ebx+ebx+color1] + movq mm2, [eax+ebx+color5] + movq mm1, [eax+ebx+color4] + movq mm3, [eax+colorB0] + + pcmpeqw mm2, mm4 + pcmpeqw mm6, mm5 + pcmpeqw mm1, mm5 + pcmpeqw mm3, mm5 + pxor mm5, mm5 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm6, mm1 + pand mm2, mm3 + pand mm6, mm2 + por mm7, mm6 + + + movq mm6, mm7 + pcmpeqw mm6, mm5 + pand mm7, mm0 + + movq mm1, [eax+ebx+color5] + pand mm6, mm1 + por mm7, mm6 + movq [final1a], mm7 ;finished 1a + + + + ;-------------------------------- + + movq mm7, [Mask35] + push eax + add eax, ebx + movq mm6, [eax+ebx+ebx+colorA2] + pop eax + movq mm5, [eax+ebx+color5] + movq mm4, [eax+ebx+color4] + pcmpeqw mm4, mm5 + pcmpeqw mm6, mm5 + pxor mm5, mm5 + pand mm7, mm4 + pcmpeqw mm6, mm5 + pand mm7, mm6 + + + + movq mm6, [eax+ebx+color6] + movq mm5, [eax+ebx+color5] + movq mm4, [eax+ebx+color4] + movq mm2, [eax+ebx+ebx+color2] + movq mm1, [eax+ebx+ebx+color1] + push eax + add eax, ebx + movq mm3, [eax+ebx+ebx+colorA0] + pop eax + + pcmpeqw mm2, mm4 + pcmpeqw mm6, mm5 + pcmpeqw mm1, mm5 + pcmpeqw mm3, mm5 + pxor mm5, mm5 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm6, mm1 + pand mm2, mm3 + pand mm6, mm2 + por mm7, mm6 + + + movq mm6, mm7 + pcmpeqw mm6, mm5 + pand mm7, mm0 + + movq mm1, [eax+ebx+ebx+color2] + pand mm6, mm1 + por mm7, mm6 + movq [final2a], mm7 ;finished 2a + + + ;-------------------------------------------- + + +%ifdef dfhsdfhsdahdsfhdsfh + if (color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) + product2b = Q_INTERPOLATE (color3, color3, color3, color2); + else + if (color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) + product2b = Q_INTERPOLATE (color2, color2, color2, color3); + else + product2b = INTERPOLATE (color2, color3); + + if (color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) + product1b = Q_INTERPOLATE (color6, color6, color6, color5); + else + if (color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) + product1b = Q_INTERPOLATE (color6, color5, color5, color5); + else + product1b = INTERPOLATE (color5, color6); +%endif + + push eax + add eax, ebx + pxor mm7, mm7 + movq mm0, [eax+ebx+ebx+colorA0] + movq mm1, [eax+ebx+ebx+colorA1] + movq mm2, [eax+ebx+ebx+colorA2] + movq mm3, [eax+ebx+ebx+colorA3] + pop eax + movq mm4, [eax+ebx+ebx+color2] + movq mm5, [eax+ebx+ebx+color3] + movq mm6, [eax+ebx+color6] + + pcmpeqw mm6, mm5 + pcmpeqw mm1, mm5 + pcmpeqw mm4, mm2 + pcmpeqw mm0, mm5 + pcmpeqw mm4, mm7 + pcmpeqw mm0, mm7 + pand mm0, mm4 + pand mm6, mm1 + pand mm0, mm6 + + movq mm4, [eax+ebx+color2] + movq mm5, [eax+ebx+ebx+color5] + movq mm6, [eax+ebx+ebx+color3] + + pcmpeqw mm5, mm4 + pcmpeqw mm2, mm4 + pcmpeqw mm1, mm6 + pcmpeqw mm3, mm4 + pcmpeqw mm1, mm7 + pcmpeqw mm3, mm7 + pand mm2, mm5 + pand mm1, mm3 + pand mm1, mm2 + + movq mm2, mm0 + movq mm7, [I2333Pixel] + movq mm6, [I2223Pixel] + movq mm5, [I23Pixel] + movq mm4, [Mask35] + movq mm3, [Mask26] + + por mm2, mm4 + pand mm4, [eax+ebx+ebx+color3] + por mm2, mm3 + pand mm3, [eax+ebx+ebx+color2] + por mm2, mm1 + pand mm0, mm7 + pand mm1, mm6 + pxor mm7, mm7 + pcmpeqw mm2, mm7 + por mm0, mm1 + por mm3, mm4 + pand mm2, mm5 + por mm0, mm3 + por mm0, mm2 + movq [final2b], mm0 + + ;----------------------------------- + + + pxor mm7, mm7 + movq mm0, [eax+colorB0] + movq mm1, [eax+colorB1] + movq mm2, [eax+colorB2] + movq mm3, [eax+colorB3] + movq mm4, [eax+ebx+color5] + movq mm5, [eax+ebx+color6] + movq mm6, [eax+ebx+ebx+color3] + + pcmpeqw mm6, mm5 + pcmpeqw mm1, mm5 + pcmpeqw mm4, mm2 + pcmpeqw mm0, mm5 + pcmpeqw mm4, mm7 + pcmpeqw mm0, mm7 + pand mm0, mm4 + pand mm6, mm1 + pand mm0, mm6 + + movq mm4, [eax+ebx+color5] + movq mm5, [eax+ebx+ebx+color2] + movq mm6, [eax+ebx+color6] + + pcmpeqw mm5, mm4 + pcmpeqw mm2, mm4 + pcmpeqw mm1, mm6 + pcmpeqw mm3, mm4 + pcmpeqw mm1, mm7 + pcmpeqw mm3, mm7 + pand mm2, mm5 + pand mm1, mm3 + pand mm1, mm2 + + movq mm2, mm0 + movq mm7, [I5666Pixel] + movq mm6, [I5556Pixel] + movq mm5, [I56Pixel] + movq mm4, [Mask35] + movq mm3, [Mask26] + + por mm2, mm4 + pand mm4, [eax+ebx+color5] + por mm2, mm3 + pand mm3, [eax+ebx+color6] + por mm2, mm1 + pand mm0, mm7 + pand mm1, mm6 + pxor mm7, mm7 + pcmpeqw mm2, mm7 + por mm0, mm1 + por mm3, mm4 + pand mm2, mm5 + por mm0, mm3 + por mm0, mm2 + movq [final1b], mm0 + + ;--------- + + movq mm0, [final1a] + movq mm4, [final2a] + movq mm2, [final1b] + movq mm6, [final2b] + + movq mm1, mm0 + movq mm5, mm4 + + + punpcklwd mm0, mm2 + punpckhwd mm1, mm2 + + punpcklwd mm4, mm6 + punpckhwd mm5, mm6 + + +%ifdef FAR_POINTER + movq [fs:edx], mm0 + movq [fs:edx+8], mm1 + push edx + add edx, [ebp+dstPitch] + movq [fs:edx], mm4 + movq [fs:edx+8], mm5 + pop edx +%else + movq [edx], mm0 + movq [edx+8], mm1 + push edx + add edx, [ebp+dstPitch] + movq [edx], mm4 + movq [edx+8], mm5 + pop edx +%endif +.SKIP_PROCESS: + mov ecx, [ebp+deltaPtr] + add ecx, 8 + mov [ebp+deltaPtr], ecx + add edx, 16 + add eax, 8 + + pop ecx + sub ecx, 4 + cmp ecx, 0 + jg near .Loop + +; Restore some stuff + popad + mov esp, ebp + pop ebp + emms + ret + + +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- + + + +%ifdef __DJGPP__ +__2xSaISuperEagleLine: +%else +_2xSaISuperEagleLine: +%endif +; Store some stuff + push ebp + mov ebp, esp + pushad + +; Prepare the destination +%ifdef FAR_POINTER + ; Set the selector + mov eax, [ebp+dstSegment] + mov fs, ax +%endif + mov edx, [ebp+dstOffset] ; edx points to the screen +; Prepare the source + ; eax points to colorA + mov eax, [ebp+srcPtr] + mov ebx, [ebp+srcPitch] + mov ecx, [ebp+width] + ; eax now points to colorB1 + sub eax, ebx + +; Main Loop +.Loop: push ecx + + cmp byte [snes9x_clear_change_log], 0 + jnz near .SKIP_DELTA_TEST + + ;-----Check Delta------------------ + mov ecx, [ebp+deltaPtr] + + movq mm0, [eax+colorB0] + movq mm1, [eax+colorB3] + movq mm2, [eax+ebx+color4] + movq mm3, [eax+ebx+colorS2] + movq mm4, [eax+ebx+ebx+color1] + movq mm5, [eax+ebx+ebx+colorS1] + push eax + add eax, ebx + movq mm6, [eax+ebx+ebx+colorA0] + movq mm7, [eax+ebx+ebx+colorA3] + pop eax + + pcmpeqw mm0, [ecx+2+colorB0] + pcmpeqw mm1, [ecx+2+colorB3] + pcmpeqw mm2, [ecx+ebx+2+color4] + pcmpeqw mm3, [ecx+ebx+2+colorS2] + pcmpeqw mm4, [ecx+ebx+ebx+2+color1] + pcmpeqw mm5, [ecx+ebx+ebx+2+colorS1] + add ecx, ebx + pcmpeqw mm6, [ecx+ebx+ebx+2+colorA0] + pcmpeqw mm7, [ecx+ebx+ebx+2+colorA3] + sub ecx, ebx + + + pand mm0, mm1 + pand mm2, mm3 + pand mm4, mm5 + pand mm6, mm7 + pand mm0, mm2 + pand mm4, mm6 + pxor mm7, mm7 + pand mm0, mm4 + movq mm6, [eax+colorB0] + pcmpeqw mm7, mm0 + + movq [ecx+2+colorB0], mm6 + + packsswb mm7, mm7 + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_PROCESS + + ;End Delta +.SKIP_DELTA_TEST: + + ;--------------------------------- + movq mm0, [eax+ebx+color5] + movq mm1, [eax+ebx+color6] + movq mm2, mm0 + movq mm3, mm1 + movq mm4, mm0 + movq mm5, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + movq [I56Pixel], mm0 + movq mm7, mm0 + + ;------------------- + movq mm0, mm7 + movq mm1, mm4 ;5,5,5,6 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + movq [product1a], mm0 + ;-------------------- + + movq mm0, mm7 + movq mm1, mm5 ;6,6,6,5 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [product1b], mm0 + + ;------------------------- + ;------------------------- + movq mm0, [eax+ebx+ebx+color2] + movq mm1, [eax+ebx+ebx+color3] + movq mm2, mm0 + movq mm3, mm1 + movq mm4, mm0 + movq mm5, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [I23Pixel], mm0 + movq mm7, mm0 + + ;--------------------- + movq mm0, mm7 + movq mm1, mm4 ;2,2,2,3 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [product2a], mm0 + + ;---------------------- + movq mm0, mm7 + movq mm1, mm5 ;3,3,3,2 + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 + movq [product2b], mm0 + + + ;//////////////////////////////// + ; Decide which "branch" to take + ;-------------------------------- + movq mm4, [eax+ebx+color5] + movq mm5, [eax+ebx+color6] + movq mm6, [eax+ebx+ebx+color3] + movq mm7, [eax+ebx+ebx+color2] + + pxor mm3, mm3 + movq mm0, mm4 + movq mm1, mm5 + + pcmpeqw mm0, mm6 + pcmpeqw mm1, mm7 + pcmpeqw mm1, mm3 + pand mm0, mm1 + movq [Mask35], mm0 + + movq mm0, [eax+ebx+ebx+colorS1] + movq mm1, [eax+ebx+color4] + push eax + add eax, ebx + movq mm2, [eax+ebx+ebx+colorA2] + pop eax + movq mm3, [eax+colorB1] + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm4 + pcmpeqw mm3, mm4 + pand mm0, mm1 + pand mm2, mm3 + por mm0, mm2 + pand mm0, [Mask35] + movq [Mask35b], mm0 + + ;----------- + pxor mm3, mm3 + movq mm0, mm4 + movq mm1, mm5 + + pcmpeqw mm0, mm6 + pcmpeqw mm1, mm7 + pcmpeqw mm0, mm3 + pand mm0, mm1 + movq [Mask26], mm0 + + movq mm0, [eax+ebx+ebx+color1] + movq mm1, [eax+ebx+colorS2] + push eax + add eax, ebx + movq mm2, [eax+ebx+ebx+colorA1] + pop eax + movq mm3, [eax+colorB2] + pcmpeqw mm0, mm5 + pcmpeqw mm1, mm5 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm1 + pand mm2, mm3 + por mm0, mm2 + pand mm0, [Mask26] + movq [Mask26b], mm0 + + ;-------------------- + movq mm0, mm4 + movq mm1, mm5 + movq mm2, mm0 + + pcmpeqw mm2, mm1 + pcmpeqw mm0, mm6 + pcmpeqw mm1, mm7 + pand mm0, mm1 + pand mm2, mm0 + pxor mm0, mm2 + movq mm7, mm0 + + ;------------------ + packsswb mm7, mm7 + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_GUESS + +;--------------------------------------------- +; Map of the pixels: I|E F|J +; G|A B|K +; H|C D|L +; M|N O|P + movq mm6, mm0 + movq mm4, [eax+ebx+color5] + movq mm5, [eax+ebx+color6] + pxor mm7, mm7 + pand mm6, [ONE] + + movq mm0, [eax+colorB1] + movq mm1, [eax+ebx+color4] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+colorB2] + movq mm1, [eax+ebx+colorS2] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + push eax + add eax, ebx + movq mm0, [eax+ebx+color1] + movq mm1, [eax+ebx+ebx+colorA1] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+ebx+colorS1] + movq mm1, [eax+ebx+ebx+colorA2] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + pop eax + movq mm1, mm7 + pxor mm0, mm0 + pcmpgtw mm7, mm0 + pcmpgtw mm0, mm1 + + por mm7, [Mask35] + por mm0, [Mask26] + movq [Mask35], mm7 + movq [Mask26], mm0 + +.SKIP_GUESS: + ;Start the ASSEMBLY !!! + + movq mm4, [Mask35] + movq mm5, [Mask26] + movq mm6, [Mask35b] + movq mm7, [Mask26b] + + movq mm0, [eax+ebx+color5] + movq mm1, [eax+ebx+color6] + movq mm2, [eax+ebx+ebx+color2] + movq mm3, [eax+ebx+ebx+color3] + pcmpeqw mm0, mm2 + pcmpeqw mm1, mm3 + movq mm2, mm4 + movq mm3, mm5 + por mm0, mm1 + por mm2, mm3 + pand mm2, mm0 + pxor mm0, mm2 + movq mm3, mm0 + + movq mm2, mm0 + pxor mm0, mm0 + por mm2, mm4 + pxor mm4, mm6 + por mm2, mm5 + pxor mm5, mm7 + pcmpeqw mm2, mm0 + ;---------------- + + movq mm0, [eax+ebx+color5] + movq mm1, mm3 + por mm1, mm4 + por mm1, mm6 + pand mm0, mm1 + movq mm1, mm5 + pand mm1, [I56Pixel] + por mm0, mm1 + movq mm1, mm7 + pand mm1, [product1b] + por mm0, mm1 + movq mm1, mm2 + pand mm1, [product1a] + por mm0, mm1 + movq [final1a], mm0 + + movq mm0, [eax+ebx+color6] + movq mm1, mm3 + por mm1, mm5 + por mm1, mm7 + pand mm0, mm1 + movq mm1, mm4 + pand mm1, [I56Pixel] + por mm0, mm1 + movq mm1, mm6 + pand mm1, [product1a] + por mm0, mm1 + movq mm1, mm2 + pand mm1, [product1b] + por mm0, mm1 + movq [final1b], mm0 + + movq mm0, [eax+ebx+ebx+color2] + movq mm1, mm3 + por mm1, mm5 + por mm1, mm7 + pand mm0, mm1 + movq mm1, mm4 + pand mm1, [I23Pixel] + por mm0, mm1 + movq mm1, mm6 + pand mm1, [product2b] + por mm0, mm1 + movq mm1, mm2 + pand mm1, [product2a] + por mm0, mm1 + movq [final2a], mm0 + + movq mm0, [eax+ebx+ebx+color3] + movq mm1, mm3 + por mm1, mm4 + por mm1, mm6 + pand mm0, mm1 + movq mm1, mm5 + pand mm1, [I23Pixel] + por mm0, mm1 + movq mm1, mm7 + pand mm1, [product2a] + por mm0, mm1 + movq mm1, mm2 + pand mm1, [product2b] + por mm0, mm1 + movq [final2b], mm0 + + + movq mm0, [final1a] + movq mm2, [final1b] + movq mm1, mm0 + movq mm4, [final2a] + movq mm6, [final2b] + movq mm5, mm4 + punpcklwd mm0, mm2 + punpckhwd mm1, mm2 + punpcklwd mm4, mm6 + punpckhwd mm5, mm6 + + + + +%ifdef FAR_POINTER + movq [fs:edx], mm0 + movq [fs:edx+8], mm1 + push edx + add edx, [ebp+dstPitch] + movq [fs:edx], mm4 + movq [fs:edx+8], mm5 + pop edx +%else + movq [edx], mm0 + movq [edx+8], mm1 + push edx + add edx, [ebp+dstPitch] + movq [edx], mm4 + movq [edx+8], mm5 + pop edx +%endif +.SKIP_PROCESS: + mov ecx, [ebp+deltaPtr] + add ecx, 8 + mov [ebp+deltaPtr], ecx + add edx, 16 + add eax, 8 + + pop ecx + sub ecx, 4 + cmp ecx, 0 + jg near .Loop + +; Restore some stuff + popad + mov esp, ebp + pop ebp + emms + ret + + +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- + + +;This is version 0.50 +colorI equ -2 +colorE equ 0 +colorF equ 2 +colorJ equ 4 + +colorG equ -2 +colorA equ 0 +colorB equ 2 +colorK equ 4 + +colorH equ -2 +colorC equ 0 +colorD equ 2 +colorL equ 4 + +colorM equ -2 +colorN equ 0 +colorO equ 2 +colorP equ 4 + +%ifdef __DJGPP__ +__2xSaILine: +%else +_2xSaILine: +%endif +; Store some stuff + push ebp + mov ebp, esp + pushad + +; Prepare the destination +%ifdef FAR_POINTER + ; Set the selector + mov eax, [ebp+dstSegment] + mov fs, ax +%endif + mov edx, [ebp+dstOffset] ; edx points to the screen +; Prepare the source + ; eax points to colorA + mov eax, [ebp+srcPtr] + mov ebx, [ebp+srcPitch] + mov ecx, [ebp+width] + ; eax now points to colorE + sub eax, ebx + + +; Main Loop +.Loop: push ecx + + cmp byte [snes9x_clear_change_log], 0 + jnz near .SKIP_DELTA_TEST + + ;-----Check Delta------------------ + mov ecx, [ebp+deltaPtr] + + movq mm0, [eax+colorI] + movq mm1, [eax+colorJ] + movq mm2, [eax+ebx+colorG] + movq mm3, [eax+ebx+colorK] + movq mm4, [eax+ebx+ebx+colorH] + movq mm5, [eax+ebx+ebx+colorL] + push eax + add eax, ebx + movq mm6, [eax+ebx+ebx+colorM] + movq mm7, [eax+ebx+ebx+colorP] + pop eax + + pcmpeqw mm0, [ecx+2+colorI] + pcmpeqw mm1, [ecx+2+colorK] + pcmpeqw mm2, [ecx+ebx+2+colorG] + pcmpeqw mm3, [ecx+ebx+2+colorK] + pcmpeqw mm4, [ecx+ebx+ebx+2+colorH] + pcmpeqw mm5, [ecx+ebx+ebx+2+colorL] + add ecx, ebx + pcmpeqw mm6, [ecx+ebx+ebx+2+colorM] + pcmpeqw mm7, [ecx+ebx+ebx+2+colorP] + sub ecx, ebx + + + pand mm0, mm1 + pand mm2, mm3 + pand mm4, mm5 + pand mm6, mm7 + pand mm0, mm2 + pand mm4, mm6 + pxor mm7, mm7 + pand mm0, mm4 + movq mm6, [eax+colorI] + pcmpeqw mm7, mm0 + + movq [ecx+2+colorI], mm6 + + packsswb mm7, mm7 + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_PROCESS + + ;End Delta +.SKIP_DELTA_TEST: + + ;--------------------------------- + + +;1 + ;if ((colorA == colorD) && (colorB != colorC) && (colorA == colorE) && (colorB == colorL) + movq mm0, [eax+ebx+colorA] ;mm0 and mm1 contain colorA + movq mm2, [eax+ebx+colorB] ;mm2 and mm3 contain colorB + + movq mm1, mm0 + movq mm3, mm2 + + pcmpeqw mm0, [eax+ebx+ebx+colorD] + pcmpeqw mm1, [eax+colorE] + pcmpeqw mm2, [eax+ebx+ebx+colorL] + pcmpeqw mm3, [eax+ebx+ebx+colorC] + + pand mm0, mm1 + pxor mm1, mm1 + pand mm0, mm2 + pcmpeqw mm3, mm1 + pand mm0, mm3 ;result in mm0 + + ;if ((colorA == colorC) && (colorB != colorE) && (colorA == colorF) && (colorB == colorJ) + movq mm4, [eax+ebx+colorA] ;mm4 and mm5 contain colorA + movq mm6, [eax+ebx+colorB] ;mm6 and mm7 contain colorB + movq mm5, mm4 + movq mm7, mm6 + + pcmpeqw mm4, [eax+ebx+ebx+colorC] + pcmpeqw mm5, [eax+colorF] + pcmpeqw mm6, [eax+colorJ] + pcmpeqw mm7, [eax+colorE] + + pand mm4, mm5 + pxor mm5, mm5 + pand mm4, mm6 + pcmpeqw mm7, mm5 + pand mm4, mm7 ;result in mm4 + + por mm0, mm4 ;combine the masks + movq [Mask1], mm0 + + ;-------------------------------------------- + +;2 + ;if ((colorB == colorC) && (colorA != colorD) && (colorB == colorF) && (colorA == colorH) + movq mm0, [eax+ebx+colorB] ;mm0 and mm1 contain colorB + movq mm2, [eax+ebx+colorA] ;mm2 and mm3 contain colorA + movq mm1, mm0 + movq mm3, mm2 + + pcmpeqw mm0, [eax+ebx+ebx+colorC] + pcmpeqw mm1, [eax+colorF] + pcmpeqw mm2, [eax+ebx+ebx+colorH] + pcmpeqw mm3, [eax+ebx+ebx+colorD] + + pand mm0, mm1 + pxor mm1, mm1 + pand mm0, mm2 + pcmpeqw mm3, mm1 + pand mm0, mm3 ;result in mm0 + + ;if ((colorB == colorE) && (colorB == colorD) && (colorA != colorF) && (colorA == colorI) + movq mm4, [eax+ebx+colorB] ;mm4 and mm5 contain colorB + movq mm6, [eax+ebx+colorA] ;mm6 and mm7 contain colorA + movq mm5, mm4 + movq mm7, mm6 + + pcmpeqw mm4, [eax+ebx+ebx+colorD] + pcmpeqw mm5, [eax+colorE] + pcmpeqw mm6, [eax+colorI] + pcmpeqw mm7, [eax+colorF] + + pand mm4, mm5 + pxor mm5, mm5 + pand mm4, mm6 + pcmpeqw mm7, mm5 + pand mm4, mm7 ;result in mm4 + + por mm0, mm4 ;combine the masks + movq [Mask2], mm0 + + +;interpolate colorA and colorB + movq mm0, [eax+ebx+colorA] + movq mm1, [eax+ebx+colorB] + + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + + ;assemble the pixels + movq mm1, [eax+ebx+colorA] + movq mm2, [eax+ebx+colorB] + + movq mm3, [Mask1] + movq mm5, mm1 + movq mm4, [Mask2] + movq mm6, mm1 + + pand mm1, mm3 + por mm3, mm4 + pxor mm7, mm7 + pand mm2, mm4 + + pcmpeqw mm3, mm7 + por mm1, mm2 + pand mm0, mm3 + + por mm0, mm1 + + punpcklwd mm5, mm0 + punpckhwd mm6, mm0 + +%ifdef FAR_POINTER + movq [fs:edx], mm5 + movq [fs:edx+8], mm6 +%else + movq [edx], mm5 + movq [edx+8], mm6 +%endif + +;------------------------------------------------ +; Create the Nextline +;------------------------------------------------ +;3 ;if ((colorA == colorD) && (colorB != colorC) && (colorA == colorG) && (colorC == colorO) + movq mm0, [eax+ebx+colorA] ;mm0 and mm1 contain colorA + movq mm2, [eax+ebx+ebx+colorC] ;mm2 and mm3 contain colorC + movq mm1, mm0 + movq mm3, mm2 + + push eax + add eax, ebx + pcmpeqw mm0, [eax+ebx+colorD] + pcmpeqw mm1, [eax+colorG] + pcmpeqw mm2, [eax+ebx+ebx+colorO] + pcmpeqw mm3, [eax+colorB] + pop eax + + pand mm0, mm1 + pxor mm1, mm1 + pand mm0, mm2 + pcmpeqw mm3, mm1 + pand mm0, mm3 ;result in mm0 + + ;if ((colorA == colorB) && (colorG != colorC) && (colorA == colorH) && (colorC == colorM) + movq mm4, [eax+ebx+colorA] ;mm4 and mm5 contain colorA + movq mm6, [eax+ebx+ebx+colorC] ;mm6 and mm7 contain colorC + movq mm5, mm4 + movq mm7, mm6 + + push eax + add eax, ebx + pcmpeqw mm4, [eax+ebx+colorH] + pcmpeqw mm5, [eax+colorB] + pcmpeqw mm6, [eax+ebx+ebx+colorM] + pcmpeqw mm7, [eax+colorG] + pop eax + + pand mm4, mm5 + pxor mm5, mm5 + pand mm4, mm6 + pcmpeqw mm7, mm5 + pand mm4, mm7 ;result in mm4 + + por mm0, mm4 ;combine the masks + movq [Mask1], mm0 + ;-------------------------------------------- + +;4 + ;if ((colorB == colorC) && (colorA != colorD) && (colorC == colorH) && (colorA == colorF) + movq mm0, [eax+ebx+ebx+colorC] ;mm0 and mm1 contain colorC + movq mm2, [eax+ebx+colorA] ;mm2 and mm3 contain colorA + movq mm1, mm0 + movq mm3, mm2 + + pcmpeqw mm0, [eax+ebx+colorB] + pcmpeqw mm1, [eax+ebx+ebx+colorH] + pcmpeqw mm2, [eax+colorF] + pcmpeqw mm3, [eax+ebx+ebx+colorD] + + pand mm0, mm1 + pxor mm1, mm1 + pand mm0, mm2 + pcmpeqw mm3, mm1 + pand mm0, mm3 ;result in mm0 + + ;if ((colorC == colorG) && (colorC == colorD) && (colorA != colorH) && (colorA == colorI) + movq mm4, [eax+ebx+ebx+colorC] ;mm4 and mm5 contain colorC + movq mm6, [eax+ebx+colorA] ;mm6 and mm7 contain colorA + movq mm5, mm4 + movq mm7, mm6 + + pcmpeqw mm4, [eax+ebx+ebx+colorD] + pcmpeqw mm5, [eax+ebx+colorG] + pcmpeqw mm6, [eax+colorI] + pcmpeqw mm7, [eax+ebx+ebx+colorH] + + pand mm4, mm5 + pxor mm5, mm5 + pand mm4, mm6 + pcmpeqw mm7, mm5 + pand mm4, mm7 ;result in mm4 + + por mm0, mm4 ;combine the masks + movq [Mask2], mm0 + ;---------------------------------------------- + +;interpolate colorA and colorC + movq mm0, [eax+ebx+colorA] + movq mm1, [eax+ebx+ebx+colorC] + + movq mm2, mm0 + movq mm3, mm1 + + pand mm0, [colorMask] + pand mm1, [colorMask] + + psrlw mm0, 1 + psrlw mm1, 1 + + pand mm3, [lowPixelMask] + paddw mm0, mm1 + + pand mm3, mm2 + paddw mm0, mm3 ;mm0 contains the interpolated values + ;------------- + + ;assemble the pixels + movq mm1, [eax+ebx+colorA] + movq mm2, [eax+ebx+ebx+colorC] + + movq mm3, [Mask1] + movq mm4, [Mask2] + + pand mm1, mm3 + pand mm2, mm4 + + por mm3, mm4 + pxor mm7, mm7 + por mm1, mm2 + + pcmpeqw mm3, mm7 + pand mm0, mm3 + por mm0, mm1 + movq [ACPixel], mm0 + +;//////////////////////////////// +; Decide which "branch" to take +;-------------------------------- + movq mm0, [eax+ebx+colorA] + movq mm1, [eax+ebx+colorB] + movq mm6, mm0 + movq mm7, mm1 + pcmpeqw mm0, [eax+ebx+ebx+colorD] + pcmpeqw mm1, [eax+ebx+ebx+colorC] + pcmpeqw mm6, mm7 + + movq mm2, mm0 + movq mm3, mm0 + + pand mm0, mm1 ;colorA == colorD && colorB == colorC + pxor mm7, mm7 + + pcmpeqw mm2, mm7 + pand mm6, mm0 + pand mm2, mm1 ;colorA != colorD && colorB == colorC + + pcmpeqw mm1, mm7 + + pand mm1, mm3 ;colorA == colorD && colorB != colorC + pxor mm0, mm6 + por mm1, mm6 + movq mm7, mm0 + movq [Mask2], mm2 + packsswb mm7, mm7 + movq [Mask1], mm1 + + movd ecx, mm7 + test ecx, ecx + jz near .SKIP_GUESS + +;--------------------------------------------- +; Map of the pixels: I|E F|J +; G|A B|K +; H|C D|L +; M|N O|P + movq mm6, mm0 + movq mm4, [eax+ebx+colorA] + movq mm5, [eax+ebx+colorB] + pxor mm7, mm7 + pand mm6, [ONE] + + movq mm0, [eax+colorE] + movq mm1, [eax+ebx+colorG] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+colorF] + movq mm1, [eax+ebx+colorK] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + push eax + add eax, ebx + movq mm0, [eax+ebx+colorH] + movq mm1, [eax+ebx+ebx+colorN] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + movq mm0, [eax+ebx+colorL] + movq mm1, [eax+ebx+ebx+colorO] + movq mm2, mm0 + movq mm3, mm1 + pcmpeqw mm0, mm4 + pcmpeqw mm1, mm4 + pcmpeqw mm2, mm5 + pcmpeqw mm3, mm5 + pand mm0, mm6 + pand mm1, mm6 + pand mm2, mm6 + pand mm3, mm6 + paddw mm0, mm1 + paddw mm2, mm3 + + pxor mm3, mm3 + pcmpgtw mm0, mm6 + pcmpgtw mm2, mm6 + pcmpeqw mm0, mm3 + pcmpeqw mm2, mm3 + pand mm0, mm6 + pand mm2, mm6 + paddw mm7, mm0 + psubw mm7, mm2 + + pop eax + movq mm1, mm7 + pxor mm0, mm0 + pcmpgtw mm7, mm0 + pcmpgtw mm0, mm1 + + por mm7, [Mask1] + por mm0, [Mask2] + movq [Mask1], mm7 + movq [Mask2], mm0 + +.SKIP_GUESS: + ;---------------------------- + ;interpolate A, B, C and D + movq mm0, [eax+ebx+colorA] + movq mm1, [eax+ebx+colorB] + movq mm4, mm0 + movq mm2, [eax+ebx+ebx+colorC] + movq mm5, mm1 + movq mm3, [qcolorMask] + movq mm6, mm2 + movq mm7, [qlowpixelMask] + + pand mm0, mm3 + pand mm1, mm3 + pand mm2, mm3 + pand mm3, [eax+ebx+ebx+colorD] + + psrlw mm0, 2 + pand mm4, mm7 + psrlw mm1, 2 + pand mm5, mm7 + psrlw mm2, 2 + pand mm6, mm7 + psrlw mm3, 2 + pand mm7, [eax+ebx+ebx+colorD] + + paddw mm0, mm1 + paddw mm2, mm3 + + paddw mm4, mm5 + paddw mm6, mm7 + + paddw mm4, mm6 + paddw mm0, mm2 + psrlw mm4, 2 + pand mm4, [qlowpixelMask] + paddw mm0, mm4 ;mm0 contains the interpolated value of A, B, C and D + +;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + ;assemble the pixels + movq mm1, [Mask1] + movq mm2, [Mask2] + movq mm4, [eax+ebx+colorA] + movq mm5, [eax+ebx+colorB] + pand mm4, mm1 + pand mm5, mm2 + + pxor mm7, mm7 + por mm1, mm2 + por mm4, mm5 + pcmpeqw mm1, mm7 + pand mm0, mm1 + por mm4, mm0 ;mm4 contains the diagonal pixels + + movq mm0, [ACPixel] + movq mm1, mm0 + punpcklwd mm0, mm4 + punpckhwd mm1, mm4 + + push edx + add edx, [ebp+dstPitch] + +%ifdef FAR_POINTER + movq [fs:edx], mm0 + movq [fs:edx+8], mm1 +%else + movq [edx], mm0 + movq [edx+8], mm1 +%endif + pop edx + +.SKIP_PROCESS: + mov ecx, [ebp+deltaPtr] + add ecx, 8 + mov [ebp+deltaPtr], ecx + add edx, 16 + add eax, 8 + + pop ecx + sub ecx, 4 + cmp ecx, 0 + jg near .Loop + +; Restore some stuff + popad + mov esp, ebp + pop ebp + emms + ret + +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- + +%ifdef __DJGPP__ +_Init_2xSaIMMX: +%else +Init_2xSaIMMX: +%endif +; Store some stuff + push ebp + mov ebp, esp + push edx + + +;Damn thing doesn't work +; mov eax,1 +; cpuid +; test edx, 0x00800000 ;test bit 23 +; jz end2 ;bit not set => no MMX detected + + mov eax, [ebp+8] ;PixelFormat + cmp eax, 555 + jz Bits555 + cmp eax, 565 + jz Bits565 +end2: + mov eax, 1 + jmp end +Bits555: + mov edx, 0x7BDE7BDE + mov eax, colorMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0x04210421 + mov eax, lowPixelMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0x739C739C + mov eax, qcolorMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0x0C630C63 + mov eax, qlowpixelMask + mov [eax], edx + mov [eax+4], edx + mov eax, 0 + jmp end +Bits565: + mov edx, 0xF7DEF7DE + mov eax, colorMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0x08210821 + mov eax, lowPixelMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0xE79CE79C + mov eax, qcolorMask + mov [eax], edx + mov [eax+4], edx + mov edx, 0x18631863 + mov eax, qlowpixelMask + mov [eax], edx + mov [eax+4], edx + mov eax, 0 + jmp end +end: + pop edx + mov esp, ebp + pop ebp + ret + + +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- +;------------------------------------------------------------------------- + + SECTION .data ALIGN = 32 +;Some constants +colorMask dd 0xF7DEF7DE,0xF7DEF7DE +lowPixelMask dd 0x08210821,0x08210821 + +qcolorMask dd 0xE79CE79C,0xE79CE79C +qlowpixelMask dd 0x18631863,0x18631863 + +darkenMask dd 0xC718C718,0xC718C718 +GreenMask dd 0x07E007E0,0x07E007E0 +RedBlueMask dd 0xF81FF81F,0xF81FF81F + +FALSE dd 0x00000000,0x00000000 +TRUE dd 0xffffffff,0xffffffff +ONE dd 0x00010001,0x00010001 + + + SECTION .bss ALIGN = 32 +ACPixel resb 8 +Mask1 resb 8 +Mask2 resb 8 + +I56Pixel resb 8 +I23Pixel resb 8 +I5556Pixel resb 8 +I2223Pixel resb 8 +I5666Pixel resb 8 +I2333Pixel resb 8 +Mask26 resb 8 +Mask35 resb 8 +Mask26b resb 8 +Mask35b resb 8 +product1a resb 8 +product1b resb 8 +product2a resb 8 +product2b resb 8 +final1a resb 8 +final1b resb 8 +final2a resb 8 +final2b resb 8 diff --git a/src/i386/asmaddr.h b/src/i386/asmaddr.h new file mode 100644 index 0000000..0f9702c --- /dev/null +++ b/src/i386/asmaddr.h @@ -0,0 +1,759 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#define NONE 0 +#define READ 1 +#define WRITE 2 +#define MODIFY 3 +#define JUMP 4 + +.macro GetCarry + movb _Carry, %dl + shrb %dl +.endm + +.macro GetNotCarry + cmpb $1, _Carry +.endm + +.macro SetZN + movb %al, _Zero + movb %al, _Negative +.endm + +.macro Set16ZN + movb %ah, _Negative + setnz _Zero +.endm + +.macro SetZNC + setc _Carry + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNC + setc _Carry + setnz _Zero + movb %ah, _Negative +.endm + +.macro SetZNCV + setc _Carry + seto _Overflow + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNCV + setc _Carry + seto _Overflow + setnz _Zero + movb %ah, _Negative +.endm + +.macro SetZNV + seto _Overflow + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNV + seto _Overflow + setnz _Zero + movb %ah, _Negative +.endm + + +/************* IMMEDIATE8 ****************/ +.Macro Immediate8 K A + movb (PC), %al + addl MemSpeed, CYCLES + incl PC +.endm + +/************* IMMEDIATE16 ****************/ +.macro Immediate16 K A + movw (PC), %ax + addl MemSpeedx2, CYCLES + addl $2, PC +.endm + +/************* Relative ****************/ +.macro Relative K A + movsbl (PC), %eax + incl PC + addl MemSpeed, CYCLES + movl PC, %edx + subl PCBase, %edx + addl %eax, %edx + andl $0xffff, %edx +.endm + +/************* RelativeLong ****************/ +.macro RelativeLong K A + xorl %eax, %eax + addl MemSpeedx2, CYCLES + movw (PC), %ax + addl $6, CYCLES + addl $2, PC + movl PC, %edx + subl PCBase, %edx + addl %eax, %edx + andl $0xffff, %edx +.endm + +/************* AbsoluteIndexedIndirect8 ****************/ +.macro AbsoluteIndexedIndirect8 K A + xorl %edx, %edx + addl MemSpeedx2, CYCLES + movw (PC), %dx + movb %dh, OpenBus + addw XX, %dx + orl ShiftedPB, %edx + addl $2, PC + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx +.if \A&READ + movb %ah, OpenBus +.endif +.endm + +/************* AbsoluteIndirectLong8 ****************/ +.macro AbsoluteIndirectLong8 K A + movw (PC), %dx + addl MemSpeedx2, CYCLES + movb %dh, OpenBus + addl $2, PC + andl $0xffff, %edx + pushl %edx + call S9xGetWord + popl %edx + pushl %eax + addl $2, %edx + call S9xGetByte +.if \A&READ + movb %al, OpenBus +.endif + popl %edx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + orl %eax, %edx +.endm + +.macro AbsoluteIndirect8 K A + movw (PC), %dx + addl MemSpeedx2, CYCLES + movb %dh, OpenBus + addl $2, PC + andl $0xffff, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx +.if \A&READ + movb %ah, OpenBus +.endif +.endm + +.macro Absolute8 K A + movw (PC), %dx + addl MemSpeedx2, CYCLES +.if \A&READ + movb %dh, OpenBus +.endif + addl $2, PC + andl $0xffff, %edx + orl ShiftedDB, %edx +.endm + +.macro AbsoluteLong8 K A +.if \A&READ + movb 2(PC), %dl + movb %dl, OpenBus +.endif + movl (PC), %edx + addl MemSpeedx2, CYCLES + andl $0xffffff, %edx + addl MemSpeed, CYCLES + add $3, PC +.endm + +.macro Direct8 K A + addl MemSpeed, CYCLES +#if 0 + cmpb $0, DL + je .Direct8\K + addl $6, CYCLES +.Direct8\K: +#endif + xorl %edx, %edx + movb (PC), %dl +.if \A&READ + movb %dl, OpenBus +.endif + addw DD, %dx + incl PC +.endm + +.macro DirectIndirectIndexed8 K A + addl MemSpeed, CYCLES +#if 0 + cmpb $0, DD + je .DirectIndirectIndexed8\K + addl $6, CYCLES +.DirectIndirectIndexed8\K: +#endif + xorl %edx, %edx + movb (PC), %dl + movb %dl, OpenBus + addw DD, %dx + incl PC + call S9xGetWord +.if \A&READ + movb %ah, OpenBus +.endif + movl ShiftedDB, %edx + movw %ax, %dx + xorl %eax, %eax + movw YY, %ax + addl %eax, %edx +.endm + +.macro DirectIndirectIndexedLong8 K A + addl MemSpeed, CYCLES +#if 0 + cmpb $0, DD + je .DirectIndirectIndexedLong8\K + addl $6, CYCLES +.DirectIndirectIndexedLong8\K: +#endif + xorl %edx, %edx + movb (PC), %dl + movb %dl, OpenBus + addw DD, %dx + incl PC + pushl %edx + call S9xGetWord + popl %edx + pushw %ax + addw $2, %dx + call S9xGetByte +.if \A&READ + movb %al, OpenBus +.endif + andl $0xff, %eax + sall $16, %eax + xorl %edx, %edx + popw %ax + movw YY, %dx + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro DirectIndexedIndirect8 K A + addl MemSpeed, CYCLES + addl $6, CYCLES +#if 0 + cmpb $0, DD + je .DirectIndexedIndirect8\K + addl $6, CYCLES +.DirectIndexedIndirect8\K: +#endif + xorl %edx, %edx + movb (PC), %dl + movb %dl, OpenBus + addw DD, %dx + incl PC + addw XX, %dx + call S9xGetWord +.if \A&READ + movb %ah, OpenBus +.endif + movl ShiftedDB, %edx + movw %ax, %dx +.endm + +.macro DirectIndexedX8 K A + addl MemSpeed, CYCLES + addl $6, CYCLES +#if 0 + cmpb $0, DD + je .DirectIndexedX8\K + addl $6, CYCLES +.DirectIndexedX8\K: +#endif + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC +.if \A&READ + movb %dl, OpenBus +.endif + + addw XX, %dx + testw $Emulation, FLAGS16 + jz .DirectIndexedX8done\K + andw $0x00ff, %dx /* Zero page indexed wraps in emulation mode */ +.DirectIndexedX8done\K: +.endm + +.macro DirectIndexedY8 K A + addl MemSpeed, CYCLES + addl $6, CYCLES +#if 0 + cmpb $0, DD + je .DirectIndexedY8\K + addl $6, CYCLES +.DirectIndexedY8\K: +#endif + xorl %edx, %edx + movb (PC), %dl +.if \A&READ + movb %dl, OpenBus +.endif + addw DD, %dx + incl PC + addw YY, %dx + testw $Emulation, FLAGS16 + jz .DirectIndexedY8done\K + andw $0x00ff, %dx +.DirectIndexedY8done\K: + +.endm + +.macro AbsoluteIndexedX8 K A + movl ShiftedDB, %edx + xorl %eax, %eax + movw (PC), %dx + movw XX, %ax +.if \A&READ + movb %dh, OpenBus +.endif + addl $2, PC + addl %eax, %edx + addl MemSpeedx2, CYCLES + andl $0xffffff, %edx +.endm + +.macro AbsoluteIndexedY8 K A + movl ShiftedDB, %edx + xorl %eax, %eax + movw (PC), %dx + movw YY, %ax +.if \A&READ + movb %dh, OpenBus +.endif + addl $2, PC + addl %eax, %edx + addl MemSpeedx2, CYCLES + andl $0xffffff, %edx +.endm + +.macro AbsoluteLongIndexedX8 K A +.if \A&READ + movb 2(PC), %dl + movb %dl, OpenBus +.endif + movl (PC), %edx + xorl %eax, %eax + addl $3, PC + movw XX, %ax + addl MemSpeedx2, CYCLES + addl %eax, %edx + addl MemSpeed, CYCLES + andl $0xffffff, %edx +.endm + +.macro DirectIndirect8 K A +#if 0 + cmpb $0, DL + je .DirectIndirect8\K + addl $6, CYCLES +.DirectIndirect8\K: +#endif + xorl %edx, %edx + addl MemSpeed, CYCLES + movb (PC), %dl + movb %dl, OpenBus + addw DD, %dx + incl PC + call S9xGetWord +.if \A&READ + movb %ah, OpenBus +.endif + movl ShiftedDB, %edx + movw %ax, %dx +.endm + +.macro DirectIndirectLong8 K A +#if 0 + cmpb $0, DL + je .DirectIndirectLong8\K + addl $6, CYCLES +.DirectIndirectLong8\K: +#endif + xorl %edx, %edx + addl MemSpeed, CYCLES + movb (PC), %dl + movb %dl, OpenBus + addw DD, %dx + incl PC + pushl %edx + call S9xGetWord + popl %edx + pushw %ax + addw $2, %dx + call S9xGetByte +.if \A&READ + movb %al, OpenBus +.endif + andl $0xff, %eax + sall $16, %eax + popw %ax + movl %eax, %edx +.endm + +.macro StackRelative8 K A + xorl %edx, %edx + addl MemSpeed, CYCLES + movb (PC), %dl +.if \A&READ + movb %dl, OpenBus +.endif + addl $6, CYCLES + addw SS, %dx + incl PC +.endm + +.macro StackRelativeIndirectIndexed8 K A + xorl %edx, %edx + addl MemSpeed, CYCLES + movb (PC), %dl + movb %dl, OpenBus + addl $12, CYCLES + addw SS, %dx + incl PC + call S9xGetWord +.if \A&READ + movb %ah, OpenBus +.endif + movl ShiftedDB, %edx + movw %ax, %dx + xorl %eax, %eax + movw YY, %ax + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro BranchCheck0 K + cmpb $0, BranchSkip + jz .BranchCheck0S9xExit\K + movb $0, BranchSkip + movl PC, %eax + subl PCBase, %eax + cmpw %dx, %ax + jbe .BranchCheck0S9xExit\K + jmp MainAsmLoop +.BranchCheck0S9xExit\K: +.endm + +.macro BranchCheck1 K + cmpb $0, BranchSkip + jz .BranchCheck1S9xExit\K + movb $0, BranchSkip + movl PC, %eax + subl PCBase, %eax + cmpw %dx, %ax + jbe .BranchCheck1S9xExit\K + jmp MainAsmLoop +.BranchCheck1S9xExit\K: +.endm + +.macro BranchCheck2 K + cmpb $0, BranchSkip + jz .BranchCheck2S9xExit\K + movb $0, BranchSkip + movl PC, %eax + subl PCBase, %eax + cmpw %dx, %ax + jbe .BranchCheck2S9xExit\K + jmp MainAsmLoop +.BranchCheck2S9xExit\K: +.endm + +#if 0 +.macro PushByte K + addl $8, CYCLES + xorl %edx, %edx + movl RAM, %ecx + movw SS, %dx + movb %al, (%ecx, %edx) + decw SS +.endm + +.macro PushWord K + addl $16, CYCLES + xorl %edx, %edx + movl RAM, %ecx + movw SS, %dx + decl %ecx + movw %ax, (%ecx, %edx) + subw $2, %dx + movw %dx, SS +.endm + +.macro PullByte K + addl $8, CYCLES + xorl %edx, %edx + movl RAM, %eax + movw SS, %dx + incl %edx + movw %dx, SS + movb (%eax, %edx), %al +.endm + +.macro PullWord K + addl $16, CYCLES + xorl %edx, %edx + movl RAM, %eax + movw SS, %edx + addw $2, %dx + movw %dx, SS + movw -1(%eax, %edx), %ax +.endm +#else +.macro PushByte K + movl SS, %edx + andl $0xffff, %edx + call S9xSetByte + decw SS +.endm + +.macro PushByteE K + movl SS, %edx + andl $0x00ff, %edx + movb $0x01, %dh + movw %dx, SS + call S9xSetByte +.endm + +#if 0 +.macro PushWord K + movl SS, %edx + decl %edx + andl $0xffff, %edx + call S9xSetWord + subw $2, SS +.endm +#endif +#if 1 +.macro PushWord K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + decw %dx + call S9xSetByte + subw $2, SS +.endm +#endif + +.macro PushWordE K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + decw %dx + movb $0x01, %dh + call S9xSetByte + subw $2, SS +.endm + +.macro PushWordENew K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + decw %dx + call S9xSetByte + movb $0x01, %dh + subw $2, SS +.endm + +.macro PullByte K + movl SS, %edx + incl %edx + movw %dx, SS + andl $0xffff, %edx + call S9xGetByte +.endm + +.macro PullByteE K + movl SS, %edx + incl %edx + andl $0xffff, %edx + movb $0x01, %dh + call S9xGetByte + movw %dx, SS +.endm + +#if 0 +.macro PullWord K + movl SS, %edx + incl %edx + andl $0xffff, %edx + call S9xGetWord + addw $2, SS +.endm +#else + +.macro PullWord K + movl SS, %edx + incw %dx + andl $0xffff, %edx + pushl %edx + call S9xGetByte + movb %al, OpenBus + popl %edx + incw %dx + call S9xGetByte + movb %al, %ah + movb OpenBus, %al + movw %dx, SS +.endm +#endif + +.macro PullWordE K + movl SS, %edx + andl $0xffff, %edx + incw %dx + movb $0x01, %dh + pushl %edx + call S9xGetByte + popl %edx + movb %al, OpenBus + incw %dx + movb $0x01, %dh + call S9xGetByte + movb %al, %ah + movb OpenBus, %al + movw %dw, SS +.endm + +.macro PullWordENew K + movl SS, %edx + incw %dx + andl $0xffff, %edx + pushl %edx + call S9xGetByte + movb %al, OpenBus + popl %edx + incw %dx + call S9xGetByte + movb %al, %ah + movb OpenBus, %al + movb $0x01, %dh + movw %dx, SS +.endm +#endif + diff --git a/src/i386/asmops.h b/src/i386/asmops.h new file mode 100644 index 0000000..81cd16d --- /dev/null +++ b/src/i386/asmops.h @@ -0,0 +1,894 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro Adc8 K + testb $Decimal, FLAGS + jnz .ADC8Decimal\K + GetCarry + adcb AL, %al + SetZNCV + movb %al, AL + jmp MainAsmLoop + +.ADC8Decimal\K: + mov %al, %ah + mov AL, %dl + mov %al, %dh + andb $0x0f, %dl + andb $0x0f, %dh + add %dl, %dh + GetCarry + jnc .ADC8DecimalNoCarry\K + inc %dh +.ADC8DecimalNoCarry\K: + cmp $0x1a, %dh + jb .ADC8DecimalNoAdj\K + andb $0xf7, AL + andb $0xf7, %al +.ADC8DecimalNoAdj\K: + GetCarry + adcb AL, %al + daa + movb AL, %dl + movb %al, AL + SetZNC + xor %dl, %ah + not %ah + xor %al, %dl + and %dl, %ah + and $0x80, %ah + shr $7, %ah + mov %ah, _Overflow + jmp MainAsmLoop +.endm + +.macro Adc16 K + testb $Decimal, FLAGS + jnz .ADC16Decimal\K + GetCarry + adcw AA, %ax + movw %ax, AA + setc _Carry + seto _Overflow + setnz _Zero + movb %ah, _Negative + jmp MainAsmLoop + +.ADC16Decimal\K: + + push %ecx + push %esi + movsx %ax, %edx + push %edx + push %edi + movw AA, %si + and $0xf000, %eax + mov %edx, %edi + shl $4, %eax + and $0x0f00, %edi + or %edi, %eax + mov %edx, %edi + shl $4, %eax + and $0x00f0, %edi + and $0x000f, %edx + or %edi, %eax + pop %edi + + movsx %si, %ecx + shl $4, %eax + or %edx, %eax + and $0xf000, %esi + mov %ecx, %edx + shl $4, %esi + and $0x0f00, %edx + or %edx, %esi + mov %ecx, %edx + shl $4, %esi + and $0x00f0, %edx + and $0x000f, %ecx + or %edx, %esi + shl $4, %esi + or %ecx, %esi + mov %esi, %ecx + + or $0x90909090, %eax + mov $4, %esi +.ADC16DecimalAddLoop\K: + GetCarry + adcb %cl, %al + daa + setc _Carry + shr $8, %ecx + shrd $4, %eax, %edx + shr $8, %eax + dec %esi + jne .ADC16DecimalAddLoop\K + shr $16, %edx + pop %ecx + mov AA, %ax + + xor %cx, %ax + not %ax + xor %dx, %cx + and %cx, %ax + and $0x8000, %ax + shr $7, %ah + mov %ah, _Overflow + + movw %dx, AA + movb %dh, _Negative + orb %dh, %dl + movb %dl, _Zero + pop %esi + pop %ecx + jmp MainAsmLoop +.endm + +.macro Sbc8 K + testb $Decimal, FLAGS + jnz .SBC8Decimal\K + GetNotCarry + sbbb %al, AL + movb AL, %al + setnc _Carry + SetZNV + jmp MainAsmLoop + +.SBC8Decimal\K: + GetNotCarry + movb %al, %dl + movb AL, %al + sbbb %dl, %al + das + movb %al, AL + setnc _Carry + SetZNV + jmp MainAsmLoop +.endm + +.macro Sbc16 K + testb $Decimal, FLAGS + jnz .SBC16Decimal\K + GetNotCarry + sbbw %ax, AA + setnc _Carry + setnz _Zero + seto _Overflow + movb AH, %al + movb %al, _Negative + jmp MainAsmLoop + +.SBC16Decimal\K: + movl %eax, %edx + movw AA, %ax + GetNotCarry + sbbb %dl, %al + das + movb %al, AL + movb %ah, %al + sbbb %dh, %al + das + movb %al, AH + setnc _Carry + seto _Overflow + movw AA, %ax + movb %ah, _Negative + orb %ah, %al + movb %al, _Zero + jmp MainAsmLoop +.endm + +.macro Ora8 K + orb AL, %al + movb %al, AL + SetZN + jmp MainAsmLoop +.endm + +.macro Ora16 K + orw AA, %ax + movw %ax, AA + Set16ZN + jmp MainAsmLoop +.endm + +.macro Eor8 K + xorb AL, %al + movb %al, AL + SetZN + jmp MainAsmLoop +.endm + +.macro Eor16 K + xorw AA, %ax + movw %ax, AA + Set16ZN + jmp MainAsmLoop +.endm + +.macro And8 K + andb AL, %al + movb %al, AL + SetZN + jmp MainAsmLoop +.endm + +.macro And16 K + andw AA, %ax + movw %ax, AA + Set16ZN + jmp MainAsmLoop +.endm + +.macro Lda8 K + movb %al, AL + SetZN + jmp MainAsmLoop +.endm + +.macro Lda16 K + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop +.endm + +.macro Ldx8 K + movb %al, XL + SetZN + jmp MainAsmLoop +.endm + +.macro Ldx16 K + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp MainAsmLoop +.endm + +.macro Ldy8 K + movb %al, YL + SetZN + jmp MainAsmLoop +.endm + +.macro Ldy16 K + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp MainAsmLoop +.endm + +.macro Cmp8 K + movb AL, %ah + subb %al, %ah + setnc _Carry + movb %ah, _Negative + movb %ah, _Zero + jmp MainAsmLoop +.endm + +.macro Cmp16 K + movw AA, %dx + subw %ax, %dx + setnc _Carry + setnz _Zero + movb %dh, _Negative + jmp MainAsmLoop +.endm + +.macro Cpx8 K + movb XL, %ah + subb %al, %ah + setnc _Carry + movb %ah, _Negative + movb %ah, _Zero + jmp MainAsmLoop +.endm + +.macro Cpx16 K + movw XX, %dx + subw %ax, %dx + setnc _Carry + setnz _Zero + movb %dh, _Negative + jmp MainAsmLoop +.endm + +.macro Cpy8 K + movb YL, %ah + subb %al, %ah + setnc _Carry + movb %ah, _Negative + movb %ah, _Zero + jmp MainAsmLoop +.endm + +.macro Cpy16 K + movw YY, %dx + subw %ax, %dx + setnc _Carry + setnz _Zero + movb %dh, _Negative + jmp MainAsmLoop +.endm + +.macro Asl8 K + pushl %edx + call S9xGetByte + addl $6, CYCLES + salb %al + SetZNC + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Asl16 K + pushl %edx + call S9xGetWord + addl $6, CYCLES + salw %ax + Set16ZNC + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Lsr8 K + pushl %edx + call S9xGetByte + addl $6, CYCLES + shrb %al + SetZNC + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Lsr16 K + pushl %edx + call S9xGetWord + addl $6, CYCLES + shrw %ax + Set16ZNC + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Rol8 K + pushl %edx + call S9xGetByte + addl $6, CYCLES + GetCarry + rclb %al + SetZNC + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Rol16 K + pushl %edx + call S9xGetWord + addl $6, CYCLES + GetCarry + rclw %ax + setc _Carry + movb %ah, _Negative + testw %ax, %ax + setnz _Zero + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Ror8 K + pushl %edx + call S9xGetByte + addl $6, CYCLES + GetCarry + rcrb %al + SetZNC + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Ror16 K + pushl %edx + call S9xGetWord + addl $6, CYCLES + GetCarry + rcrw %ax + setc _Carry + movb %ah, _Negative + testw %ax, %ax + setnz _Zero + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Bit8 K + call S9xGetByte + movb %al, _Negative + testb $0x40, %al + setnz _Overflow + andb AL, %al + movb %al, _Zero + jmp MainAsmLoop +.endm + +.macro Bit16 K + call S9xGetWord + movb %ah, _Negative + testb $0x40, %ah + setnz _Overflow + andw AA, %ax + setnz _Zero + jmp MainAsmLoop +.endm + +.macro Dec8 K + pushl %edx + addl $6, CYCLES + call S9xGetByte +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + decb %al + SetZN + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Dec16 K + pushl %edx + addl $6, CYCLES + call S9xGetWord +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + decw %ax + Set16ZN + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Inc8 K + pushl %edx + addl $6, CYCLES + call S9xGetByte +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + incb %al + SetZN + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Inc16 K + pushl %edx + addl $6, CYCLES + call S9xGetWord +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + incw %ax + Set16ZN + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Sta8 K + movb AL, %al + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Sta16 K + movw AA, %ax + call S9xSetWord + jmp MainAsmLoop +.endm + +.macro Stx8 K + movb XL, %al + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Stx16 K + movw XX, %ax + call S9xSetWord + jmp MainAsmLoop +.endm + +.macro Sty8 K + movb YL, %al + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Sty16 K + movw YY, %ax + call S9xSetWord + jmp MainAsmLoop +.endm + +.macro Stz8 K + xorb %al, %al + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Stz16 K + xorl %eax, %eax + call S9xSetWord + jmp MainAsmLoop +.endm + +.macro Trb8 K + pushl %edx + addl $6, CYCLES + call S9xGetByte + movb AL, %dl + testb %al, %dl + setnz _Zero + xorb $0xff, %dl + andb %dl, %al + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Trb16 K + pushl %edx + addl $6, CYCLES + call S9xGetWord + movw AA, %dx + testw %ax, %dx + setnz _Zero + xorl $0xffffffff, %edx + andl %edx, %eax + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro Tsb8 K + pushl %edx + addl $6, CYCLES + call S9xGetByte + movb AL, %dl + testb %al, %dl + setnz _Zero + orb %dl, %al + popl %edx + call S9xSetByte + jmp MainAsmLoop +.endm + +.macro Tsb16 K + pushl %edx + addl $6, CYCLES + call S9xGetWord + movw AA, %dx + testw %ax, %dx + setnz _Zero + orw %dx, %ax + popl %edx +#if 0 + call S9xSetWord +#else + pushl %eax + pushl %edx + incl %edx + movb %ah, %al + call S9xSetByte + popl %edx + popl %eax + call S9xSetByte +#endif + jmp MainAsmLoop +.endm + +.macro CheckForIrq K + testb $0xff, IRQActive + jz .CheckForIrqS9xExit\K + testb $IRQ, FLAGS + jnz .CheckForIrqS9xExit\K + testb $0xff, DisableIRQ + jnz .CheckForIrqS9xExit\K + call S9xOpcode_IRQ +.CheckForIrqS9xExit\K: +.endm + +.macro S9xFixCycles K + testw $Emulation, FLAGS16 + jz .S9xFixCyclesNoEmulation\K + movl $S9xOpcodesE1, CPUOpcodes + jmp .S9xFixCyclesS9xExit\K + +.S9xFixCyclesNoEmulation\K: + testb $MemoryFlag, FLAGS + jz .S9xFixCyclesNoMemory\K + testb $IndexFlag, FLAGS + jz .S9xFixCyclesNoIndex\K + movl $S9xOpcodesM1X1, CPUOpcodes + jmp .S9xFixCyclesS9xExit\K +.S9xFixCyclesNoIndex\K: + movl $S9xOpcodesM1X0, CPUOpcodes + jmp .S9xFixCyclesS9xExit\K + +.S9xFixCyclesNoMemory\K: + testb $IndexFlag, FLAGS + jz .S9xFixCyclesNoIndex2\K + movl $S9xOpcodesM0X1, CPUOpcodes + jmp .S9xFixCyclesS9xExit\K +.S9xFixCyclesNoIndex2\K: + movl $S9xOpcodesM0X0, CPUOpcodes +.S9xFixCyclesS9xExit\K: +.endm + +.macro S9xUnpackStatus K + movb FLAGS, %al + movb %al, _Negative + testb $Zero, %al + setz _Zero + testb $Carry, FLAGS + setnz _Carry + testb $Overflow, FLAGS + setnz _Overflow +.endm + +.macro S9xPackStatus K +// movb _Carry, %al + andb $~(Zero | Negative | Carry | Overflow), FLAGS +// orb %al, FLAGS + movb _Negative, %al + andb $0x80, %al + orb _Carry, %al + orb %al, FLAGS + movb _Overflow, %al + salb $6, %al + orb %al, FLAGS + testb $0xff, _Zero + setz %al + salb %al + orb %al, FLAGS +.endm + +.macro CPUShutdown K +#ifdef CPU_SHUTDOWN + testb $0xff, Shutdown + jz .NoCPUShutdown\K + cmpl PC, WaitAddress + jne .NoCPUShutdown\K + cmpl $0, WaitCounter + jnz .CPUShutdownNotYet\K + movl Flags, %eax + andl $NMI_FLAG | IRQ_PENDING_FLAG, %eax + jnz .CPUShutdownNotYet\K + + movl $0, WaitAddress + movl NextEvent, CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + testb $0xff, APUExecuting + jz .NoCPUShutdown\K + + pushl %edx + movb $0, CPUExecuting +.CPUShutdownAPUExecLoop\K: +#ifdef DEBUGGER + testb $2,APUFlags + je .CPUShutdownNoAPUTrace\K + STORE_REGISTERS + ccall S9xTraceAPU + LOAD_REGISTERS +.CPUShutdownNoAPUTrace\K: +#endif + xorl %eax,%eax +#ifdef SPC700_C + movl APUPC, %edx + SAVE_CYCLES + movb (%edx),%al +#else + movb (APUPC), %al +#endif + movl S9xAPUCycles(,%eax,4), %edx + movl S9xApuOpcodes(,%eax,4),%eax + addl %edx, APUCycles + call *%eax +#ifdef SPC700_C + LOAD_CYCLES +#endif + movl NextEvent, %eax + cmpl %eax, APUCycles + jl .CPUShutdownAPUExecLoop\K + + popl %edx + movb $1, CPUExecuting + jmp .NoCPUShutdown\K + +.CPUShutdownNotYet\K: + cmpl $2, WaitCounter + jb .CPUShutdownDecCounter\K + movl $1, WaitCounter + jp .NoCPUShutdown\K +.CPUShutdownDecCounter\K: + decl WaitCounter +.NoCPUShutdown\K: +#endif +.endm + diff --git a/src/i386/asmstruc.h b/src/i386/asmstruc.h new file mode 100644 index 0000000..4291381 --- /dev/null +++ b/src/i386/asmstruc.h @@ -0,0 +1,268 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#if defined(__DJGCC) || defined(MICROSOFT_C) || defined(_WINDOWS) +#define S9xTraceMessage _S9xTraceMessage +#define S9xGetPPU _S9xGetPPU +#define S9xSetPPU _S9xSetPPU +#define S9xSetDSP _S9xSetDSP +#define S9xGetDSP _S9xGetDSP +#define S9xGetCPU _S9xGetCPU +#define S9xSetCPU _S9xSetCPU +#define S9xGetC4 _S9xGetC4 +#define S9xSetC4 _S9xSetC4 +#define S9xSyncSpeed _S9xSyncSpeed +#define S9xTrace _S9xTrace +#define S9xDoHBlankProcessing _S9xDoHBlankProcessing +#define S9xTraceAPU _S9xTraceAPU +#define S9xGetWord _S9xGetWord +#define S9xGetByte _S9xGetByte +#define S9xSetWord _S9xSetWord +#define S9xSetByte _S9xSetByte +#define S9xSetPCBase _S9xSetPCBase +#define memset _memset +#define S9xDoHDMA _S9xDoHDMA +#define S9xStartHDMA _S9xStartHDMA +#define S9xEndScreenRefresh _S9xEndScreenRefresh +#define S9xStartScreenRefresh _S9xStartScreenRefresh +#define S9xSetAPUControl _S9xSetAPUControl +#define S9xSetAPUDSP _S9xSetAPUDSP +#define S9xGetAPUDSP _S9xGetAPUDSP +#define S9xTextMode _S9xTextMode +#define printf _printf +#define S9xSetAPUTimer _S9xSetAPUTimer +#define S9xAPUOPrint _S9xAPUOPrint +#define S9xSuperFXExec _S9xSuperFXExec +#define S9xGenerateSound _S9xGenerateSound +#define S9xUpdateJoypads _S9xUpdateJoypads +#define S9xMainLoop _S9xMainLoop +#define S9xDeinterleaveMode2 _S9xDeinterleaveMode2 +#define RenderLine _RenderLine +#define S9xSetIRQ _S9xSetIRQ +#define S9xClearIRQ _S9xClearIRQ +#define SA1 _SA1 +#define CPU _CPU +#define ICPU _ICPU +#define Settings _Settings +#define PPU _PPU +#define IPPU _IPPU +#define Registers _Registers +#define Memory _Memory +#define APU _APU +#define IAPU _IAPU +#define SoundData _SoundData +#define APURegisters _APURegisters +#define S9xBreakpoint _S9xBreakpoint +#define missing _missing +#define OpenBus _OpenBus +#define S9xApuOpcodes _S9xApuOpcodes +#define S9xAPUCycles _S9xAPUCycles +#define S9xMessage _S9xMessage +#define String _String +#define sprintf _sprintf +#define S9xSA1ExecuteDuringSleep _S9xSA1ExecuteDuringSleep +#define S9xGetSPC7110Byte _S9xGetSPC7110Byte +#define S9xGetSPC7110 _S9xGetSPC7110 +#define GetOBC1 _GetOBC1 +#define SetOBC1 _SetOBC1 +#define S9xGetSetaDSP _S9xGetSetaDSP +#define S9xSetSetaDSP _S9xSetSetaDSP +#define S9xGetST018 _S9xGetST018 +#define S9xSetST018 _S9xSetST018 +#define S9xUpdateAPUTimer _S9xUpdateAPUTimer + +#define A1 _A1 +#define A2 _A2 +#define A3 _A3 +#define A4 _A4 +#define Work8 _Work8 +#define Work16 _Work16 +#define Work32 _Work32 +#define Int8 _Int8 +#define Int16 _Int16 +#define Int32 _Int32 +#define S9xE1M1X1 _S9xE1M1X1 +#define S9xE0M1X1 _S9xE0M1X1 +#define S9xE0M1X0 _S9xE0M1X0 +#define S9xE0M0X1 _S9xE0M0X1 +#define S9xE0M0X0 _S9xE0M0X0 +#define S9xOpcodesE1 _S9xOpcodesE1 +#define S9xOpcodesM1X1 _S9xOpcodesM1X1 +#define S9xOpcodesM1X0 _S9xOpcodesM1X0 +#define S9xOpcodesM0X1 _S9xOpcodesM0X1 +#define S9xOpcodesM0X0 _S9xOpcodesM0X0 +#define APUROM _APUROM +#define W1 _W1 +#define W2 _W2 +#define W3 _W3 +#define W4 _W4 +#define ebx_save _ebx_save +#endif + +#include "offsets.h" + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define DEBUG_MODE_FLAG (1 << 0) +#define TRACE_FLAG (1 << 1) +#define SINGLE_STEP_FLAG (1 << 2) +#define BREAK_FLAG (1 << 3) +#define SCAN_KEYS_FLAG (1 << 4) +#define SAVE_SNAPSHOT_FLAG (1 << 5) +#define DELAYED_NMI_FLAG (1 << 6) +#define NMI_FLAG (1 << 7) +#define PROCESS_SOUND_FLAG (1 << 8) +#define FRAME_ADVANCE_FLAG (1 << 9) +#define DELAYED_NMI_FLAG2 (1 << 10) +#define IRQ_PENDING_FLAG (1 << 11) + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT 12 +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) +#define ONE_CYCLE 6 + +#define CYCLES %esi +#define PC %edi +#ifdef SPC700_C +#define APUPC APUPCS +#else +#define APUPC %ebp +#endif + +#define FLAGS %bl +#define FLAGS16 %bx + +#define LOAD_CYCLES movl Cycles, CYCLES +#define SAVE_CYCLES movl CYCLES, Cycles + +.macro LOAD_REGISTERS + LOAD_CYCLES + movl PCS, PC +#ifndef SPC700_C + movl APUPCS, APUPC +#endif + movw PP, FLAGS16 +.endm + +.macro STORE_REGISTERS + SAVE_CYCLES + movl PC, PCS +#ifndef SPC700_C + movl APUPC, APUPCS +#endif + movw FLAGS16, PP +.endm + +.macro PUSH_REGISTERS + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx +.endm + +.macro POP_REGISTERS + popl %ebx + popl %esi + popl %edi + popl %ebp +.endm + +.macro ccall name + call \name +.endm + diff --git a/src/i386/bilinear.asm b/src/i386/bilinear.asm new file mode 100644 index 0000000..4ff392b --- /dev/null +++ b/src/i386/bilinear.asm @@ -0,0 +1,432 @@ +;%define FAR_POINTER + BITS 32 + +%ifdef __DJGPP__ + GLOBAL _BilinearMMX + GLOBAL _BilinearMMXGrid0 + GLOBAL _BilinearMMXGrid1 + GLOBAL _EndMMX +%else + GLOBAL BilinearMMX + GLOBAL BilinearMMXGrid0 + GLOBAL BilinearMMXGrid1 + GLOBAL EndMMX +%endif + + SECTION .text ALIGN = 32 + +%ifdef __DJGPP__ +_BilinearMMX: +%else +BilinearMMX: +%endif +; Store some stuff + push ebp + mov ebp, esp + + push ebx + mov eax, [ebp+24] ;dx + mov ebx, [ebp+28] ;dy + push edx + + movq mm0, [eax] + movq mm1, [ebx] + + psrlw mm0, 11 ;reduce to 5 bits + psrlw mm1, 11 + + movq [eax], mm0 + movq [ebx], mm1 + + mov edx, [ebp+20] ;D + pmullw mm0, mm1 + movq mm5, [RedMask] + movq mm6, [GreenMask] + movq mm7, [BlueMask] + psrlw mm0, 5 + + pand mm5, [edx] + pand mm6, [edx] + + psrlw mm5, 5 + pand mm7, [edx] + + pmullw mm5, mm0 + pmullw mm6, mm0 + pmullw mm7, mm0 + + movq mm4, mm0 ;store x*y + + + mov edx, [ebp+16] ;C + movq mm0, [ebx] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+12] ;B + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + movq mm0, [eax] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+8] ;A + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + + movq mm0, [All32s] + movq mm1, mm4 + movq mm2, [eax] + movq mm3, [ebx] + paddw mm0, mm1 + paddw mm2, mm3 + psubw mm0, mm2 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+32] + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + psrlw mm6, 5 + psrlw mm7, 5 + + pand mm5, [RedMask] + pand mm6, [GreenMask] + pand mm7, [BlueMask] + + por mm5, mm6 + por mm7, mm5 +%ifdef FAR_POINTER + movq [fs:edx], mm7 +%else + movq [edx], mm7 +%endif + pop edx + pop ebx + mov esp, ebp + pop ebp + ret + + +_BilinearMMXGrid0: +; Store some stuff + push ebp + mov ebp, esp + + push ebx + mov eax, [ebp+24] ;dx + mov ebx, [ebp+28] ;dy + push edx + + movq mm0, [eax] + movq mm1, [ebx] + + psrlw mm0, 11 ;reduce to 5 bits + psrlw mm1, 11 + + movq [eax], mm0 + movq [ebx], mm1 + + mov edx, [ebp+20] ;D + pmullw mm0, mm1 + movq mm5, [RedMask] + movq mm6, [GreenMask] + movq mm7, [BlueMask] + psrlw mm0, 5 + + pand mm5, [edx] + pand mm6, [edx] + + psrlw mm5, 5 + pand mm7, [edx] + + pmullw mm5, mm0 + pmullw mm6, mm0 + pmullw mm7, mm0 + + movq mm4, mm0 ;store x*y + + + mov edx, [ebp+16] ;C + movq mm0, [ebx] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+12] ;B + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + movq mm0, [eax] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+8] ;A + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + + movq mm0, [All32s] + movq mm1, mm4 + movq mm2, [eax] + movq mm3, [ebx] + paddw mm0, mm1 + paddw mm2, mm3 + psubw mm0, mm2 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+32] + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + psrlw mm6, 5 + psrlw mm7, 5 + + pand mm5, [RedMask] + pand mm6, [GreenMask] + pand mm7, [BlueMask] + + por mm5, mm6 + pxor mm0, mm0 + movq mm6, mm7 + por mm7, mm5 + por mm6, mm5 + punpcklwd mm6, mm0 + punpckhwd mm7, mm0 +%ifdef FAR_POINTER + movq [fs:edx], mm6 + movq [fs:edx+8], mm7 +%else + movq [edx], mm6 + movq [edx+8], mm7 +%endif + pop edx + pop ebx + mov esp, ebp + pop ebp + ret + +_BilinearMMXGrid1: +; Store some stuff + push ebp + mov ebp, esp + + push ebx + mov eax, [ebp+24] ;dx + mov ebx, [ebp+28] ;dy + push edx + + movq mm0, [eax] + movq mm1, [ebx] + + psrlw mm0, 11 ;reduce to 5 bits + psrlw mm1, 11 + + movq [eax], mm0 + movq [ebx], mm1 + + mov edx, [ebp+20] ;D + pmullw mm0, mm1 + movq mm5, [RedMask] + movq mm6, [GreenMask] + movq mm7, [BlueMask] + psrlw mm0, 5 + + pand mm5, [edx] + pand mm6, [edx] + + psrlw mm5, 5 + pand mm7, [edx] + + pmullw mm5, mm0 + pmullw mm6, mm0 + pmullw mm7, mm0 + + movq mm4, mm0 ;store x*y + + + mov edx, [ebp+16] ;C + movq mm0, [ebx] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+12] ;B + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + movq mm0, [eax] + movq mm1, mm4 + psubw mm0, mm1 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+8] ;A + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + + movq mm0, [All32s] + movq mm1, mm4 + movq mm2, [eax] + movq mm3, [ebx] + paddw mm0, mm1 + paddw mm2, mm3 + psubw mm0, mm2 + movq mm1, [RedMask] + movq mm2, [GreenMask] + movq mm3, [BlueMask] + pand mm1, [edx] + pand mm2, [edx] + psrlw mm1, 5 + pand mm3, [edx] + + pmullw mm1, mm0 + pmullw mm2, mm0 + pmullw mm3, mm0 + + mov edx, [ebp+32] + paddw mm5, mm1 + paddw mm6, mm2 + paddw mm7, mm3 + + psrlw mm6, 5 + psrlw mm7, 5 + + pand mm5, [RedMask] + pand mm6, [GreenMask] + pand mm7, [BlueMask] + + por mm5, mm6 + pxor mm0, mm0 + por mm7, mm5 + pxor mm1, mm1 + punpcklwd mm0, mm7 + punpckhwd mm1, mm7 +%ifdef FAR_POINTER + movq [fs:edx], mm0 + movq [fs:edx+8], mm1 +%else + movq [edx], mm0 + movq [edx+8], mm1 +%endif + pop edx + pop ebx + mov esp, ebp + pop ebp + ret + + + +%ifdef __DJGPP__ +_EndMMX: +%else +EndMMX: +%endif + emms + ret + + SECTION .data ALIGN = 32 +;Some constants +RedMask dd 0xF800F800, 0xF800F800 +BlueMask dd 0x001F001F, 0x001F001F +GreenMask dd 0x07E007E0, 0x07E007E0 +All32s dd 0x00200020, 0x00200020 diff --git a/src/i386/c4.asm b/src/i386/c4.asm new file mode 100644 index 0000000..c0a1731 --- /dev/null +++ b/src/i386/c4.asm @@ -0,0 +1,2412 @@ +%include "src/i386/macros.mac" +;******************************************************* +; Register & Memory Access Banks (0 - 3F) / (80 - BF) +;******************************************************* +; enter : BL = bank number, CX = address location +; leave : AL = value read + +%ifdef __DJGPP__ +%define C4WFXVal _C4WFXVal +%define C4WFYVal _C4WFYVal +%define C4WFX2Val _C4WFX2Val +%define C4WFY2Val _C4WFY2Val +%define C4CalcWireFrame _C4CalcWireFrame + +%define C4WFDist _C4WFDist +%define C4WFScale _C4WFScale +%define C4TransfWireFrame _C4TransfWireFrame +%define C4TransfWireFrame2 _C4TransfWireFrame2 +%define C4WFZVal _C4WFZVal +%define C41FXVal _C41FXVal +%define C41FYVal _C41FYVal +%define C41FAngleRes _C41FAngleRes +%define C41FDist _C41FDist +%define C4Op1F _C4Op1F +%define C4Op15 _C4Op15 +%define C41FDistVal _C41FDistVal +%define C4Op0D _C4Op0D +%define C4LoaDMem _C4LoaDMem +%endif + +%ifdef ZSNES_FX +EXTSYM romdata +%else +NEWSYM romdata, dd 0 ; rom data (4MB = 4194304) +%endif + +EXTSYM pressed,vidbuffer,oamram +EXTSYM C4Ram,C4RamR,C4RamW + +C4ProcessVectors: + mov esi,[C4Ram] + mov edi,esi + add edi,1F8Ch + xor edx,edx + mov dx,[esi+1F8Ah] + cmp dx,128 + ja .ret + cmp dx,0 + jne .nozero +.ret + ret +.nozero + cmp dx,10h + jb .less + mov dx,10h +.less + mov esi,[C4Ram] + add esi,800h +.loop + mov ecx,100h + xor ebx,ebx + xor eax,eax + movsx bx,byte[edi] +.spotloop + add ah,80h + mov byte[esi],ah + sub ah,80h + add ax,bx + inc esi + loop .spotloop + add edi,3 + dec dx + jnz .loop + ret + +SECTION .data +C4ObjDisp dd 0 +C4ColRot db 1 +NEWSYM C4ObjSelec, db 0 +NEWSYM C4SObjSelec, db 0 +NEWSYM C4Pause, db 0 +C4DataCopy times 64 db 0 +;NEWSYM C4Data times 64*4096 db 0 ; 15 sprites, 4 bytes each + ; x,y,oamptr,stat (b0=oamb8,b1=16x16) + ; 4 byte header (#sobj,?,?,?) +CObjNum dw 0 +C4Temp dd 0 + +SECTION .text + +C4Edit: + ; C4 editing routines + ; Register keyboard presses + ; [ = prev object, ] = next object + ; p = pause/unpause + cmp byte[pressed+1Ah],0 + je .notpressed + mov byte[pressed+1Ah],0 + inc byte[C4ObjSelec] + inc byte[C4Temp] +.notpressed + cmp byte[pressed+1Bh],0 + je .notpressed2 + mov byte[pressed+1Bh],0 + dec byte[C4ObjSelec] + dec byte[C4Temp] +.notpressed2 + cmp byte[pressed+19h],0 + je .notpressed3 + mov byte[pressed+19h],0 + xor byte[C4Pause],1 +.notpressed3 + + ; Setup variables + mov esi,[C4Ram] + add byte[C4ColRot],16 + mov al,[esi+620h] + cmp byte[C4ObjSelec],0FFh + jne .notneg + dec al + mov byte[C4ObjSelec],al + jmp .notof +.notneg + cmp byte[C4ObjSelec],al + jb .notof + xor al,al + mov [C4ObjSelec],al +.notof + + ; Draw the dots on-screen + xor eax,eax + mov al,[C4ObjSelec] + shl eax,4 + add eax,[C4Ram] + add eax,220h + mov byte[.flipped],0 + test byte[eax+6],40h + jz .notflip + mov byte[.flipped],1 +.notflip + +; 00/01 - x position relative to BG scroll value +; 02/03 - y position relative to BG scroll value +; 04 - palette/priority settings +; 05 - OAM pointer value +; 06 - flip settings : b6 = flipx, b7 = flipy +; 07 - looks like some sprite displacement values +; 08/09 - ??? +; 0A-0F - unused + xor ebx,ebx + mov bx,[eax+8] + mov [CObjNum],bx + cmp bx,4096 + jae near .skipall + shl ebx,6 + add ebx,[C4Data] + + ; t,f,g,h = move current object + ; q = copy current object structure, w = paste current object structure + cmp byte[pressed+14h],0 + je .notmove + mov byte[pressed+14h],0 + pushad + mov ecx,15 +.next + add ebx,4 + dec byte[ebx+1] + loop .next + popad +.notmove + cmp byte[pressed+21h],0 + je .notmove2 + mov byte[pressed+21h],0 + pushad + mov ecx,15 +.next2 + add ebx,4 + cmp byte[.flipped],0 + je .noflipx + add byte[ebx],2 +.noflipx + dec byte[ebx] + loop .next2 + popad +.notmove2 + cmp byte[pressed+22h],0 + je .notmove3 + mov byte[pressed+22h],0 + pushad + mov ecx,15 +.next3 + add ebx,4 + inc byte[ebx+1] + loop .next3 + popad +.notmove3 + cmp byte[pressed+23h],0 + je .notmove4 + mov byte[pressed+23h],0 + pushad + mov ecx,15 +.next4 + add ebx,4 + cmp byte[.flipped],0 + je .noflipx2 + sub byte[ebx],2 +.noflipx2 + inc byte[ebx] + loop .next4 + popad +.notmove4 + cmp byte[pressed+10h],0 + je .notcopy + mov byte[pressed+10h],0 + pushad + mov edx,C4DataCopy + mov ecx,64 +.copylp + mov al,[ebx] + mov [edx],al + inc ebx + inc edx + loop .copylp + popad +.notcopy + cmp byte[pressed+11h],0 + je .notpaste + mov byte[pressed+11h],0 + pushad + mov edx,C4DataCopy + mov ecx,64 +.pastelp + mov al,[edx] + mov [ebx],al + inc ebx + inc edx + loop .pastelp + popad +.notpaste + + ; - = remove sub-object, + = add sub-object + ; ; = previous sub-object, ' = next sub-object + cmp byte[pressed+0Ch],0 + je .notpressed4 + mov byte[pressed+0Ch],0 + cmp byte[ebx],0 + je .notpressed4 + dec byte[ebx] +.notpressed4 + cmp byte[pressed+0Dh],0 + je .notpressed5 + mov byte[pressed+0Dh],0 + cmp byte[ebx],15 + je .notpressed5 + inc byte[ebx] +.notpressed5 + cmp byte[pressed+27h],0 + je .notpressed6 + mov byte[pressed+27h],0 + dec byte[C4SObjSelec] +.notpressed6 + cmp byte[pressed+28h],0 + je .notpressed7 + mov byte[pressed+28h],0 + inc byte[C4SObjSelec] +.notpressed7 + + ; get current sub-object displacement (0 if no sub-objects) + xor ecx,ecx + cmp byte[ebx],0 + je near .nosubobjs + + mov cl,[ebx] + cmp byte[C4ObjSelec],0FFh + jne .sobjokay2 + dec cl + mov byte[C4SObjSelec],cl + jmp .sobjokay +.sobjokay2 + cmp byte[C4SObjSelec],cl + jb .sobjokay + mov byte[C4SObjSelec],0 +.sobjokay + + xor ecx,ecx + mov cl,byte[C4SObjSelec] + shl ecx,2 + add ebx,ecx + add ebx,4 + + ; i,j,k,l = move current sub-object (17,24,25,26) + ; u = toggle between 8x8 and 16x16 tiles + ; o = toggle between high/low oam value + ; . = decrease oam value, / = increase oam value of sub-object + cmp byte[pressed+17h],0 + je .notpressed8 + mov byte[pressed+17h],0 + dec byte[ebx+1] +.notpressed8 + cmp byte[pressed+24h],0 + je .notpressed9 + mov byte[pressed+24h],0 + dec byte[ebx] + cmp byte[.flipped],0 + je .notpressed9 + add byte[ebx],2 +.notpressed9 + cmp byte[pressed+26h],0 + je .notpressed11 + mov byte[pressed+26h],0 + inc byte[ebx] + cmp byte[.flipped],0 + je .notpressed11 + sub byte[ebx],2 +.notpressed11 + cmp byte[pressed+25h],0 + je .notpressed10 + mov byte[pressed+25h],0 + inc byte[ebx+1] +.notpressed10 + cmp byte[pressed+16h],0 + je .notpressed12 + mov byte[pressed+16h],0 + xor byte[ebx+3],2 +.notpressed12 + cmp byte[pressed+18h],0 + je .notpressed13 + mov byte[pressed+18h],0 + xor byte[ebx+3],1 +.notpressed13 + cmp byte[pressed+34h],0 + je .notpressed14 + mov byte[pressed+34h],0 + dec byte[ebx+2] +.notpressed14 + cmp byte[pressed+35h],0 + je .notpressed15 + mov byte[pressed+35h],0 + inc byte[ebx+2] +.notpressed15 + + mov cl,[ebx] + mov ch,[ebx+1] +.nosubobjs + mov edx,ecx + xor ebx,ebx + xor ecx,ecx + mov bl,[eax] + sub bl,[esi+621h] + add bl,dl + mov cl,[eax+2] + sub cl,[esi+623h] + add cl,dh + mov esi,[vidbuffer] + add esi,16*2+256*2+32*2 + add esi,ebx + add esi,ebx + mov ebx,ecx + shl ebx,9 + shl ecx,6 + add esi,ebx + add esi,ecx + mov al,[C4ColRot] + mov ah,al + xor ah,0FFh + mov [esi],ax + mov [esi+16],ax + mov [esi+288*8*2],ax + mov [esi+16+288*8*2],ax +.skipall + ret + +SECTION .data +.flipped db 0 +SECTION .text + +C4AddSprite: + cmp dword[C4count],0 + je near .nosprite + mov [edi],ax + mov [edi+2],bx + mov ebx,[C4usprptr] + and [ebx],dl + mov al,dl + xor al,0FFh + and dh,al + or [ebx],dh + add edi,4 + rol dl,2 + rol dh,2 + dec dword[C4count] + cmp dl,0FCh + jne .nosprite + inc dword[C4usprptr] +.nosprite + ret + +C4ConvOAM: + inc byte[C4Timer] + and byte[C4Timer],15 + inc byte[C4Timer2] + and byte[C4Timer2],7 + mov esi,[C4Ram] + xor ecx,ecx + mov edi,esi + mov cl,[esi+620h] + mov bx,[esi+621h] + mov [.addx],bx + mov bx,[esi+623h] + mov [.addy],bx + mov [C4usprptr],esi + add dword[C4usprptr],200h + mov eax,[C4ObjDisp] + add edi,eax + shr eax,4 + add dword[C4usprptr],eax + add esi,220h + ; Convert from esi to edi + mov dl,0FCh + push ecx + mov cl,byte[C4sprites] + and cl,3 + add cl,cl + rol dl,cl + pop ecx + cmp cl,0 + je near .none + mov dword[C4count],128 + mov eax,[C4sprites] + sub dword[C4count],eax + +.loop + push ecx + push esi +; 00/01 - x position relative to BG scroll value +; 02/03 - y position relative to BG scroll value +; 04 - palette/priority settings +; 05 - OAM pointer value +; 06 - flip settings : b6 = flipx, b7 = flipy +; 07 - ??? +; 08/09 - Pointer to Sprite Structure +; 0A-0F - unused +;bit 1-3 = palette number bit 4,5 = playfield priority +;bit 6 = horizontal flip bit 7 = horizonal flip + mov ax,[esi] + sub ax,[.addx] + mov [C4SprX],ax + mov ax,[esi+2] + sub ax,[.addy] + mov [C4SprY],ax + mov al,[esi+5] + mov [C4SprOAM],al + mov al,[esi+4] + mov ah,al + and ah,0Eh + cmp ah,0 + jmp .notstage2 + jne .notstage1 + cmp byte[C4Timer],0 + je .flash + jmp .noflash +.notstage1 + jmp .notstage2 + cmp ah,4 + jne .notstage2 + cmp byte[C4Timer2],0 + je .flash +.noflash + and al,0F1h + or al,2 + jmp .notstage2 +.flash + and al,0F1h +.notstage2 + mov [C4SprAttr],al + mov al,[esi+6] + or [C4SprAttr],al +; mov [C4SprFlip],al + + xor ecx,ecx + mov cl,[esi+9] + shl ecx,16 + mov cx,[esi+7] + add cx,cx + shr ecx,1 + add ecx,[romdata] + + mov al,[ecx] + or al,al + jz near .singlespr + mov [C4SprCnt],al + inc ecx +.nextspr + xor ebx,ebx + movsx bx,byte[ecx+1] + test byte[C4SprAttr],40h + jz .notflipx + neg bx + sub bx,8 +.notflipx + add bx,[C4SprX] + xor dh,dh + test byte[ecx],20h + jz .no16x16 + or dh,10101010b + test byte[C4SprAttr],40h + jz .no16x16 + sub bx,8 +.no16x16 + cmp bx,-16 + jl near .nosprite + cmp bx,272 + jg near .nosprite + mov al,bl + test bx,100h + jz .not512b + or dh,01010101b +.not512b + xor ebx,ebx + movsx bx,byte[ecx+2] + test byte[C4SprAttr],80h + jz .notflipy + neg bx + sub bx,8 +.notflipy + add bx,[C4SprY] + test byte[ecx],20h + jz .no16x16b + test byte[C4SprAttr],80h + jz .no16x16b + sub bx,8 +.no16x16b + cmp bx,-16 + jl near .nosprite + cmp bx,224 + jg near .nosprite + mov ah,bl + mov bh,[C4SprAttr] + mov bl,[ecx] + and bl,0C0h + xor bh,bl + mov bl,[C4SprOAM] + add bl,[ecx+3] + call C4AddSprite +.nosprite + add ecx,4 + dec byte[C4SprCnt] + jnz near .nextspr + jmp .donemultispr +.singlespr + mov dh,10101010b + test byte[C4SprX+1],1 + jz .not512 + or dh,01010101b +.not512 + mov al,[C4SprX] + mov ah,[C4SprY] + mov bl,[C4SprOAM] + mov bh,[C4SprAttr] + call C4AddSprite +.donemultispr + pop esi + pop ecx + +;NEWSYM C4Data times 64*4096 db 0 ; 15 sprites, 4 bytes each + ; x,y,oamptr,stat (b0=oamb8,b1=16x16) + ; 4 byte header (#sobj,?,?,?) + + add esi,16 + dec cl + jnz near .loop +.none + mov esi,oamram + mov edi,[C4Ram] + mov ecx,544 +.next + mov al,[edi] + mov [esi],al + inc edi + inc esi + loop .next + ret + +SECTION .data +.addx dw 0 +.addy dw 0 + +C4count dd 0 +C4usprptr dd 0 +C4SprX dw 0 +C4SprY dw 0 +C4SprCnt db 0 +C4SprAttr db 0 +C4SprOAM db 0 +C4SprFlip db 0 +C4Timer db 0 +C4Timer2 db 0 + +SECTION .text + +NEWSYM C4VBlank + ret +NEWSYM C4ProcessSprites + push ecx + push esi + push edi + push ebx + push edx +; call C4ProcessVectors + +; call C4Edit + + mov esi,[C4Ram] + mov dword[C4count],8 + mov cl,[esi+626h] + mov byte[C4sprites],cl + mov ecx,[C4sprites] + shl ecx,2 + mov dword[C4ObjDisp],ecx + mov ecx,128 +; cmp byte[esi+65],50h +; jne .noincdisp + mov dword[C4count],32 + sub ecx,[C4sprites] +.noincdisp + add esi,[C4ObjDisp] + ; Clear OAM to-be ram +.next + mov byte[esi+1],0E0h + add esi,4 + dec ecx + jnz .next + + call C4ConvOAM + + pop edx + pop ebx + pop edi + pop esi + pop ecx + ret + +SECTION .data +NEWSYM SprValAdd, db 0 +C4Data dd 0 +C4sprites dd 0 +SECTION .text + +NEWSYM InitC4 + pushad + mov esi,[romdata] + add esi,4096*1024 + mov [C4Data],esi + add dword[C4Data],128*1024 + mov [C4RamR],esi + mov [C4RamW],esi + mov [C4Ram],esi + add dword[C4RamW],8192*4 + add dword[C4Ram],8192*8 + mov ecx,8192 +.c4loop + mov dword[esi],C4ReadReg + mov dword[esi+8192*4],C4WriteReg + mov dword[esi+8192*8],0 + add esi,4 + dec ecx + jnz .c4loop + mov esi,[C4RamW] + mov dword[esi+1F4Fh*4],C4RegFunction + mov esi,[C4Data] + mov ecx,16*4096 +.c4loopb + mov dword[esi],0 + add esi,4 + loop .c4loopb + popad + ret + +C4ClearSpr: + mov esi,ebx + mov edi,eax +; xor ecx,ecx +; mov cx,[eax+1F44h] +; sub cx,6000h +; add eax,ecx + shl ch,3 +.scloop2 + mov cl,byte[C4SprPos] + shl cl,2 +.scloop + mov byte[edi],0 + mov byte[edi+2000h],0 + inc edi + dec cl + jnz .scloop + dec ch + jnz .scloop2 + ret + +C4SprBitPlane: + mov edi,eax + shl ebx,2 +.scloop3 + mov ch,[C4SprPos] + push esi +.scloop4 + push esi + mov cl,8 +.loop + mov dh,8 + mov dl,80h + mov eax,[esi] +.nextd + test al,1 + jz .not0 + or byte[edi],dl +.not0 + test al,2 + jz .not1 + or byte[edi+1],dl +.not1 + test al,4 + jz .not2 + or byte[edi+16],dl +.not2 + test al,8 + jz .not3 + or byte[edi+17],dl +.not3 + shr eax,4 + shr dl,1 + dec dh + jnz .nextd + add esi,ebx + add edi,2 + dec cl + jnz .loop + add edi,16 + pop esi + add esi,4 + dec ch + jnz .scloop4 + pop esi + shl ebx,3 + add esi,ebx + add edi,dword[C4SprPtrInc] + shr ebx,3 + dec byte[C4SprPos+1] + jnz .scloop3 +.end + ret + +SECTION .data +C4XXScale dw 0 +C4XYScale dw 0 +C4YXScale dw 0 +C4YYScale dw 0 +C4CXPos dw 0 +C4CYPos dw 0 +C4CXMPos dd 0 +C4CYMPos dd 0 +C4PCXMPos dd 0 +C4PCYMPos dd 0 +SECTION .text + +DoScaleRotate: + pushad + mov esi,eax + ; Calculate X scaler + mov ax,[esi+1F80h] + and eax,01FFh + mov ax,[CosTable+eax*2] + mov bx,[esi+1F8Fh] + test bx,8000h + jz .notover + mov bx,7FFFh +.notover + imul bx + add ax,ax + adc dx,dx + mov [C4XXScale],dx + mov ax,[esi+1F80h] + and eax,01FFh + mov ax,[SinTable+eax*2] + imul bx + add ax,ax + adc dx,dx + mov [C4XYScale],dx + ; Calculate Y scaler + mov ax,[esi+1F80h] + and eax,01FFh + mov ax,[CosTable+eax*2] + mov bx,[esi+1F92h] + test bx,8000h + jz .notoverb + mov bx,7FFFh +.notoverb + imul bx + add ax,ax + add dx,dx + mov [C4YYScale],dx + mov ax,[esi+1F80h] + and eax,01FFh + mov ax,[SinTable+eax*2] + imul bx + add ax,ax + adc dx,dx + neg dx + mov [C4YXScale],dx + cmp word[esi+1F80h],0 + jne .effect + cmp word[esi+1F92h],1000h + jne .effect + mov word[C4YYScale],1000h + mov word[C4YXScale],0 +.effect + ; Calculate Pixel Resolution + mov cl,byte[C4SprPos] + shl cl,3 + mov byte[C4SprPos+2],cl + mov cl,byte[C4SprPos+1] + shl cl,3 + mov byte[C4SprPos+3],cl + ; Calculate Positions + ; (1-scale)*(pos/2) + xor eax,eax + mov al,[C4SprPos+2] + shl eax,11 + mov [C4PCXMPos],eax + xor eax,eax + mov al,[C4SprPos+3] + shl eax,11 + mov [C4PCYMPos],eax + + mov bx,[C4XXScale] + xor eax,eax + mov al,[C4SprPos+2] + shr ax,1 + imul bx + shl edx,16 + mov dx,ax + sub [C4PCXMPos],edx + mov bx,[C4YXScale] + xor eax,eax + mov al,[C4SprPos+3] + shr ax,1 + imul bx + shl edx,16 + mov dx,ax + sub [C4PCXMPos],edx + + mov bx,[C4XYScale] + xor eax,eax + mov al,[C4SprPos+2] + shr ax,1 + imul bx + shl edx,16 + mov dx,ax + sub [C4PCYMPos],edx + mov bx,[C4YYScale] + xor eax,eax + mov al,[C4SprPos+3] + shr ax,1 + imul bx + shl edx,16 + mov dx,ax + sub [C4PCYMPos],edx + + ; Start loop + mov word[C4CYPos],0 + xor edi,edi +.loop + mov ecx,[C4PCXMPos] + mov [C4CXMPos],ecx + mov ecx,[C4PCYMPos] + mov [C4CYMPos],ecx + mov al,[C4SprPos+2] + mov byte[C4CXPos],al +.loop2 + xor eax,eax + mov al,[C4SprPos+2] + mov ebx,[C4CXMPos] + sar ebx,12 + cmp ebx,eax + jae near .blank + xor eax,eax + mov al,[C4SprPos+3] + mov ebx,[C4CYMPos] + sar ebx,12 + cmp ebx,eax + jae near .blank + ; Get pixel value + mov ebx,[C4CYMPos] + xor eax,eax + shr ebx,12 + mov al,[C4SprPos+2] + mul ebx + mov ebx,[C4CXMPos] + shr ebx,12 + add eax,ebx + mov ebx,[C4SprPtr] + test al,1 + jnz .upperb + shr eax,1 + add ebx,eax + mov al,[ebx] + jmp .lowerb +.upperb + shr eax,1 + add ebx,eax + mov al,[ebx] + shr al,4 +.lowerb + mov ebx,edi + shr ebx,1 + add ebx,esi + test edi,1 + jnz .upperb2 + and al,0Fh + and byte[ebx+2000h],0F0h + or byte[ebx+2000h],al + jmp .done +.upperb2 + shl al,4 + and byte[ebx+2000h],0Fh + or byte[ebx+2000h],al + jmp .done +.blank + mov eax,edi + shr eax,1 + add eax,esi + test edi,1 + jnz .upper + and byte[eax+2000h],0F0h + jmp .done +.upper + and byte[eax+2000h],0Fh +.done + movsx eax,word[C4XXScale] + add [C4CXMPos],eax + movsx eax,word[C4XYScale] + add [C4CYMPos],eax + inc edi + dec byte[C4CXPos] + jne near .loop2 + movsx eax,word[C4YXScale] + add [C4PCXMPos],eax + movsx eax,word[C4YYScale] + add [C4PCYMPos],eax + inc word[C4CYPos] + mov al,[C4SprPos+3] + cmp byte[C4CYPos],al + jne near .loop +.noimage + popad + ret + +DoScaleRotate2: + pushad + xor ebx,ebx + mov bx,[eax+1F8Fh] + cmp bx,1000h + ja .scaled + mov bx,1000h +.scaled + mov [C4SprScale],ebx + xor ebx,ebx + mov bx,[eax+1F92h] + cmp bx,1000h + ja .scaledb + mov bx,1000h +.scaledb + mov [C4SprScaleY],ebx + mov cl,[C4SprPos] + shl cl,3 + mov ch,cl + xor ebx,ebx +.leftovercheck + dec ch + add ebx,[C4SprScale] +.leftovercheckb + cmp ebx,1000h + jb .leftovercheck + sub ebx,1000h + dec cl + jz .donecheck + jmp .leftovercheckb +.donecheck + shr ch,1 + mov cl,ch + and ecx,0FFh + mov esi,ecx + + mov cl,[C4SprPos+1] + shl cl,3 + mov ch,cl + xor ebx,ebx +.leftovercheckc + dec ch + add ebx,[C4SprScaleY] +.leftovercheckd + cmp ebx,1000h + jb .leftovercheckc + sub ebx,1000h + dec cl + jz .donecheckc + jmp .leftovercheckd +.donecheckc + shr ch,1 + mov cl,ch + and ecx,0FFh + push eax + xor eax,eax + mov al,[C4SprPos] + shl al,3 + mul ecx + add esi,eax + pop eax + + mov dword[C4SprScalerY],0 + xor edi,edi + mov cl,[C4SprPos+1] + shl cl,3 + mov [C4SprPos+3],cl +.next + push esi + push edi + xor ecx,ecx + mov cl,[C4SprPos] + shl cl,3 + mov ch,cl + mov dword[C4SprScaler],0 + xor edx,edx +.loop + mov edx,edi + shr edx,1 + add edx,[C4SprPtr] + mov bl,[edx] + test esi,1 + jz .notupper + shr bl,4 +.notupper + and bl,0Fh + mov edx,esi + shr edx,1 + test esi,1 + jz .notupperb + shl bl,4 + or byte[eax+edx+2000h],bl + jmp .notlowerb +.notupperb + or byte[eax+edx+2000h],bl +.notlowerb + inc esi + mov ebx,[C4SprScale] + add dword[C4SprScaler],ebx + dec ch +.nextcheck + cmp dword[C4SprScaler],1000h + jb near .loop + sub dword[C4SprScaler],1000h + inc edi + dec cl + jz .done + jmp .nextcheck +.done + pop edi + pop esi + xor edx,edx + mov dl,[C4SprPos] + shl dl,3 + add esi,edx + + mov ebx,[C4SprScaleY] + add dword[C4SprScalerY],ebx +.nextcheckb + cmp dword[C4SprScalerY],1000h + jb near .next + sub dword[C4SprScalerY],1000h + add edi,edx + dec byte[C4SprPos+3] + jz .doneb + jmp .nextcheckb +.doneb + + popad + ret + +C4SprScaleR: + push ecx + push ebx + push edx + push esi + push edi + mov dword[C4SprPtrInc],0 + xor ebx,ebx + mov bl,[eax+1F42h] + shl ebx,16 + mov bx,[eax+1F40h] + add bx,bx + shr ebx,1 + add ebx,[romdata] + mov ch,[eax+1F8Ch] + shr ch,3 + mov cl,[eax+1F89h] + shr cl,3 + mov [C4SprPos],cx + mov [C4SprPtr],ebx + + call C4ClearSpr + + call DoScaleRotate + + mov esi,eax + add esi,2000h + xor ebx,ebx + mov bl,[C4SprPos] + call C4SprBitPlane + pop edi + pop esi + pop edx + pop ebx + pop ecx + ret + +C4SprRotateR: + push ecx + push ebx + push edx + push esi + push edi + xor ebx,ebx + mov ebx,600h + add ebx,[C4Ram] + mov [C4SprPtr],esi + mov ch,[eax+1F8Ch] + shr ch,3 + mov cl,[eax+1F89h] + shr cl,3 + add ch,2 + mov [C4SprPos],cx + mov dword[C4SprPtrInc],64 + mov [C4SprPtr],ebx + sub byte[C4SprPos+1],2 + call C4ClearSpr + + call DoScaleRotate + mov esi,eax + add esi,2000h + xor ebx,ebx + mov bl,[C4SprPos] + add byte[C4SprPos+1],2 + call C4SprBitPlane + pop edi + pop esi + pop edx + pop ebx + pop ecx + ret + +C4SprDisintegrate: + pushad + mov dword[C4SprPtrInc],0 + xor ebx,ebx + mov bl,[eax+1F42h] + shl ebx,16 + mov bx,[eax+1F40h] + add bx,bx + shr ebx,1 + add ebx,[romdata] + mov ch,[eax+1F8Ch] + shr ch,3 + mov cl,[eax+1F89h] + shr cl,3 + mov [C4SprPos],cx + mov [C4SprPtr],ebx + + call C4ClearSpr + + mov esi,[C4Ram] + xor ebx,ebx + mov bx,[esi+1F86h] + xor eax,eax + mov al,[esi+1F89h] + shr al,1 + mul ebx + neg eax + xor ebx,ebx + mov bl,[esi+1F89h] + shr bl,1 + shl ebx,8 + add eax,ebx + push eax + xor ebx,ebx + mov bx,[esi+1F8Fh] + xor eax,eax + mov al,[esi+1F8Ch] + shr al,1 + mul ebx + neg eax + xor ebx,ebx + mov bl,[esi+1F8Ch] + shr bl,1 + shl ebx,8 + add ebx,eax + mov edx,ebx + pop ebx + mov esi,[C4Ram] + mov cl,[esi+1F89h] + mov ch,[esi+1F8Ch] + mov [C4SprPos+2],cx + movsx eax,word[esi+1F86h] + mov [.scalex],eax + movsx eax,word[esi+1F8Fh] + mov [.scaley],eax + mov esi,[C4SprPtr] + mov edi,[C4Ram] + add edi,2000h + + ; convert to 8-bit bitmap + mov cx,[C4SprPos+2] + shr cl,1 +.loop2 + mov al,[esi] + mov [edi],al + mov al,[esi] + shr al,4 + mov [edi+1],al + inc esi + add edi,2 + dec cl + jnz .loop2 + dec ch + jnz .loop2 + + mov edi,[C4Ram] + add edi,4000h + mov ecx,2000h +.lp + mov byte[edi],0 + inc edi + loop .lp + + mov esi,[C4Ram] + add esi,2000h + mov edi,[C4Ram] + add edi,4000h + + mov cx,[C4SprPos+2] +.next2 + push ebx +.next + xor eax,eax + mov ah,[C4SprPos+2] + cmp ebx,eax + jae .fail + xor eax,eax + mov ah,[C4SprPos+3] + cmp edx,eax + jae .fail + push ecx + push edx + xor eax,eax + mov al,[C4SprPos+2] + xor ecx,ecx + mov cl,dh + mul ecx + mov ecx,ebx + shr ecx,8 + add eax,ecx + mov dl,[esi] + cmp eax,2000h + jae .skipdisi + mov [edi+eax],dl +.skipdisi + pop edx + pop ecx +.fail + inc esi + add ebx,[.scalex] + dec cl + jnz near .next + pop ebx + add edx,[.scaley] + mov cl,[C4SprPos+2] + dec ch + jnz near .next2 + +.skipall + ; convert to 4-bit bitmap + mov esi,[C4Ram] + add esi,4000h + mov edi,[C4Ram] + add edi,6000h + mov cx,[C4SprPos+2] + shr cl,1 +.loop + mov al,[esi] + mov [edi],al + mov al,[esi+1] + shl al,4 + or [edi],al + inc edi + add esi,2 + dec cl + jnz .loop + dec ch + jnz .loop + + mov esi,[C4Ram] + add esi,6000h +; mov esi,[C4SprPtr] + mov eax,[C4Ram] + xor ebx,ebx + mov bl,[C4SprPos] + call C4SprBitPlane + + popad + ret + +SECTION .data +.scalex dd 0 +.scaley dd 0 +SECTION .text + +C4BitPlaneWave: + pushad + mov esi,[C4Ram] + mov dword[.temp],10h + xor eax,eax + mov al,[esi+1F83h] + mov dword[.waveptr],eax + mov word[.temp+4],0C0C0h + mov word[.temp+6],03F3Fh +.bmloopb + mov edi,[C4Ram] + add edi,[.waveptr] + xor eax,eax + movsx ax,byte[edi+$0B00] + neg ax + sub ax,16 + mov edi,[C4Ram] + add edi,0A00h + xor ecx,ecx +.bmloopa + mov ebx,[.bmptr+ecx*4] + mov dx,[.temp+6] + and [esi+ebx],dx + xor dx,dx + cmp ax,0 + jl .less + mov dx,0FF00h + cmp ax,8 + jae .less + mov dx,[edi+eax*2] +.less + and dx,[.temp+4] + or [esi+ebx],dx + inc ax + inc ecx + cmp ecx,28h + jne .bmloopa + add dword[.waveptr],1 + and dword[.waveptr],07Fh + ror word[.temp+4],2 + ror word[.temp+6],2 + cmp word[.temp+4],0C0C0h + jne near .bmloopb + add esi,16 +.bmloopa2b + mov edi,[C4Ram] + add edi,[.waveptr] + xor eax,eax + movsx ax,byte[edi+$0B00] + neg ax + sub ax,16 + mov edi,[C4Ram] + add edi,0A00h + xor ecx,ecx +.bmloopa2 + mov ebx,[.bmptr+ecx*4] + mov dx,[.temp+6] + and [esi+ebx],dx + xor dx,dx + cmp ax,0 + jl .less2 + mov dx,0FF00h + cmp ax,8 + jae .less2 + mov dx,[edi+eax*2+16] +.less2 + and dx,[.temp+4] + or [esi+ebx],dx + inc ax + inc ecx + cmp ecx,28h + jne .bmloopa2 + add dword[.waveptr],1 + and dword[.waveptr],07Fh + ror word[.temp+4],2 + ror word[.temp+6],2 + cmp word[.temp+4],0C0C0h + jne near .bmloopa2b + add esi,16 + dec dword[.temp] + jnz near .bmloopb + mov esi,[C4Ram] +; mov cx,[esi+1F80h] +; mov [C4values],cx +; mov cx,[esi+1F83h] +; mov [C4values+2],cx + popad + ret + +SECTION .data +.bmptr dd 0000h,0002h,0004h,0006h,0008h,000Ah,000Ch,000Eh + dd 0200h,0202h,0204h,0206h,0208h,020Ah,020Ch,020Eh + dd 0400h,0402h,0404h,0406h,0408h,040Ah,040Ch,040Eh + dd 0600h,0602h,0604h,0606h,0608h,060Ah,060Ch,060Eh + dd 0800h,0802h,0804h,0806h,0808h,080Ah,080Ch,080Eh +.temp dd 0,0 +.waveptr dd 0 +;C4X1 dw 0 +;C4Y1 dw 0 +;C4Z1 dw 0 +;C4X2 dw 0 +;C4Y2 dw 0 +;C4Z2 dw 0 +;C4Col dw 0 + +SECTION .text +C4DrawLine: + pushad + + ; transform both coordinates + push esi + mov ax,word[C4X1] + mov [C4WFXVal],ax + mov ax,word[C4Y1] + mov [C4WFYVal],ax + mov ax,word[C4Z1] + mov [C4WFZVal],ax + mov al,[esi+1F90h] + mov [C4WFScale],al + mov al,[esi+1F86h] + mov [C4WFX2Val],al + mov al,[esi+1F87h] + mov [C4WFY2Val],al + mov al,[esi+1F88h] + mov [C4WFDist],al +EXTSYM C4TransfWireFrame2 + call C4TransfWireFrame2 + mov ax,[C4WFXVal] + mov word[C4X1],ax + mov ax,[C4WFYVal] + mov word[C4Y1],ax + + mov ax,word[C4X2] + mov [C4WFXVal],ax + mov ax,word[C4Y2] + mov [C4WFYVal],ax + mov ax,word[C4Z2] + mov [C4WFZVal],ax + call C4TransfWireFrame2 + mov ax,[C4WFXVal] + mov word[C4X2],ax + mov ax,[C4WFYVal] + mov word[C4Y2],ax + + add word[C4X1],48 + add word[C4Y1],48 + add word[C4X2],48 + add word[C4Y2],48 + shl dword[C4X1],8 + shl dword[C4X2],8 + shl dword[C4Y1],8 + shl dword[C4Y2],8 + ; get line info + mov ax,[C4X1+1] + mov [C4WFXVal],ax + mov ax,[C4Y1+1] + mov [C4WFYVal],ax + mov ax,[C4X2+1] + mov [C4WFX2Val],ax + mov ax,[C4Y2+1] + mov [C4WFY2Val],ax + call C4CalcWireFrame + xor ecx,ecx + mov cx,[C4WFDist] + or ecx,ecx + jnz .not0 + mov ecx,1 +.not0 + movsx eax,word[C4WFXVal] + mov [C4X2],eax + movsx eax,word[C4WFYVal] + mov [C4Y2],eax + pop esi + ; render line +.loop + ; plot pixel + cmp word[C4X1+1],0 + jl near .noplot + cmp word[C4Y1+1],0 + jl near .noplot + cmp word[C4X1+1],95 + jg near .noplot + cmp word[C4Y1+1],95 + jg near .noplot + xor eax,eax + mov dx,[C4Y1+1] + shr dx,3 + mov ax,dx + shl ax,6 + shl dx,8 + sub dx,ax + mov ax,[C4X1+1] + shr ax,3 + shl ax,4 + add ax,dx + mov dx,[C4Y1+1] + and dx,07h + add dx,dx + add ax,dx + mov dl,07Fh + push ecx + mov cl,[C4X1+1] + and cl,07h + ror dl,cl + pop ecx + and byte[esi+eax+300h],dl + and byte[esi+eax+301h],dl + xor dl,0FFh + test byte[C4Col],1 + jz .nocolor0 + or byte[esi+eax+300h],dl +.nocolor0 + test byte[C4Col],2 + jz .nocolor1 + or byte[esi+eax+301h],dl +.nocolor1 +.noplot + mov eax,[C4X2] + add [C4X1],eax + mov eax,[C4Y2] + add [C4Y1],eax + dec ecx + jnz near .loop + popad + ret + +DrawWireFrame: + mov esi,[C4Ram] + mov edi,esi + xor ebx,ebx + mov bl,[esi+1F82h] + shl ebx,16 + mov bx,[esi+1F80h] + add bx,bx + shr ebx,1 + add ebx,[romdata] + mov edi,ebx + xor ecx,ecx + mov cl,[esi+295h] +.loop + xor eax,eax + mov al,[esi+1F82h] + shl eax,16 + mov al,[edi+1] + mov ah,[edi+0] + mov edx,edi +.nextprev + cmp ax,0FFFFh + jne .notprev + sub edx,5 + mov al,[edx+3] + mov ah,[edx+2] + jmp .nextprev +.notprev + add ax,ax + shr eax,1 + add eax,[romdata] + xor edx,edx + mov dl,[esi+1F82h] + shl edx,16 + mov dl,[edi+3] + mov dh,[edi+2] +; mov [C4values+6],dx + add dx,dx + shr edx,1 + add edx,[romdata] + xor ebx,ebx + mov bh,[eax] + mov bl,[eax+1] + mov [C4X1],ebx + mov bh,[eax+2] + mov bl,[eax+3] + mov [C4Y1],ebx + mov bh,[eax+4] + mov bl,[eax+5] + mov [C4Z1],ebx + mov bh,[edx] + mov bl,[edx+1] + mov [C4X2],ebx + mov bh,[edx+2] + mov bl,[edx+3] + mov [C4Y2],ebx + mov bh,[edx+4] + mov bl,[edx+5] + mov [C4Z2],ebx + mov al,[edi+4] + mov [C4Col],al + add edi,5 + call C4DrawLine + dec ecx + jnz near .loop + ret + +SECTION .data +C4X1 dd 0 +C4Y1 dd 0 +C4Z1 dd 0 +C4X2 dd 0 +C4Y2 dd 0 +C4Z2 dd 0 +C4Col dd 0 +SECTION .text + +WireFrameB: + pushad + ; 28EECA + ; 7F80 (3bytes) = pointer to data + ; 7F86-7F88 = rotation, 7F90 = scale (/7A?) + ; 6295 = # of lines, 7FA5 = ??? + mov esi,[C4Ram] + add esi,300h + mov ecx,16*12*3 +.loop + mov dword[esi],0 + add esi,4 + loop .loop + call DrawWireFrame + + mov esi,[C4Ram] + mov cx,[esi+1FA5h] +; mov [C4values],cx +; mov cx,[esi+1F86h] +; mov [C4values],cx +; mov cx,[esi+1F88h] +; mov [C4values+2],cx +; mov cx,[esi+1F90h] +; mov [C4values+4],cx + popad + ret + +WireFrameB2: + pushad + call DrawWireFrame + popad + ret + +C4WireFrame: +EXTSYM C4WFXVal,C4WFYVal,C4WFX2Val,C4WFY2Val,C4CalcWireFrame +EXTSYM C4WFDist,C4WFScale,C4TransfWireFrame,C4WFZVal + pushad + mov esi,[C4Ram] + mov ax,[esi+1F83h] + and ax,0FFh + mov [C4WFX2Val],ax +; mov [C4values],ax + mov ax,[esi+1F86h] + and ax,0FFh + mov [C4WFY2Val],ax +; mov [C4values+2],ax + mov ax,[esi+1F89h] + and ax,0FFh + mov [C4WFDist],ax +; mov [C4values+4],ax + mov ax,[esi+1F8Ch] + and ax,0FFh + mov [C4WFScale],ax +; mov [C4values+6],ax + + ; transform vertices (MMX2 - 36 vertices, 54 lines) + xor ecx,ecx + mov cx,[esi+1F80h] + xor al,al +.loop + mov ax,[esi+1] + mov [C4WFXVal],ax + mov ax,[esi+5] + mov [C4WFYVal],ax + mov ax,[esi+9] + mov [C4WFZVal],ax + push esi + push ecx + call C4TransfWireFrame + pop ecx + pop esi + ; Displace + mov ax,[C4WFXVal] + add ax,80h + mov [esi+1],ax + mov ax,[C4WFYVal] + add ax,50h + mov [esi+5],ax + add esi,10h + loop .loop + ; Uses 6001,6005,6600,6602,6605 + + mov esi,[C4Ram] + mov word[esi+$600],23 + mov word[esi+$602],60h + mov word[esi+$605],40h + mov word[esi+$600+8],23 + mov word[esi+$602+8],60h + mov word[esi+$605+8],40h + + xor ecx,ecx + mov cx,[esi+0B00h] + mov edi,esi + add edi,0B02h +.lineloop + xor eax,eax + mov al,[edi] + shl eax,4 + add eax,[C4Ram] + mov bx,[eax+1] + mov [C4WFXVal],bx + mov bx,[eax+5] + mov [C4WFYVal],bx + xor eax,eax + mov al,[edi+1] + shl eax,4 + add eax,[C4Ram] + mov bx,[eax+1] + mov [C4WFX2Val],bx + mov bx,[eax+5] + mov [C4WFY2Val],bx + push esi + push edi + push ecx + call C4CalcWireFrame + pop ecx + pop edi + pop esi + mov ax,[C4WFDist] + or ax,ax + jnz .yeswire + mov ax,1 +.yeswire + mov word[esi+$600],ax + mov ax,[C4WFXVal] + mov word[esi+$602],ax + mov ax,[C4WFYVal] + mov word[esi+$605],ax + add edi,2 + add esi,8 + dec ecx + jnz near .lineloop +.done + popad + ret + +C4Transform: + ; 7F81,4,7,9,A,B,0,1,D + pushad + mov esi,[C4Ram] + mov ax,word[esi+1F81h] + mov [C4WFXVal],ax + mov ax,word[esi+1F84h] + mov [C4WFYVal],ax + mov ax,word[esi+1F87h] + mov [C4WFZVal],ax + mov al,[esi+1F90h] + mov [C4WFScale],al + mov al,[esi+1F89h] + mov [C4WFX2Val],al + mov al,[esi+1F8Ah] + mov [C4WFY2Val],al + mov al,[esi+1F8Bh] + mov [C4WFDist],al +EXTSYM C4TransfWireFrame2 + call C4TransfWireFrame2 + mov ax,[C4WFXVal] + mov word[esi+1F80h],ax + mov ax,[C4WFYVal] + mov word[esi+1F83h],ax + popad + ret + +SECTION .data +C4SprPos dd 0 +C4SprScale dd 0 +C4SprScaleY dd 0 +C4SprScaler dd 0 +C4SprScalerY dd 0 +C4SprPtr dd 0 +C4SprPtrInc dd 0 +NEWSYM C4values, dd 0,0,0 +SECTION .text + +C4activate: + cmp ecx,1F4Fh + jne .noc4test + push esi + mov esi,[C4Ram] + cmp byte[esi+1F4Dh],0Eh + jne .befnoc4test + test al,0C3h + jnz .befnoc4test + shr al,2 + mov [esi+1F80h],al + pop esi + ret +.befnoc4test + pop esi +.noc4test + cmp al,00h + je near .dosprites + cmp al,01h + je near .dowireframe + cmp al,05h ; ? + je near .propulsion + cmp al,0Dh ; ? + je near .equatevelocity + cmp al,10h ; supply angle+distance, return x/y displacement + je near .direction + cmp al,13h ; Convert polar coordinates to rectangular 2 (similar to 10) + je near .polarcord2 + cmp al,15h ; ? + je near .calcdistance + cmp al,1Fh ; supply x/y displacement, return angle (+distance?) + je near .calcangle + cmp al,22h ; supply x/y displacement, return angle (+distance?) + je near .linearray + cmp al,25h + je near .multiply + cmp al,2Dh ; ??? + je near .transform + cmp al,40h + je near .sum + cmp al,54h + je near .square + cmp al,5Ch + je near .immediatereg + cmp al,89h + je near .immediaterom + ret +.dowireframe + call WireFrameB + ret +.linearray + pushad + ; C,F,0,3,6,9 -> 6800 (E1h bytes) + ; 0,3 = screen scroll coordinates + ; 6,9 = light source coordinates + ; C,F = angle of both arrays + mov esi,[C4Ram] + xor ecx,ecx +.loopline + ; process position + xor eax,eax + mov al,[esi+1F8Ch] + or ecx,ecx + jz .secondlineb + mov al,[esi+1F8Fh] +.secondlineb + test al,80h + jz .notua + or ah,1 +.notua + movsx ebx,word[CosTable+eax*2] + mov ax,word[SinTable+eax*2] + shl eax,16 + cmp ebx,0 + je near .finish + xor edx,edx + test eax,80000000h + jz .notnegline + mov edx,0FFFFFFFFh +.notnegline + idiv ebx + mov [C4Temp],eax + xor edx,edx + mov bx,[esi+1F83h] + sub bx,[esi+1F89h] + dec bx + movsx ebx,bx +.nextline + test ebx,80000000h + jnz .none + mov eax,[C4Temp] + imul eax,ebx + sar eax,16 + sub ax,[esi+1F80h] + add ax,[esi+1F86h] + inc ax + add ax,cx + cmp ax,0 + jge .not0line + xor ax,ax + or ecx,ecx + jz .not0line + mov byte[esi+edx+$800],1 +.not0line + cmp ax,255 + jl .not255line + mov ax,255 +.not255line + jmp .doneline +.none + mov al,1 + sub al,cl +.doneline + or ecx,ecx + jnz .secondline + mov [esi+edx+$800],al + jmp .firstline +.secondline + mov [esi+edx+$900],al +.firstline + inc ebx + inc edx + cmp edx,0E1h + jne .nextline + or ecx,ecx + jnz .finish + mov ecx,1 + jmp .loopline +.finish + mov cx,[C4Temp] +; mov [C4values],cx + mov cx,[C4Temp+2] +; mov [C4values+2],cx + mov cx,[esi+1F8Ch] +; mov [C4values+4],cx + mov cx,[esi+1F8Fh] +; mov [C4values+6],cx + popad + ret +.propulsion + pushad + ; 81 = 5B, 83 = 0x300 + ; 0x300 = /1, 0x280 = /4 + mov esi,[C4Ram] + + mov cx,[esi+1F83h] + mov [C4values+2],cx + mov cx,[esi+1F81h] + mov [C4values],cx + xor bx,bx + +; mov ax,256*256 + xor ax,ax + mov dx,1 + mov bx,[esi+1F83h] + or dx,dx + jz .done + idiv bx + mov [C4values+6],ax + mov bx,[esi+1F81h] + imul bx + shl edx,16 + mov dx,ax + sar edx,8 +.done + mov word[esi+1F80h],dx + mov [C4values+4],dx + +; and eax,1FFh +; mov bx,[SinTable+eax*2] +; mov ax,[esi+1F81h] ; distance? +; imul bx +; mov ax,dx +; shl ax,1 +; shl dx,3 +; add dx,ax + + popad + ret +.polarcord2 + pushad + mov esi,[C4Ram] + xor ecx,ecx + mov cx,[esi+1F80h] + and ecx,1FFh + movsx eax,word[esi+1F83h] + add eax,eax + movsx ebx,word[CosTable+ecx*2] + imul ebx,eax + sar ebx,8 + adc ebx,0 + mov [esi+1F86h],ebx + movsx ebx,word[SinTable+ecx*2] + imul ebx,eax + sar ebx,8 + adc ebx,0 + mov [esi+1F89h],bx + sar ebx,16 + mov [esi+1F8Bh],bl + popad + ret +.dosprites +; mov byte[debstop3],0 + push eax + mov eax,[C4Ram] + cmp byte[eax+1F4Dh],0 + je near .sprites + cmp byte[eax+1F4Dh],3 + je near .scaler + cmp byte[eax+1F4Dh],5 + je near .lines + cmp byte[eax+1F4Dh],7 + je near .rotater + cmp byte[eax+1F4Dh],8 + je near .wireframeb + cmp byte[eax+1F4Dh],0Bh + je near .disintegrate + cmp byte[eax+1F4Dh],0Ch + je near .bitmap + pop eax + ret +.wireframeb + pop eax + call WireFrameB2 + ret +.sprites + pop eax + call C4ProcessSprites + ret +.disintegrate + call C4SprDisintegrate + pop eax + ret +.dolines +; mov byte[debstop3],0 + ret +.bitmap + call C4BitPlaneWave + pop eax + ret +.calcdistance +EXTSYM C41FXVal,C41FYVal,C41FAngleRes,C41FDist,C4Op1F,C4Op15 + pushad + mov esi,[C4Ram] + mov bx,[esi+1F80h] + mov [C41FXVal],bx + mov bx,[esi+1F83h] + mov [C41FYVal],bx +; mov eax,[C4Ram] +; mov cx,[eax+1F80h] +; mov [C4values+0],cx +; mov cx,[eax+1F83h] +; mov [C4values+2],cx + call C4Op15 + mov eax,[C4Ram] + mov bx,[C41FDist] + mov [eax+1F80h],bx +; mov word[eax+1F80h],50 +; mov cx,[eax+1F80h] +; mov [C4values+4],cx + popad + ret +.calcangle + pushad + mov esi,[C4Ram] + mov bx,[esi+1F80h] + mov [C41FXVal],bx + mov bx,[esi+1F83h] + mov [C41FYVal],bx + call C4Op1F + mov eax,[C4Ram] + mov bx,[C41FAngleRes] + mov [eax+1F86h],bx +; mov esi,[C4Ram] +; mov cx,[esi+1F86h] +; mov [C4values],cx +; mov cx,[esi+1F80h] +; mov [C4values+2],cx +; mov cx,[esi+1F83h] +; mov [C4values+4],cx + popad + ret +.transform + ; 7F81,4,7,9,A,B,0,1,D +; mov byte[debstop3],0 + pushad +; mov eax,[C4Ram] + call C4Transform +; mov word[eax+1F80h],0 +; mov word[eax+1F83h],0 + popad + ret +.multiply + pushad + mov esi,[C4Ram] + mov eax,[esi+1F80h] + and eax,0FFFFFFh + mov ebx,[esi+1F83h] + and ebx,0FFFFFFh + imul eax,ebx + mov [esi+1F80h],eax + popad + ret +.sum + pushad + xor eax,eax + xor ebx,ebx + mov esi,[C4Ram] + mov ecx,800h +.sumloop + mov bl,byte[esi] + inc esi + add ax,bx + dec ecx + jnz .sumloop + mov [esi+1F80h-0800h],ax + popad + ret +.square + pushad + xor edx,edx + mov esi,[C4Ram] + mov eax,[esi+1F80h] + shl eax,8 + sar eax,8 + imul eax + mov [esi+1F83h],eax + mov [esi+1F87h],dx + popad + ret +.equatevelocity +EXTSYM C41FDistVal,C4Op0D + pushad + mov esi,[C4Ram] + mov bx,[esi+1F80h] + mov [C41FXVal],bx + mov bx,[esi+1F83h] + mov [C41FYVal],bx + mov bx,[esi+1F86h] + mov [C41FDistVal],bx + call C4Op0D + mov bx,[C41FXVal] + mov [esi+1F89h],bx + mov bx,[C41FYVal] + mov [esi+1F8Ch],bx + popad + ret + + + pushad + mov esi,[C4Ram] + mov cx,[esi+$1F86] + cmp cx,40h + jb .nomult + shr cx,7 +.nomult + mov ax,[esi+$1F80] +; imul cx + shl ax,4 + mov word[esi+$1F89],ax + mov ax,[esi+$1F83] +; imul cx + shl ax,4 + mov word[esi+$1F8C],ax +; mov cx,[esi+$1F80] +; mov [C4values],cx +; mov cx,[esi+$1F83] +; mov [C4values+2],cx +; mov cx,[esi+$1F86] +; mov [C4values+4],cx + popad + ret +.lines + call C4WireFrame + pop eax + ret +.scaler + push esi + push ecx + mov esi,[C4Ram] +; mov cx,[esi+1F8Fh] +; mov [C4values],cx +; mov cx,[esi+1F92h] +; mov [C4values+2],cx +; mov cx,[esi+1F80h] +; mov [C4values+4],cx + pop ecx + pop esi + call C4SprScaleR + pop eax + ret +.rotater + push esi + push ecx + mov esi,[C4Ram] +; mov cx,[esi+1F8Fh] +; mov [C4values],cx +; mov cx,[esi+1F92h] +; mov [C4values+2],cx +; mov cx,[esi+1F80h] +; mov [C4values+4],cx + pop ecx + pop esi + call C4SprRotateR + pop eax + ret +.direction + push eax + push ebx + push esi + push edx + push ecx + mov esi,[C4Ram] + xor ecx,ecx + mov ax,[esi+1F80h] + and eax,1FFh + mov bx,[CosTable+eax*2] + mov ax,[esi+1F83h] + imul bx + add ax,ax + adc dx,dx + mov ax,dx + movsx edx,dx + mov [esi+1F86h],edx + mov ax,[esi+1F80h] + and eax,1FFh + mov bx,[SinTable+eax*2] + mov ax,[esi+1F83h] + imul bx + add ax,ax + adc dx,dx + mov ax,dx + movsx edx,dx + mov eax,edx + sar eax,6 + sub edx,eax + mov al,[esi+198Ch] + mov [esi+1F89h],edx + mov [esi+198Ch],al +; mov cx,[esi+1F80h] +; mov [C4values],cx +; mov cx,[esi+1F83h] +; mov [C4values+2],cx +; mov cx,[esi+1F86h] +; mov [C4values+4],cx + pop ecx + pop edx + pop esi + pop ebx + pop eax + ret +.immediaterom + push eax + mov eax,[C4Ram] + mov byte[eax+1F80h],36h + mov byte[eax+1F81h],43h + mov byte[eax+1F82h],05h + pop eax + ret +.immediatereg + push eax + mov eax,[C4Ram] + mov dword[eax+0*4],0FF000000h + mov dword[eax+1*4],0FF00FFFFh + mov dword[eax+2*4],0FF000000h + mov dword[eax+3*4],00000FFFFh + mov dword[eax+4*4],00000FFFFh + mov dword[eax+5*4],07FFFFF80h + mov dword[eax+6*4],0FF008000h + mov dword[eax+7*4],07FFF007Fh + mov dword[eax+8*4],0FFFF7FFFh + mov dword[eax+9*4],0FF010000h + mov dword[eax+10*4],00100FEFFh + mov dword[eax+11*4],000FEFF00h + pop eax + ret + +NEWSYM C4RegFunction + add ecx,[C4Ram] + mov [ecx],al + sub ecx,[C4Ram] + cmp ecx,1F4Fh + je near C4activate + ret + +NEWSYM C4ReadReg + add ecx,[C4Ram] + mov al,[ecx] + sub ecx,[C4Ram] + ret + +NEWSYM C4WriteReg + add ecx,[C4Ram] + mov [ecx],al + sub ecx,[C4Ram] + cmp ecx,1F47h + je .C4Memcpy + ret + +.C4Memcpy +EXTSYM C4LoaDMem + pushad + push dword C4Ram + call C4LoaDMem + popad + ret + +SECTION .data +SinTable: +dw $00000,$00192,$00324,$004B6,$00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FAB +dw $01139,$012C8,$01455,$015E2,$0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209F +dw $02223,$023A6,$02528,$026A8,$02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FB +dw $0326E,$033DE,$0354D,$036BA,$03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073 +dw $041CE,$04325,$0447A,$045CD,$0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBF +dw $04FFB,$05133,$05269,$0539B,$054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9D +dw $05CB4,$05DC7,$05ED7,$05FE3,$060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CF +dw $067BD,$068A6,$0698C,$06A6D,$06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023 +dw $070E2,$0719E,$07255,$07307,$073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776C +dw $077FA,$07884,$07909,$0798A,$07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89 +dw $07CE3,$07D39,$07D8A,$07DD6,$07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62 +dw $07F87,$07FA7,$07FC2,$07FD8,$07FE9,$07FF6,$07FFD,$07FFF,$07FFD,$07FF6,$07FE9 +dw $07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09,$07ED5,$07E9D,$07E5F,$07E1D +dw $07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5,$07B5D,$07AEF,$07A7D,$07A05 +dw $0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641,$075A5,$07504,$0745F,$073B5 +dw $07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96,$06DCA,$06CF9,$06C24,$06B4A +dw $06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8,$063EF,$062F2,$061F1,$060EC +dw $05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964,$05842,$0571D,$055F5,$054CA +dw $0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3F,$04AFB,$049B4,$04869,$0471C +dw $045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8,$03C56,$03AF2,$0398C,$03824 +dw $036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11,$02C98,$02B1F,$029A3,$02826 +dw $026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93,$01C0B,$01A82,$018F8,$0176D +dw $015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8B,$00AFB,$0096A,$007D9,$00647 +dw $004B6,$00324,$00192 +dw $00000,$0FE6E,$0FCDC,$0FB4A,$0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055 +dw $0EEC7,$0ED38,$0EBAB,$0EA1E,$0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61 +dw $0DDDD,$0DC5A,$0DAD8,$0D958,$0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05 +dw $0CD92,$0CC22,$0CAB3,$0C946,$0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8D +dw $0BE32,$0BCDB,$0BB86,$0BA33,$0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141 +dw $0B005,$0AECD,$0AD97,$0AC65,$0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463 +dw $0A34C,$0A239,$0A129,$0A01D,$09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931 +dw $09843,$0975A,$09674,$09593,$094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDD +dw $08F1E,$08E62,$08DAB,$08CF9,$08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894 +dw $08806,$0877C,$086F7,$08676,$085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377 +dw $0831D,$082C7,$08276,$0822A,$081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809E +dw $08079,$08059,$0803E,$08028,$08017,$0800A,$08003,$08001,$08003,$0800A,$08017 +dw $08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7,$0812B,$08163,$081A1,$081E3 +dw $0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B,$084A3,$08511,$08583,$085FB +dw $08676,$086F7,$0877C,$08806,$08894,$08927,$089BF,$08A5B,$08AFC,$08BA1,$08C4B +dw $08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A,$09236,$09307,$093DC,$094B6 +dw $09593,$09674,$0975A,$09843,$09931,$09A23,$09B18,$09C11,$09D0E,$09E0F,$09F14 +dw $0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C,$0A7BE,$0A8E3,$0AA0B,$0AB36 +dw $0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1,$0B505,$0B64C,$0B797,$0B8E4 +dw $0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248,$0C3AA,$0C50E,$0C674,$0C7DC +dw $0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF,$0D368,$0D4E1,$0D65D,$0D7DA +dw $0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D,$0E3F5,$0E57E,$0E708,$0E893 +dw $0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375,$0F505,$0F696,$0F827,$0F9B9 +dw $0FB4A,$0FCDC,$0FE6E + + +CosTable: +dw $07FFF,$07FFD,$07FF6,$07FE9,$07FD8,$07FC2,$07FA7,$07F87,$07F62,$07F38,$07F09 +dw $07ED5,$07E9D,$07E5F,$07E1D,$07DD6,$07D8A,$07D39,$07CE3,$07C89,$07C29,$07BC5 +dw $07B5D,$07AEF,$07A7D,$07A05,$0798A,$07909,$07884,$077FA,$0776C,$076D9,$07641 +dw $075A5,$07504,$0745F,$073B5,$07307,$07255,$0719E,$070E2,$07023,$06F5F,$06E96 +dw $06DCA,$06CF9,$06C24,$06B4A,$06A6D,$0698C,$068A6,$067BD,$066CF,$065DD,$064E8 +dw $063EF,$062F2,$061F1,$060EC,$05FE3,$05ED7,$05DC7,$05CB4,$05B9D,$05A82,$05964 +dw $05842,$0571D,$055F5,$054CA,$0539B,$05269,$05133,$04FFB,$04EBF,$04D81,$04C3F +dw $04AFB,$049B4,$04869,$0471C,$045CD,$0447A,$04325,$041CE,$04073,$03F17,$03DB8 +dw $03C56,$03AF2,$0398C,$03824,$036BA,$0354D,$033DE,$0326E,$030FB,$02F87,$02E11 +dw $02C98,$02B1F,$029A3,$02826,$026A8,$02528,$023A6,$02223,$0209F,$01F19,$01D93 +dw $01C0B,$01A82,$018F8,$0176D,$015E2,$01455,$012C8,$01139,$00FAB,$00E1B,$00C8B +dw $00AFB,$0096A,$007D9,$00647,$004B6,$00324,$00192,$00000,$0FE6E,$0FCDC,$0FB4A +dw $0F9B9,$0F827,$0F696,$0F505,$0F375,$0F1E5,$0F055,$0EEC7,$0ED38,$0EBAB,$0EA1E +dw $0E893,$0E708,$0E57E,$0E3F5,$0E26D,$0E0E7,$0DF61,$0DDDD,$0DC5A,$0DAD8,$0D958 +dw $0D7DA,$0D65D,$0D4E1,$0D368,$0D1EF,$0D079,$0CF05,$0CD92,$0CC22,$0CAB3,$0C946 +dw $0C7DC,$0C674,$0C50E,$0C3AA,$0C248,$0C0E9,$0BF8D,$0BE32,$0BCDB,$0BB86,$0BA33 +dw $0B8E4,$0B797,$0B64C,$0B505,$0B3C1,$0B27F,$0B141,$0B005,$0AECD,$0AD97,$0AC65 +dw $0AB36,$0AA0B,$0A8E3,$0A7BE,$0A69C,$0A57E,$0A463,$0A34C,$0A239,$0A129,$0A01D +dw $09F14,$09E0F,$09D0E,$09C11,$09B18,$09A23,$09931,$09843,$0975A,$09674,$09593 +dw $094B6,$093DC,$09307,$09236,$0916A,$090A1,$08FDD,$08F1E,$08E62,$08DAB,$08CF9 +dw $08C4B,$08BA1,$08AFC,$08A5B,$089BF,$08927,$08894,$08806,$0877C,$086F7,$08676 +dw $085FB,$08583,$08511,$084A3,$0843B,$083D7,$08377,$0831D,$082C7,$08276,$0822A +dw $081E3,$081A1,$08163,$0812B,$080F7,$080C8,$0809E,$08079,$08059,$0803E,$08028 +dw $08017,$0800A,$08003 +dw $08001,$08003,$0800A,$08017,$08028,$0803E,$08059,$08079,$0809E,$080C8,$080F7, +dw $0812B,$08163,$081A1,$081E3,$0822A,$08276,$082C7,$0831D,$08377,$083D7,$0843B, +dw $084A3,$08511,$08583,$085FB,$08676,$086F7,$0877C,$08806,$08894,$08927,$089BF, +dw $08A5B,$08AFC,$08BA1,$08C4B,$08CF9,$08DAB,$08E62,$08F1E,$08FDD,$090A1,$0916A, +dw $09236,$09307,$093DC,$094B6,$09593,$09674,$0975A,$09843,$09931,$09A23,$09B18, +dw $09C11,$09D0E,$09E0F,$09F14,$0A01D,$0A129,$0A239,$0A34C,$0A463,$0A57E,$0A69C, +dw $0A7BE,$0A8E3,$0AA0B,$0AB36,$0AC65,$0AD97,$0AECD,$0B005,$0B141,$0B27F,$0B3C1, +dw $0B505,$0B64C,$0B797,$0B8E4,$0BA33,$0BB86,$0BCDB,$0BE32,$0BF8D,$0C0E9,$0C248, +dw $0C3AA,$0C50E,$0C674,$0C7DC,$0C946,$0CAB3,$0CC22,$0CD92,$0CF05,$0D079,$0D1EF, +dw $0D368,$0D4E1,$0D65D,$0D7DA,$0D958,$0DAD8,$0DC5A,$0DDDD,$0DF61,$0E0E7,$0E26D, +dw $0E3F5,$0E57E,$0E708,$0E893,$0EA1E,$0EBAB,$0ED38,$0EEC7,$0F055,$0F1E5,$0F375, +dw $0F505,$0F696,$0F827,$0F9B9,$0FB4A,$0FCDC,$0FE6E,$00000,$00192,$00324,$004B6, +dw $00647,$007D9,$0096A,$00AFB,$00C8B,$00E1B,$00FAB,$01139,$012C8,$01455,$015E2, +dw $0176D,$018F8,$01A82,$01C0B,$01D93,$01F19,$0209F,$02223,$023A6,$02528,$026A8, +dw $02826,$029A3,$02B1F,$02C98,$02E11,$02F87,$030FB,$0326E,$033DE,$0354D,$036BA, +dw $03824,$0398C,$03AF2,$03C56,$03DB8,$03F17,$04073,$041CE,$04325,$0447A,$045CD, +dw $0471C,$04869,$049B4,$04AFB,$04C3F,$04D81,$04EBF,$04FFB,$05133,$05269,$0539B, +dw $054CA,$055F5,$0571D,$05842,$05964,$05A82,$05B9D,$05CB4,$05DC7,$05ED7,$05FE3, +dw $060EC,$061F1,$062F2,$063EF,$064E8,$065DD,$066CF,$067BD,$068A6,$0698C,$06A6D, +dw $06B4A,$06C24,$06CF9,$06DCA,$06E96,$06F5F,$07023,$070E2,$0719E,$07255,$07307, +dw $073B5,$0745F,$07504,$075A5,$07641,$076D9,$0776C,$077FA,$07884,$07909,$0798A, +dw $07A05,$07A7D,$07AEF,$07B5D,$07BC5,$07C29,$07C89,$07CE3,$07D39,$07D8A,$07DD6, +dw $07E1D,$07E5F,$07E9D,$07ED5,$07F09,$07F38,$07F62,$07F87,$07FA7,$07FC2,$07FD8, +dw $07FE9,$07FF6,$07FFD + +SECTION .text diff --git a/src/i386/cpuexec.S b/src/i386/cpuexec.S new file mode 100644 index 0000000..5cafa3c --- /dev/null +++ b/src/i386/cpuexec.S @@ -0,0 +1,626 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "asmstruc.h" +#include "asmops.h" +#include "spcops.h" + +.globl MainAsmLoop + +.text + .align 4 +.globl S9xMainLoop +S9xMainLoop: + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx + LOAD_REGISTERS +.L9: + cmpb $0,APUExecuting + je .L12 +.apuloop: + cmpl CYCLES, APUCycles + jg .L12 +#ifdef DEBUGGER + testb $2,APUFlags + je .L14 + STORE_REGISTERS + ccall S9xTraceAPU + LOAD_REGISTERS +.L14: +#endif + xorl %eax,%eax +#ifdef SPC700_C + movl APUPC, %edx + SAVE_CYCLES + movb (%edx),%al +#else + movb (APUPC),%al +#endif + movl S9xAPUCycles(,%eax,4), %edx + movl S9xApuOpcodes(,%eax,4),%eax + addl %edx, APUCycles + call *%eax +#ifdef SPC700_C + LOAD_CYCLES +#endif + jmp .apuloop +.L12: + cmpl $0, Flags + je .L15 + movl Flags, %eax + testb %al, %al + jge .NO_NMI + decl NMICycleCount + jnz .NO_NMI + andb $~NMI_FLAG, %al + movl %eax, Flags + cmpb $0, WaitingForInterrupt + je .L17 + movb $0, WaitingForInterrupt + incl PC +.L17: + call S9xOpcode_NMI +.NO_NMI: +#ifdef DEBUGGER + testb $BREAK_FLAG, Flags + jz .NO_BREAK_POINTS + pushl %esi + pushl %ebx + movl $S9xBreakpoint, %esi + movb PB, %bl + xorl %edx, %edx + movl PC, %ecx + subl PCBase, %ecx + +.BREAK_CHECK_LOOP: + movzwl %dx, %eax + sall $2, %eax + cmpb $0, S9xBreakpoint(%eax) + je .BREAK_MATCH_FAILED + cmpb %bl, 1(%esi, %eax) + jne .BREAK_MATCH_FAILED + movzwl 2(%esi, %eax), %eax + cmpl %ecx, %eax + jne .BREAK_MATCH_FAILED + orb $DEBUG_MODE_FLAG, Flags +.BREAK_MATCH_FAILED: + incw %dx + cmpw $6, %dx + jne .BREAK_CHECK_LOOP + popl %ebx + popl %esi +.NO_BREAK_POINTS: +#endif + testl $IRQ_PENDING_FLAG, Flags + jz .NO_PENDING_IRQ + cmpl $0, IRQCycleCount + jne .DEC_IRQ_CYCLE_COUNT + testb $0xff, WaitingForInterrupt + jz .NOT_WAITING + movb $0, WaitingForInterrupt + incl PC +.NOT_WAITING: + testb $0xff, IRQActive + jz .CLEAR_PENDING_IRQ_FLAG + testb $0xff, DisableIRQ + jnz .CLEAR_PENDING_IRQ_FLAG + testb $IRQ, FLAGS + jnz .NO_PENDING_IRQ + call S9xOpcode_IRQ + jmp .NO_PENDING_IRQ + +.CLEAR_PENDING_IRQ_FLAG: + andl $~IRQ_PENDING_FLAG, Flags + jmp .NO_PENDING_IRQ + +.DEC_IRQ_CYCLE_COUNT: + decl IRQCycleCount + jnz .DEC_IRQ_CYCLE_COUNT_DONE + testb $IRQ, FLAGS + jz .DEC_IRQ_CYCLE_COUNT_DONE + movb $1, IRQCycleCount +.DEC_IRQ_CYCLE_COUNT_DONE: + +.NO_PENDING_IRQ: +#ifdef DEBUGGER + movl Flags, %eax + testb $DEBUG_MODE_FLAG,%al + jnz .L31 +#else + movl Flags, %eax +#endif + testb $SCAN_KEYS_FLAG, %al + jnz .L31 +.L28: +#ifdef DEBUGGER + testb $TRACE_FLAG, %al + jz .NO_TRACE + STORE_REGISTERS + ccall S9xTrace + LOAD_REGISTERS +.NO_TRACE: + movl Flags, %eax + testb $SINGLE_STEP_FLAG, %al + jz .L15 + andb $~SINGLE_STEP_FLAG, %al + orb $DEBUG_MODE_FLAG, %al + movl %eax, Flags +#endif +.L15: + xorl %eax,%eax + +#ifdef CPU_SHUTDOWN + movl PC, PCAtOpcodeStart +#endif + movb (PC), %al + addl MemSpeed, CYCLES + movl CPUOpcodes, %ecx + incl PC + jmp *(%ecx,%eax,4) +MainAsmLoop: + SAVE_CYCLES + ccall S9xUpdateAPUTimer + cmpb $0, SA1Executing + je .nosa1 + STORE_REGISTERS + call S9xSA1MainLoop + LOAD_REGISTERS +.nosa1: + cmpl NextEvent, CYCLES + jl .L9 + STORE_REGISTERS + call S9xDoHBlankProcessing + LOAD_REGISTERS + jmp .L9 +.L31: + S9xPackStatus S9xMainLoop + STORE_REGISTERS + subl PCBase, PC + movw %di, PCR +#ifdef SPC700_C + movl APUPC, %edx + movl APURAM, %eax + subl %eax, %edx + movw %dx, APUPCR +#else + subl APURAM, APUPC + movw %bp, APUPCR +#endif + APUS9xPackStatus S9xMainLoop + movl Flags, %eax + testb $SCAN_KEYS_FLAG, %al + jz .NoScanKeys + andb $~SCAN_KEYS_FLAG, %al + movl %eax, Flags +#ifdef DEBUGGER + testl $FRAME_ADVANCE_FLAG, %eax + jnz .NoScanKeys +#endif + ccall S9xSyncSpeed +.NoScanKeys: + +#ifdef DETECT_NASTY_FX_INTERLEAVE + movb BRKTriggered, %al + andb SuperFXEnabled, %al + jz .NoSuperFXBrkTest + andb TriedInterleavedMode2, %al + jnz .NoSuperFXBrkTest + movb $1, TriedInterleavedMode2 + movb $0, BRKTriggered + call S9xDeinterleaveMode2 +.NoSuperFXBrkTest: +#endif + popl %ebx + popl %esi + popl %edi + popl %ebp + + ret + +.globl S9xDoHBlankProcessing + +S9xDoHBlankProcessing: + pushl %edi + pushl %esi + pushl %ebx +#ifdef CPU_SHUTDOWN + incl WaitCounter +#endif + movb WhichEvent,%bl + cmpb $1,%bl + je .hblank_end + jg .L196 + testb %bl,%bl + jz .hblank_start + jmp .reschedule +.L196: + cmpb $3,%bl + jle .htimer_trigger + jmp .reschedule +.hblank_start: + movb HDMA,%dl + testb %dl,%dl + je .reschedule + movl V_Counter, %eax + cmpw ScreenHeight, %ax + ja .reschedule + xorl %eax,%eax + movb %dl,%al + pushl %eax + ccall S9xDoHDMA + movb %al,HDMA + addl $4,%esp + jmp .reschedule +.hblank_end: + ccall S9xSuperFXExec +#ifndef USE_SOUND_DESYNC + ccall S9xGenerateSound +#endif +.nosoundsync: + movl H_Max,%eax + subl %eax, Cycles + imull $10000, %eax, %ecx + subl %ecx, NextAPUTimerPos + cmpb $0, APUExecuting + je .apunotrunning + subl %eax, APUCycles +// addl %eax, smpcyc + jmp .apucycleskip +.apunotrunning: + movl $0, APUCycles +.apucycleskip: + movl V_Counter,%ecx + incl %ecx + incl Scanline + movl $-1,NextEvent + movl %ecx,V_Counter + testb $0xff, PAL + jz .ntsc_tv + cmpl $312,%ecx + jb .L161 + jmp .endofframe +.ntsc_tv: + cmpl $262,%ecx + jb .L161 +.endofframe: + xorl %edx, %edx + movl Flags,%ecx + movb %dl,NMIActive + orl $16,%ecx + movl %edx,V_Counter + movb %dl,HVBeamCounterLatched + movl %ecx,Flags + movb %dl,RangeTimeOver + + movl FillRAM, %ecx + xorb $0x80,0x213F(%ecx) + + ccall S9xStartHDMA +.L161: + movb VTimerEnabled,%al + testb %al,%al + je .L162 + movb HTimerEnabled,%dl + testb %dl,%dl + jne .L162 + xorl %eax,%eax + movw IRQVBeamPos,%ax + movl V_Counter,%ecx + cmpl %eax,%ecx + jne .L162 + + pushl $2 + call S9xSetIRQ + addl $4, %esp + +.L162: + xorl %eax,%eax + movl V_Counter,%edx + movw ScreenHeight,%ax + incl %eax + cmpl %eax,%edx + jne .L165 + ccall S9xEndScreenRefresh + movb Brightness,%al + xorl %ecx,%ecx + movb %al,MaxBrightness + movl FillRAM,%eax + movb %cl,HDMA + movb 0x2100(%eax),%cl + movb 0x4200(%eax),%dl + shrb $7,%cl + movb %cl,ForcedBlanking + movb $0x80, 0x4210(%eax) + + testb $0xff, ForcedBlanking + jnz .noOAMreset + movw SavedOAMAddr,%ax + movw %ax,OAMAddr + movb %ch,FirstSprite + testb $0xff, OAMPriorityRotation + jz .noOAMreset + shrw %ax + andb $0x7F,%al + testb $0x01,OAMFlip + jne .yesOAMReset + cmpb %al,FirstSprite + je .noOAMreset +.yesOAMReset: + movb %al,FirstSprite + movb $0xff,OBJChanged +.noOAMreset: + movb %ch,OAMFlip + + testb %dl,%dl + jge .L165 + orl $NMI_FLAG, Flags + movb $1, NMIActive + movl NMITriggerPoint, %eax + movl %eax, NMICycleCount +.L165: + xorl %eax, %eax + movw ScreenHeight,%ax + addl $3,%eax + cmpl V_Counter,%eax + jne .NoJoypadUpdate + ccall S9xUpdateJoypads +.NoJoypadUpdate: + movl V_Counter,%eax + cmpl $1,%eax + jne .L177 + movl FillRAM,%eax + andl $~NMI_FLAG,Flags + movb $0,0x4210(%eax) + ccall S9xStartScreenRefresh + +.L177: + movl V_Counter,%edx + testl %edx,%edx + je .L178 + xorl %eax,%eax + movw ScreenHeight,%ax + incl %eax + cmpl %eax,%edx + jae .L178 + movb V_Counter,%al + decb %al + andl $255,%eax + pushl %eax + ccall RenderLine + addl $4,%esp +.L178: +#if 0 + movl APUTimerErrorCounter,%eax + incl %eax + movl %eax,APUTimerErrorCounter + andl $31,%eax + jz .reschedule +#endif + +#if 0 + movb APUTimerEnabled + 2,%cl + testb %cl,%cl + je .L179 + movw APUTimer + 4,%ax + addl $4,%eax + movw %ax,APUTimer + 4 + cmpw %ax,APUTimerTarget + 4 + ja .L179 +.L182: + movl APURAM,%edx + movb 255(%edx),%al + incb %al + andb $15,%al + movb %al,255(%edx) + movw APUTimerTarget + 4,%dx + movw APUTimer + 4,%ax + movl APUWaitCounter,%ecx + subl %edx,%eax + incl %ecx + movb $1,APUExecuting + movw %ax,APUTimer + 4 + movl %ecx,APUWaitCounter + cmpw %dx,%ax + jae .L182 +.L179: + testb $1,V_Counter + je .reschedule + movb APUTimerEnabled,%al + testb %al,%al + je .L185 + incw APUTimer + movw APUTimerTarget,%ax + cmpw %ax,APUTimer + jb .L185 + movl APURAM,%edx + movb 253(%edx),%al + incb %al + andb $15,%al + movb %al,253(%edx) + movl APUWaitCounter,%edx + incl %edx + movw $0,APUTimer + movb $1,APUExecuting + movl %edx,APUWaitCounter +.L185: + movb APUTimerEnabled + 1,%al + testb %al,%al + je .reschedule + incw APUTimer + 2 + movw APUTimerTarget + 2,%ax + cmpw %ax,APUTimer + 2 + jb .reschedule + movl APURAM,%edx + movb 254(%edx),%al + incb %al + andb $15,%al + movb %al,254(%edx) + movl APUWaitCounter,%edx + incl %edx + movw $0,APUTimer + 2 + movb $1,APUExecuting + movl %edx,APUWaitCounter +#endif + jmp .reschedule +.htimer_trigger: + cmpb $0, HTimerEnabled + je .reschedule + cmpb $0, VTimerEnabled + je .L191 + xorl %eax,%eax + movw IRQVBeamPos,%ax + movl V_Counter,%edx + cmpl %eax,%edx + jne .reschedule +.L191: + // CHANGED: 20/11/00 + pushl $1 + call S9xSetIRQ + addl $4, %esp + +.reschedule: + cmpb $0, WhichEvent + je .next_is_hblank_end + cmpb $3, WhichEvent + jne .next_is_hblank_start +.next_is_hblank_end: + movb $1,%bl + movl H_Max,%edx + jmp .skip +.next_is_hblank_start: + xorl %ebx,%ebx + movl HBlankStart,%edx +.skip: + cmpb $0, HTimerEnabled + je .not_enabled + movswl HTimerPosition,%esi + cmpl %edx,%esi + jge .not_enabled + movl NextEvent,%eax + cmpl %eax,%esi + jle .not_enabled + cmpb $0, VTimerEnabled + je .enabled + xorl %eax,%eax + movw IRQVBeamPos,%ax + movl V_Counter,%ecx + cmpl %eax,%ecx + jne .not_enabled +.enabled: + movb $2,%bl + cmpl %esi, HBlankStart + jg .before + movb $3,%bl +.before: + movl %esi,%edx +.not_enabled: + movb %bl,WhichEvent + popl %ebx + popl %esi + movl %edx,NextEvent + popl %edi + ret + +.text + .align 4 +.globl S9xSetIRQ +S9xSetIRQ: + movl 4(%esp), %eax + orb %al,IRQActive + // CHANGED: 20/11/00 + movl $3, IRQCycleCount + orl $IRQ_PENDING_FLAG, Flags + cmpb $0, WaitingForInterrupt + je .NoIncPC + movb $0, WaitingForInterrupt + // IRQ must trigger immediately after a WAI instruction - + // Final Fantasy Mystic Quest requires this. + movl $0, IRQCycleCount + incl PCS +.NoIncPC: + ret + +.globl S9xClearIRQ +S9xClearIRQ: + movl 4(%esp), %eax + xorl $~0, %eax + andb IRQActive, %al + movb %al, IRQActive + jnz .irqsstillpending + andl $~IRQ_PENDING_FLAG, Flags +.irqsstillpending: + ret diff --git a/src/i386/cpuops.S b/src/i386/cpuops.S new file mode 100644 index 0000000..68a37bf --- /dev/null +++ b/src/i386/cpuops.S @@ -0,0 +1,4641 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "asmstruc.h" +#include "asmaddr.h" +#include "asmops.h" +#include "getset.S" + +/* ADC */ +Op69M1: + Immediate8 ADC READ + Adc8 IMM8 + +Op69M0: + Immediate16 ADC2 READ + Adc16 IMM16 + +Op65M1: + Direct8 ADC2 READ + call S9xGetByte + Adc8 DIR8 + +Op65M0: + Direct8 ADC READ + call S9xGetWord + Adc16 DIR16 + +Op75M1: + DirectIndexedX8 ADC READ + call S9xGetByte + Adc8 DIX8 + +Op75M0: + DirectIndexedX8 ADC2 READ + call S9xGetWord + Adc16 DIX16 + +Op72M1: + DirectIndirect8 ADC READ + call S9xGetByte + Adc8 DI8 + +Op72M0: + DirectIndirect8 ADC2 READ + call S9xGetWord + Adc16 DI16 + +Op61M1: + DirectIndexedIndirect8 ADC READ + call S9xGetByte + Adc8 DII8 + +Op61M0: + DirectIndexedIndirect8 ADC2 READ + call S9xGetWord + Adc16 DII16 + +Op71M1: + DirectIndirectIndexed8 ADC READ + call S9xGetByte + Adc8 DIIY8 + +Op71M0: + DirectIndirectIndexed8 ADC2 READ + call S9xGetWord + Adc16 DIIY16 + +Op67M1: + DirectIndirectLong8 ADC READ + call S9xGetByte + Adc8 DIL8 + +Op67M0: + DirectIndirectLong8 ADC2 READ + call S9xGetWord + Adc16 DIL16 + +Op77M1: + DirectIndirectIndexedLong8 ADC READ + call S9xGetByte + Adc8 DIIL8 + +Op77M0: + DirectIndirectIndexedLong8 ADC2 READ + call S9xGetWord + Adc16 DIIL8 + +Op6DM1: + Absolute8 ADC READ + call S9xGetByte + Adc8 ABS8 + +Op6DM0: + Absolute8 ADC2 READ + call S9xGetWord + Adc16 ABS16 + +Op7DM1: + AbsoluteIndexedX8 ADC READ + call S9xGetByte + Adc8 ABSX8 + +Op7DM0: + AbsoluteIndexedX8 ADC2 READ + call S9xGetWord + Adc16 ABSX16 + +Op79M1: + AbsoluteIndexedY8 ADC READ + call S9xGetByte + Adc8 ABSY8 + +Op79M0: + AbsoluteIndexedY8 ADC2 READ + call S9xGetWord + Adc16 ABSY16 + +Op6FM1: + AbsoluteLong8 ADC READ + call S9xGetByte + Adc8 ABSL8 + +Op6FM0: + AbsoluteLong8 ADC2 READ + call S9xGetWord + Adc16 ABSL16 + +Op7FM1: + AbsoluteLongIndexedX8 ADC READ + call S9xGetByte + Adc8 ALX8 + +Op7FM0: + AbsoluteLongIndexedX8 ADC2 READ + call S9xGetWord + Adc16 ALX16 + +Op63M1: + StackRelative8 ADC READ + call S9xGetByte + Adc8 SREL8 + +Op63M0: + StackRelative8 ADC2 READ + call S9xGetWord + Adc16 SREL16 + +Op73M1: + StackRelativeIndirectIndexed8 ADC READ + call S9xGetByte + Adc8 SRII8 + +Op73M0: + StackRelativeIndirectIndexed8 ADC2 READ + call S9xGetWord + Adc16 SRII16 + +/* AND */ +Op29M1: + Immediate8 AND READ + And8 IMM8 + +Op29M0: + Immediate16 AND READ + And16 IMM16 + +Op25M1: + Direct8 AND READ + call S9xGetByte + And8 DIR8 + +Op25M0: + Direct8 AND2 READ + call S9xGetWord + And16 DIR16 + +Op35M1: + DirectIndexedX8 AND READ + call S9xGetByte + And8 DIX8 + +Op35M0: + DirectIndexedX8 AND2 READ + call S9xGetWord + And16 DIX16 + +Op32M1: + DirectIndirect8 AND READ + call S9xGetByte + And8 DI8 + +Op32M0: + DirectIndirect8 AND2 READ + call S9xGetWord + And16 DI16 + +Op21M1: + DirectIndexedIndirect8 AND READ + call S9xGetByte + And8 DII8 + +Op21M0: + DirectIndexedIndirect8 AND2 READ + call S9xGetWord + And16 DII16 + +Op31M1: + DirectIndirectIndexed8 AND READ + call S9xGetByte + And8 DIIY8 + +Op31M0: + DirectIndirectIndexed8 AND2 READ + call S9xGetWord + And16 DIIY16 + +Op27M1: + DirectIndirectLong8 AND READ + call S9xGetByte + And8 DIL8 + +Op27M0: + DirectIndirectLong8 AND2 READ + call S9xGetWord + And16 DIL16 + +Op37M1: + DirectIndirectIndexedLong8 AND READ + call S9xGetByte + And8 DIIL8 + +Op37M0: + DirectIndirectIndexedLong8 AND2 READ + call S9xGetWord + And16 DIIL16 + +Op2DM1: + Absolute8 AND READ + call S9xGetByte + And8 ABS8 + +Op2DM0: + Absolute8 AND2 READ + call S9xGetWord + And16 ABS16 + +Op3DM1: + AbsoluteIndexedX8 AND READ + call S9xGetByte + And8 ABSX8 + +Op3DM0: + AbsoluteIndexedX8 AND2 READ + call S9xGetWord + And16 ABSX16 + +Op39M1: + AbsoluteIndexedY8 AND READ + call S9xGetByte + And8 ABSY8 + +Op39M0: + AbsoluteIndexedY8 AND2 READ + call S9xGetWord + And16 ABSY16 + +Op2FM1: + AbsoluteLong8 AND READ + call S9xGetByte + And8 ABSL8 + +Op2FM0: + AbsoluteLong8 AND2 READ + call S9xGetWord + And16 ABSL16 + +Op3FM1: + AbsoluteLongIndexedX8 AND READ + call S9xGetByte + And8 ALX8 + +Op3FM0: + AbsoluteLongIndexedX8 AND2 READ + call S9xGetWord + And16 ALX16 + +Op23M1: + StackRelative8 AND READ + call S9xGetByte + And8 SREL8 + +Op23M0: + StackRelative8 AND2 READ + call S9xGetWord + And16 SREL16 + +Op33M1: + StackRelativeIndirectIndexed8 AND READ + call S9xGetByte + And8 SRII8 + +Op33M0: + StackRelativeIndirectIndexed8 AND2 READ + call S9xGetWord + And16 SRII16 + +/* ASL */ +Op0AM1: + movb AL, %al + addl $6, CYCLES + salb %al + movb %al, AL + SetZNC + jmp MainAsmLoop + +Op0AM0: + movw AA, %ax + addl $6, CYCLES + salw %ax + movw %ax, AA + setnz _Zero + setc _Carry + movb %ah, _Negative + jmp MainAsmLoop + +Op06M1: + Direct8 ASL MODIFY + Asl8 DIR8 + +Op06M0: + Direct8 ASL2 MODIFY + Asl16 DIR16 + +Op16M1: + DirectIndexedX8 ASL MODIFY + Asl8 DIX + +Op16M0: + DirectIndexedX8 ASL2 MODIFY + Asl16 DIX + +Op0EM1: + Absolute8 ASL MODIFY + Asl8 ABS + +Op0EM0: + Absolute8 ASL2 MODIFY + Asl16 ABS + +Op1EM1: + AbsoluteIndexedX8 ASL MODIFY + Asl8 ABSX + +Op1EM0: + AbsoluteIndexedX8 ASL2 MODIFY + Asl16 ABSX + +/* BIT */ +Op89M1: + Immediate8 BIT READ + andb AL, %al + movb %al, _Zero + jmp MainAsmLoop + +Op89M0: + Immediate16 BIT READ + andw AA, %ax + setnz _Zero + jmp MainAsmLoop + +Op24M1: + Direct8 BIT READ + Bit8 DIR + +Op24M0: + Direct8 BIT READ + Bit16 DIR + +Op34M1: + DirectIndexedX8 BIT READ + Bit8 DIX + +Op34M0: + DirectIndexedX8 BIT2 READ + Bit16 DIX + +Op2CM1: + Absolute8 BIT READ + Bit8 ABS + +Op2CM0: + Absolute8 BIT2 READ + Bit16 ABS + +Op3CM1: + AbsoluteIndexedX8 BIT READ + Bit8 ABSX + +Op3CM0: + AbsoluteIndexedX8 BIT2 READ + Bit16 ABSX + +/* CMP */ +OpC9M1: + Immediate8 CMP READ + Cmp8 IMM + +OpC9M0: + Immediate16 CMP READ + Cmp16 IMM + +OpC5M1: + Direct8 CMP READ + call S9xGetByte + Cmp8 DIR + +OpC5M0: + Direct8 CMP2 READ + call S9xGetWord + Cmp16 DIR + +OpD5M1: + DirectIndexedX8 CMP READ + call S9xGetByte + Cmp8 DIX + +OpD5M0: + DirectIndexedX8 CMP2 READ + call S9xGetWord + Cmp16 DIX + +OpD2M1: + DirectIndirect8 CMP READ + call S9xGetByte + Cmp8 DI + +OpD2M0: + DirectIndirect8 CMP2 READ + call S9xGetWord + Cmp16 DI + +OpC1M1: + DirectIndexedIndirect8 CMP READ + call S9xGetByte + Cmp8 DII + +OpC1M0: + DirectIndexedIndirect8 CMP2 READ + call S9xGetWord + Cmp16 DII + +OpD1M1: + DirectIndirectIndexed8 CMP READ + call S9xGetByte + Cmp8 DIIY + +OpD1M0: + DirectIndirectIndexed8 CMP2 READ + call S9xGetWord + Cmp16 DIIY + +OpC7M1: + DirectIndirectLong8 CMP READ + call S9xGetByte + Cmp8 DIL + +OpC7M0: + DirectIndirectLong8 CMP2 READ + call S9xGetWord + Cmp16 DIL + +OpD7M1: + DirectIndirectIndexedLong8 CMP READ + call S9xGetByte + Cmp8 DIIL + +OpD7M0: + DirectIndirectIndexedLong8 CMP2 READ + call S9xGetWord + Cmp16 DIIL + +OpCDM1: + Absolute8 CMP READ + call S9xGetByte + Cmp8 ABS + +OpCDM0: + Absolute8 CMP2 READ + call S9xGetWord + Cmp16 ABS + +OpDDM1: + AbsoluteIndexedX8 CMP READ + call S9xGetByte + Cmp8 ABSX + +OpDDM0: + AbsoluteIndexedX8 CMP2 READ + call S9xGetWord + Cmp16 ABSX + +OpD9M1: + AbsoluteIndexedY8 CMP READ + call S9xGetByte + Cmp8 ABSY + +OpD9M0: + AbsoluteIndexedY8 CMP2 READ + call S9xGetWord + Cmp16 ABSY + +OpCFM1: + AbsoluteLong8 CMP READ + call S9xGetByte + Cmp8 ABSL + +OpCFM0: + AbsoluteLong8 CMP2 READ + call S9xGetWord + Cmp16 ABSL + +OpDFM1: + AbsoluteLongIndexedX8 CMP READ + call S9xGetByte + Cmp8 ALX + +OpDFM0: + AbsoluteLongIndexedX8 CMP2 READ + call S9xGetWord + Cmp16 ALX + +OpC3M1: + StackRelative8 CMP READ + call S9xGetByte + Cmp8 SREL + +OpC3M0: + StackRelative8 CMP2 READ + call S9xGetWord + Cmp16 SREL + +OpD3M1: + StackRelativeIndirectIndexed8 CMP READ + call S9xGetByte + Cmp8 SRII + +OpD3M0: + StackRelativeIndirectIndexed8 CMP2 READ + call S9xGetWord + Cmp16 SRII + +/* CPX */ +OpE0X1: + Immediate8 CPX READ + Cpx8 IMM + +OpE0X0: + Immediate16 CPX READ + Cpx16 IMM + +OpE4X1: + Direct8 CPX READ + call S9xGetByte + Cpx8 DIR + +OpE4X0: + Direct8 CPX2 READ + call S9xGetWord + Cpx16 DIR + +OpECX1: + Absolute8 CPX READ + call S9xGetByte + Cpx8 ABS + +OpECX0: + Absolute8 CPX2 READ + call S9xGetWord + Cpx16 ABS + + +/* CPY */ +OpC0X1: + Immediate8 CPY READ + Cpy8 IMM + +OpC0X0: + Immediate16 CPY READ + Cpy16 IMM + +OpC4X1: + Direct8 CPY READ + call S9xGetByte + Cpy8 DIR + +OpC4X0: + Direct8 CPY2 READ + call S9xGetWord + Cpy16 DIR + +OpCCX1: + Absolute8 CPY READ + call S9xGetByte + Cpy8 ABS + +OpCCX0: + Absolute8 CPY2 READ + call S9xGetWord + Cpy16 ABS + +/* DEC */ +Op3AM1: + movb AL, %al + addl $6, CYCLES + decb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, AL + SetZN + jmp MainAsmLoop + +Op3AM0: + addl $6, CYCLES + decw AA + setnz _Zero + movb AH, %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, _Negative + jmp MainAsmLoop + +OpC6M1: + Direct8 DEC MODIFY + Dec8 DIR + +OpC6M0: + Direct8 DEC2 MODIFY + Dec16 DIR + +OpD6M1: + DirectIndexedX8 DEC MODIFY + Dec8 DIX + +OpD6M0: + DirectIndexedX8 DEC2 MODIFY + Dec16 DIX + +OpCEM1: + Absolute8 DEC MODIFY + Dec8 ABS + +OpCEM0: + Absolute8 DEC2 MODIFY + Dec16 ABS + +OpDEM1: + AbsoluteIndexedX8 DEC MODIFY + + Dec8 ABSX + +OpDEM0: + AbsoluteIndexedX8 DEC2 MODIFY + Dec16 ABSX + +/* EOR */ +Op49M1: + Immediate8 EOR READ + Eor8 IMM + +Op49M0: + Immediate16 EOR READ + Eor16 IMM + +Op45M1: + Direct8 EOR READ + call S9xGetByte + Eor8 DIR + +Op45M0: + Direct8 EOR2 READ + call S9xGetWord + Eor16 DIR + +Op55M1: + DirectIndexedX8 EOR READ + call S9xGetByte + Eor8 DIX + +Op55M0: + DirectIndexedX8 EOR2 READ + call S9xGetWord + Eor16 DIX + +Op52M1: + DirectIndirect8 EOR READ + call S9xGetByte + Eor8 DI + +Op52M0: + DirectIndirect8 EOR2 READ + call S9xGetWord + Eor16 DI + +Op41M1: + DirectIndexedIndirect8 EOR READ + call S9xGetByte + Eor8 DII + +Op41M0: + DirectIndexedIndirect8 EOR2 READ + call S9xGetWord + Eor16 DII + +Op51M1: + DirectIndirectIndexed8 EOR READ + call S9xGetByte + Eor8 DIIY + +Op51M0: + DirectIndirectIndexed8 EOR2 READ + call S9xGetWord + Eor16 DIIY + +Op47M1: + DirectIndirectLong8 EOR READ + call S9xGetByte + Eor8 DIL + +Op47M0: + DirectIndirectLong8 EOR2 READ + call S9xGetWord + Eor16 DIL + +Op57M1: + DirectIndirectIndexedLong8 EOR READ + call S9xGetByte + Eor8 DIIL + +Op57M0: + DirectIndirectIndexedLong8 EOR2 READ + call S9xGetWord + Eor16 DIIL + +Op4DM1: + Absolute8 EOR READ + call S9xGetByte + Eor8 ABS + +Op4DM0: + Absolute8 EOR2 READ + call S9xGetWord + Eor16 ABS + +Op5DM1: + AbsoluteIndexedX8 EOR READ + call S9xGetByte + Eor8 ABSX + +Op5DM0: + AbsoluteIndexedX8 EOR2 READ + call S9xGetWord + Eor16 ABSX + +Op59M1: + AbsoluteIndexedY8 EOR READ + call S9xGetByte + Eor8 ABSY + +Op59M0: + AbsoluteIndexedY8 EOR2 READ + call S9xGetWord + Eor16 ABSY + +Op4FM1: + AbsoluteLong8 EOR READ + call S9xGetByte + Eor8 ABSL + +Op4FM0: + AbsoluteLong8 EOR2 READ + call S9xGetWord + Eor16 ABSL + +Op5FM1: + AbsoluteLongIndexedX8 EOR READ + call S9xGetByte + Eor8 ALX + +Op5FM0: + AbsoluteLongIndexedX8 EOR2 READ + call S9xGetWord + Eor16 ALX + +Op43M1: + StackRelative8 EOR READ + call S9xGetByte + Eor8 SREL + +Op43M0: + StackRelative8 EOR2 READ + call S9xGetWord + Eor16 SREL + +Op53M1: + StackRelativeIndirectIndexed8 EOR READ + call S9xGetByte + Eor8 SRII + +Op53M0: + StackRelativeIndirectIndexed8 EOR2 READ + call S9xGetWord + Eor16 SRII + +/* INC */ +Op1AM1: + movb AL, %al + addl $6, CYCLES + incb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, AL + SetZN + jmp MainAsmLoop + +Op1AM0: + addl $6, CYCLES + incw AA + setnz _Zero + movb AH, %ah +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %ah, _Negative + jmp MainAsmLoop + +OpE6M1: + Direct8 INC MODIFY + Inc8 DIR + +OpE6M0: + Direct8 INC2 MODIFY + Inc16 DIR + +OpF6M1: + DirectIndexedX8 INC MODIFY + Inc8 DIX + +OpF6M0: + DirectIndexedX8 INC2 MODIFY + Inc16 DIX + +OpEEM1: + Absolute8 INC MODIFY + Inc8 ABS + +OpEEM0: + Absolute8 INC2 MODIFY + Inc16 ABS + +OpFEM1: + AbsoluteIndexedX8 INC MODIFY + Inc8 ABSX + +OpFEM0: + AbsoluteIndexedX8 INC2 MODIFY + Inc16 ABSX + +/* LDA */ +OpA9M1: + Immediate8 LDA READ + Lda8 IMM + +OpA9M0: + Immediate16 LDA READ + Lda16 IMM + +OpA5M1: + Direct8 LDA READ + call S9xGetByte + Lda8 DIR + +OpA5M0: + Direct8 LDA2 READ + call S9xGetWord + Lda16 DIR + +OpB5M1: + DirectIndexedX8 LDA READ + call S9xGetByte + Lda8 DIX + +OpB5M0: + DirectIndexedX8 LDA2 READ + call S9xGetWord + Lda16 DIX + +OpB2M1: + DirectIndirect8 LDA READ + call S9xGetByte + Lda8 DI + +OpB2M0: + DirectIndirect8 LDA2 READ + call S9xGetWord + Lda16 DI + +OpA1M1: + DirectIndexedIndirect8 LDA READ + call S9xGetByte + Lda8 DII + +OpA1M0: + DirectIndexedIndirect8 LDA2 READ + call S9xGetWord + Lda16 DII + +OpB1M1: + DirectIndirectIndexed8 LDA READ + call S9xGetByte + Lda8 DIIY + +OpB1M0: + DirectIndirectIndexed8 LDA2 READ + call S9xGetWord + Lda16 DIIY + +OpA7M1: + DirectIndirectLong8 LDA READ + call S9xGetByte + Lda8 DIL + +OpA7M0: + DirectIndirectLong8 LDA2 READ + call S9xGetWord + Lda16 DIL + +OpB7M1: + DirectIndirectIndexedLong8 LDA READ + call S9xGetByte + Lda8 DIIL + +OpB7M0: + DirectIndirectIndexedLong8 LDA2 READ + call S9xGetWord + Lda16 DIIL + +OpADM1: + Absolute8 LDA READ + call S9xGetByte + Lda8 ABS + +OpADM0: + Absolute8 LDA2 READ + call S9xGetWord + Lda16 ABS + +OpBDM1: + AbsoluteIndexedX8 LDA READ + call S9xGetByte + Lda8 ABSX + +OpBDM0: + AbsoluteIndexedX8 LDA2 READ + call S9xGetWord + Lda16 ABSX + +OpB9M1: + AbsoluteIndexedY8 LDA READ + call S9xGetByte + Lda8 ABSY + +OpB9M0: + AbsoluteIndexedY8 LDA2 READ + call S9xGetWord + Lda16 ABSY + +OpAFM1: + AbsoluteLong8 LDA READ + call S9xGetByte + Lda8 ABSL + +OpAFM0: + AbsoluteLong8 LDA2 READ + call S9xGetWord + Lda16 ABSL + +OpBFM1: + AbsoluteLongIndexedX8 LDA READ + call S9xGetByte + Lda8 ALX + +OpBFM0: + AbsoluteLongIndexedX8 LDA2 READ + call S9xGetWord + Lda16 ALX + +OpA3M1: + StackRelative8 LDA READ + call S9xGetByte + Lda8 SREL + +OpA3M0: + StackRelative8 LDA2 READ + call S9xGetWord + Lda16 SREL + +OpB3M1: + StackRelativeIndirectIndexed8 LDA READ + call S9xGetByte + Lda8 SRII + +OpB3M0: + StackRelativeIndirectIndexed8 LDA2 READ + call S9xGetWord + Lda16 SRII + +/* LDX */ +OpA2X1: + Immediate8 LDX READ + Ldx8 IMM + +OpA2X0: + Immediate16 LDX READ + Ldx16 IMM + +OpA6X1: + Direct8 LDX READ + call S9xGetByte + Ldx8 DIR + +OpA6X0: + Direct8 LDX2 READ + call S9xGetWord + Ldx16 DIR + +OpB6X1: + DirectIndexedY8 LDX READ + call S9xGetByte + Ldx8 DIY + +OpB6X0: + DirectIndexedY8 LDX2 READ + call S9xGetWord + Ldx16 DIY + +OpAEX1: + Absolute8 LDX READ + call S9xGetByte + Ldx8 ABS + +OpAEX0: + Absolute8 LDX2 READ + call S9xGetWord + Ldx16 ABS + +OpBEX1: + AbsoluteIndexedY8 LDX READ + call S9xGetByte + Ldx8 ABSY + +OpBEX0: + AbsoluteIndexedY8 LDX2 READ + call S9xGetWord + Ldx16 ABSY + +/* LDY */ +OpA0X1: + Immediate8 LDY READ + Ldy8 IMM + +OpA0X0: + Immediate16 LDY READ + Ldy16 IMM + +OpA4X1: + Direct8 LDY READ + call S9xGetByte + Ldy8 DIR + +OpA4X0: + Direct8 LDY2 READ + call S9xGetWord + Ldy16 DIR + +OpB4X1: + DirectIndexedX8 LDY READ + call S9xGetByte + Ldy8 DIX + +OpB4X0: + DirectIndexedX8 LDY2 READ + call S9xGetWord + Ldy16 DIX + +OpACX1: + Absolute8 LDY READ + call S9xGetByte + Ldy8 ABS + +OpACX0: + Absolute8 LDY2 READ + call S9xGetWord + Ldy16 ABS + +OpBCX1: + AbsoluteIndexedX8 LDY READ + call S9xGetByte + Ldy8 ABSX + +OpBCX0: + AbsoluteIndexedX8 LDY2 READ + call S9xGetWord + Ldy16 ABSX + +/* LSR */ +Op4AM1: + movb AL, %al + addl $6, CYCLES + shrb %al + movb %al, AL + SetZNC + jmp MainAsmLoop + +Op4AM0: + addl $6, CYCLES + shrw AA + setnz _Zero + setc _Carry + movb AH, %ah + movb %ah, _Negative + jmp MainAsmLoop + +Op46M1: + Direct8 LSR MODIFY + Lsr8 DIR + +Op46M0: + Direct8 LSR2 MODIFY + Lsr16 DIR + +Op56M1: + DirectIndexedX8 LSR MODIFY + Lsr8 DIX + +Op56M0: + DirectIndexedX8 LSR2 MODIFY + Lsr16 DIX + +Op4EM1: + Absolute8 LSR MODIFY + Lsr8 ABS + +Op4EM0: + Absolute8 LSR2 MODIFY + Lsr16 ABS + +Op5EM1: + AbsoluteIndexedX8 LSR MODIFY + Lsr8 ABSX + +Op5EM0: + AbsoluteIndexedX8 LSR2 MODIFY + Lsr16 ABSX + +/* ORA */ +Op09M1: + Immediate8 ORA READ + Ora8 IMM + +Op09M0: + Immediate16 ORA READ + Ora16 IMM + +Op05M1: + Direct8 ORA READ + call S9xGetByte + Ora8 DIR + +Op05M0: + Direct8 ORA2 READ + call S9xGetWord + Ora16 DIR + +Op15M1: + DirectIndexedX8 ORA READ + call S9xGetByte + Ora8 DIX + +Op15M0: + DirectIndexedX8 ORA2 READ + call S9xGetWord + Ora16 DIX + +Op12M1: + DirectIndirect8 ORA READ + call S9xGetByte + Ora8 DI + +Op12M0: + DirectIndirect8 ORA2 READ + call S9xGetWord + Ora16 DI + +Op01M1: + DirectIndexedIndirect8 ORA READ + call S9xGetByte + Ora8 DII + +Op01M0: + DirectIndexedIndirect8 ORA2 READ + call S9xGetWord + Ora16 DII + +Op11M1: + DirectIndirectIndexed8 ORA READ + call S9xGetByte + Ora8 DIIY + +Op11M0: + DirectIndirectIndexed8 ORA2 READ + call S9xGetWord + Ora16 DIIY + +Op07M1: + DirectIndirectLong8 ORA READ + call S9xGetByte + Ora8 DIL + +Op07M0: + DirectIndirectLong8 ORA2 READ + call S9xGetWord + Ora16 DIL + +Op17M1: + DirectIndirectIndexedLong8 ORA READ + call S9xGetByte + Ora8 DIIL + +Op17M0: + DirectIndirectIndexedLong8 ORA2 READ + call S9xGetWord + Ora16 DIIL + +Op0DM1: + Absolute8 ORA READ + call S9xGetByte + Ora8 ABS + +Op0DM0: + Absolute8 ORA2 READ + call S9xGetWord + Ora16 ABS + +Op1DM1: + AbsoluteIndexedX8 ORA READ + call S9xGetByte + Ora8 ABSX + +Op1DM0: + AbsoluteIndexedX8 ORA2 READ + call S9xGetWord + Ora16 ABSX + +Op19M1: + AbsoluteIndexedY8 ORA READ + call S9xGetByte + Ora8 ABSY + +Op19M0: + AbsoluteIndexedY8 ORA2 READ + call S9xGetWord + Ora16 ABSY + +Op0FM1: + AbsoluteLong8 ORA READ + call S9xGetByte + Ora8 ABSL + +Op0FM0: + AbsoluteLong8 ORA2 READ + call S9xGetWord + Ora16 ABSL + +Op1FM1: + AbsoluteLongIndexedX8 ORA READ + call S9xGetByte + Ora8 ALX + +Op1FM0: + AbsoluteLongIndexedX8 ORA2 READ + call S9xGetWord + Ora16 ALX + +Op03M1: + StackRelative8 ORA READ + call S9xGetByte + Ora8 SREL + +Op03M0: + StackRelative8 ORA2 READ + call S9xGetWord + Ora16 SREL + +Op13M1: + StackRelativeIndirectIndexed8 ORA READ + call S9xGetByte + Ora8 SRII + +Op13M0: + StackRelativeIndirectIndexed8 ORA2 READ + call S9xGetWord + Ora16 SRII + +/* ROL */ +Op2AM1: + addl $6, CYCLES + movb AL, %al + GetCarry + rclb %al + movb %al, AL + SetZNC + jmp MainAsmLoop + +Op2AM0: + addl $6, CYCLES + GetCarry + movw AA, %ax + rclw %ax + movw %ax, AA + setc _Carry + movb %ah, _Negative + orb %ah, %al + movb %al, _Zero + jmp MainAsmLoop + +Op26M1: + Direct8 ROL MODIFY + Rol8 DIR + +Op26M0: + Direct8 ROL2 MODIFY + Rol16 DIR + +Op36M1: + DirectIndexedX8 ROL MODIFY + Rol8 DIX + +Op36M0: + DirectIndexedX8 ROL2 MODIFY + Rol16 DIX + +Op2EM1: + Absolute8 ROL MODIFY + Rol8 ABS + +Op2EM0: + Absolute8 ROL2 MODIFY + Rol16 ABS + +Op3EM1: + AbsoluteIndexedX8 ROL MODIFY + Rol8 ABSX + +Op3EM0: + AbsoluteIndexedX8 ROL2 MODIFY + Rol16 ABSX + +/* ROR */ +Op6AM1: + addl $6, CYCLES + movb AL, %al + GetCarry + rcrb %al + movb %al, AL + SetZNC + jmp MainAsmLoop + +Op6AM0: + addl $6, CYCLES + GetCarry + movw AA, %ax + rcrw %ax + movw %ax, AA + setc _Carry + movb %ah, _Negative + orb %ah, %al + movb %al, _Zero + jmp MainAsmLoop + +Op66M1: + Direct8 ROR MODIFY + Ror8 DIR + +Op66M0: + Direct8 ROR2 MODIFY + Ror16 DIR + +Op76M1: + DirectIndexedX8 ROR MODIFY + Ror8 DIX + +Op76M0: + DirectIndexedX8 ROR2 MODIFY + Ror16 DIX + +Op6EM1: + Absolute8 ROR MODIFY + Ror8 ABS + +Op6EM0: + Absolute8 ROR2 MODIFY + Ror16 ABS + +Op7EM1: + AbsoluteIndexedX8 ROR MODIFY + Ror8 ABSX + +Op7EM0: + AbsoluteIndexedX8 ROR2 MODIFY + Ror16 ABSX + +/* SBC */ +OpE9M1: + Immediate8 SBC READ + Sbc8 IMM + +OpE9M0: + Immediate16 SBC READ + Sbc16 IMM + +OpE5M1: + Direct8 SBC READ + call S9xGetByte + Sbc8 DIR + +OpE5M0: + Direct8 SBC2 READ + call S9xGetWord + Sbc16 DIR + +OpF5M1: + DirectIndexedX8 SBC READ + call S9xGetByte + Sbc8 DIX + +OpF5M0: + DirectIndexedX8 SBC2 READ + call S9xGetWord + Sbc16 DIX + +OpF2M1: + DirectIndirect8 SBC READ + call S9xGetByte + Sbc8 DI + +OpF2M0: + DirectIndirect8 SBC2 READ + call S9xGetWord + Sbc16 DI + +OpE1M1: + DirectIndexedIndirect8 SBC READ + call S9xGetByte + Sbc8 DII + +OpE1M0: + DirectIndexedIndirect8 SBC2 READ + call S9xGetWord + Sbc16 DII + +OpF1M1: + DirectIndirectIndexed8 SBC READ + call S9xGetByte + Sbc8 DIIY + +OpF1M0: + DirectIndirectIndexed8 SBC2 READ + call S9xGetWord + Sbc16 DIIY + +OpE7M1: + DirectIndirectLong8 SBC READ + call S9xGetByte + Sbc8 DIL + +OpE7M0: + DirectIndirectLong8 SBC2 READ + call S9xGetWord + Sbc16 DIL + +OpF7M1: + DirectIndirectIndexedLong8 SBC READ + call S9xGetByte + Sbc8 DIIL + +OpF7M0: + DirectIndirectIndexedLong8 SBC2 READ + call S9xGetWord + Sbc16 DIIL + +OpEDM1: + Absolute8 SBC READ + call S9xGetByte + Sbc8 ABS + +OpEDM0: + Absolute8 SBC2 READ + call S9xGetWord + Sbc16 ABS + +OpFDM1: + AbsoluteIndexedX8 SBC READ + call S9xGetByte + Sbc8 ABSX + +OpFDM0: + AbsoluteIndexedX8 SBC2 READ + call S9xGetWord + Sbc16 ABSX + +OpF9M1: + AbsoluteIndexedY8 SBC READ + call S9xGetByte + Sbc8 ABSY + +OpF9M0: + AbsoluteIndexedY8 SBC2 READ + call S9xGetWord + Sbc16 ABSY + +OpEFM1: + AbsoluteLong8 SBC READ + call S9xGetByte + Sbc8 ABSL + +OpEFM0: + AbsoluteLong8 SBC2 READ + call S9xGetWord + Sbc16 ABSL + +OpFFM1: + AbsoluteLongIndexedX8 SBC READ + call S9xGetByte + Sbc8 ALX + +OpFFM0: + AbsoluteLongIndexedX8 SBC2 READ + call S9xGetWord + Sbc16 ALX + +OpE3M1: + StackRelative8 SBC READ + call S9xGetByte + Sbc8 SREL + +OpE3M0: + StackRelative8 SBC2 READ + call S9xGetWord + Sbc16 SREL + +OpF3M1: + StackRelativeIndirectIndexed8 SBC READ + call S9xGetByte + Sbc8 SRII + +OpF3M0: + StackRelativeIndirectIndexed8 SBC2 READ + call S9xGetWord + Sbc16 SRII + +/* STA */ +Op85M1: + Direct8 STA WRITE + Sta8 DIR + +Op85M0: + Direct8 STA2 WRITE + Sta16 DIR + +Op95M1: + DirectIndexedX8 STA WRITE + Sta8 DIX + +Op95M0: + DirectIndexedX8 STA2 WRITE + Sta16 DIX + +Op92M1: + DirectIndirect8 STA WRITE + Sta8 DI + +Op92M0: + DirectIndirect8 STA2 WRITE + Sta16 DI + +Op81M1: + DirectIndexedIndirect8 STA WRITE + Sta8 DII + +Op81M0: + DirectIndexedIndirect8 STA2 WRITE + Sta16 DII + +Op91M1: + DirectIndirectIndexed8 STA WRITE + Sta8 DIIY + +Op91M0: + DirectIndirectIndexed8 STA2 WRITE + Sta16 DIIY + +Op87M1: + DirectIndirectLong8 STA WRITE + Sta8 DIL + +Op87M0: + DirectIndirectLong8 STA2 WRITE + Sta16 DIL + +Op97M1: + DirectIndirectIndexedLong8 STA WRITE + Sta8 DIIL + +Op97M0: + DirectIndirectIndexedLong8 STA2 WRITE + Sta16 DIIL + +Op8DM1: + Absolute8 STA WRITE + Sta8 ABS + +Op8DM0: + Absolute8 STA WRITE + Sta16 ABS + +Op9DM1: + AbsoluteIndexedX8 STA WRITE + Sta8 ABSX + +Op9DM0: + AbsoluteIndexedX8 STA2 WRITE + Sta16 ABSX + +Op99M1: + AbsoluteIndexedY8 STA WRITE + Sta8 ABSY + +Op99M0: + AbsoluteIndexedY8 STA2 WRITE + Sta16 ABSY + +Op8FM1: + AbsoluteLong8 STA WRITE + Sta8 ABSL + +Op8FM0: + AbsoluteLong8 STA2 WRITE + Sta16 ABSL + +Op9FM1: + AbsoluteLongIndexedX8 STA WRITE + Sta8 ALX + +Op9FM0: + AbsoluteLongIndexedX8 STA2 WRITE + Sta16 ALX + +Op83M1: + StackRelative8 STA WRITE + Sta8 SREL + +Op83M0: + StackRelative8 STA2 WRITE + Sta16 SREL + +Op93M1: + StackRelativeIndirectIndexed8 STA WRITE + Sta8 SRII + +Op93M0: + StackRelativeIndirectIndexed8 STA2 WRITE + Sta16 SRII + +/* STX */ +Op86X1: + Direct8 STX WRITE + Stx8 DIR + +Op86X0: + Direct8 STX2 WRITE + Stx16 DIR + +Op96X1: + DirectIndexedY8 STX WRITE + Stx8 DIY + +Op96X0: + DirectIndexedY8 STX2 WRITE + Stx16 DIY + +Op8EX1: + Absolute8 STX WRITE + Stx8 ABS + +Op8EX0: + Absolute8 STX2 WRITE + Stx16 ABS + +/* STY */ +Op84X1: + Direct8 STY WRITE + Sty8 DIR + +Op84X0: + Direct8 STY2 WRITE + Sty16 DIR + +Op94X1: + DirectIndexedX8 STY WRITE + Sty8 DIX + +Op94X0: + DirectIndexedX8 STY2 WRITE + Sty16 DIX + +Op8CX1: + Absolute8 STY WRITE + Sty8 ABS + +Op8CX0: + Absolute8 STY2 WRITE + Sty16 ABS + +/* STZ */ +Op64M1: + Direct8 STZ WRITE + Stz8 DIR + +Op64M0: + Direct8 STZ2 WRITE + Stz16 DIR + +Op74M1: + DirectIndexedX8 STZ WRITE + Stz8 DIX + +Op74M0: + DirectIndexedX8 STZ2 WRITE + Stz16 DIX + +Op9CM1: + Absolute8 STZ WRITE + Stz8 ABS + +Op9CM0: + Absolute8 STZ2 WRITE + Stz16 ABS + +Op9EM1: + AbsoluteIndexedX8 STZ WRITE + Stz8 ABSX + +Op9EM0: + AbsoluteIndexedX8 STZ2 WRITE + Stz16 ABSX + +/* TRB */ +Op14M1: + Direct8 TRB MODIFY + Trb8 DIR + +Op14M0: + Direct8 TRB2 MODIFY + Trb16 DIR + +Op1CM1: + Absolute8 TRB MODIFY + Trb8 ABS + +Op1CM0: + Absolute8 TRB2 MODIFY + Trb16 ABS + +/* TSB */ +Op04M1: + Direct8 TSB MODIFY + Tsb8 DIR + +Op04M0: + Direct8 TSB2 MODIFY + Tsb16 DIR + +Op0CM1: + Absolute8 TSB MODIFY + Tsb8 ABS + +Op0CM0: + Absolute8 TSB2 MODIFY + Tsb16 ABS + +/* BCC */ +Op90: + Relative JUMP + BranchCheck0 BCC + testb $0xff, _Carry + jnz .BCC_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC +.BCC_EXIT: + jmp MainAsmLoop + +/* BCS */ +OpB0: + Relative JUMP + BranchCheck0 BCS + testb $0xff, _Carry + jz .BCS_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC +.BCS_EXIT: + jmp MainAsmLoop + +/* BEQ */ +OpF0: + Relative JUMP + BranchCheck2 BEQ + testb $0xff, _Zero + jnz .BEQ_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BEQ +.BEQ_EXIT: + jmp MainAsmLoop + +/* BMI */ +Op30: + Relative JUMP + BranchCheck1 BMI + testb $0x80, _Negative + jz .BMI_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BMI +.BMI_EXIT: + jmp MainAsmLoop + +/* BNE */ +OpD0: + Relative JUMP + BranchCheck1 BNE + testb $0xff, _Zero + jz .BNE_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BNE +.BNE_EXIT: + jmp MainAsmLoop + +/* BPL */ +Op10: + Relative JUMP + BranchCheck1 BPL + testb $0x80, _Negative + jnz .BPL_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BPL +.BPL_EXIT: + jmp MainAsmLoop + +/* BRA */ +Op80: + Relative JUMP + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + jmp MainAsmLoop + +/* BVC */ +Op50: + Relative JUMP + BranchCheck0 BVC + testb $0xff, _Overflow + jnz .BVC_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BVC +.BVC_EXIT: + jmp MainAsmLoop + +/* BVS */ +Op70: + Relative JUMP + BranchCheck0 BVS + testb $0xff, _Overflow + jz .BVS_EXIT + addl $6, CYCLES + andl $0xffff, %edx + addl PCBase, %edx + movl %edx, PC + CPUShutdown BVS +.BVS_EXIT: + jmp MainAsmLoop + +/* BRL */ +Op82: + RelativeLong BRL JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* CLC */ +Op18: + movb $0, _Carry + addl $6, CYCLES + jmp MainAsmLoop + +/* CLD */ +OpD8: + andb $~Decimal, FLAGS + addl $6, CYCLES + jmp MainAsmLoop + +/* CLI */ +Op58: + andb $~IRQ, FLAGS + addl $6, CYCLES +#if 0 /* C version has this commented out? */ + cmpb $0, IRQActive + jz .CLI_EXIT + /* XXX: test for Settings.DisableIRQ */ + call S9xOpcode_IRQ +#endif +.CLI_EXIT: + jmp MainAsmLoop + +/* CLV */ +OpB8: + movb $0, _Overflow + addl $6, CYCLES + jmp MainAsmLoop + +/* DEX */ +OpCAX1: + addl $6, CYCLES + movb XL, %al + decb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, XL + SetZN + jmp MainAsmLoop + +OpCAX0: + addl $6, CYCLES + decw XX + setnz _Zero + movb XH, %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, _Negative + jmp MainAsmLoop + +/* DEY */ +Op88X1: + addl $6, CYCLES + movb YL, %al + decb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, YL + SetZN + jmp MainAsmLoop + +Op88X0: + addl $6, CYCLES + decw YY + setnz _Zero + movb YH, %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, _Negative + jmp MainAsmLoop + +/* INX */ +OpE8X1: + addl $6, CYCLES + movb XL, %al + incb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, XL + SetZN + jmp MainAsmLoop + +OpE8X0: + addl $6, CYCLES + incw XX + setnz _Zero + movb XH, %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, _Negative + jmp MainAsmLoop + +/* INY */ +OpC8X1: + addl $6, CYCLES + movb YL, %al + incb %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, YL + SetZN + jmp MainAsmLoop + +OpC8X0: + addl $6, CYCLES + incw YY + setnz _Zero + movb YH, %al +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movb %al, _Negative + jmp MainAsmLoop + +/* NOP */ +OpEA: + addl $6,CYCLES + jmp MainAsmLoop + +/* PEA */ +OpF4E1: + Immediate16 PEA NONE + PushWordENew PEA + jmp MainAsmLoop + +OpF4: + Immediate16 PEA NONE + PushWord PEA + jmp MainAsmLoop + +/* PEI */ +OpD4E1: + DirectIndirect8 PEI NONE + movl %edx, %eax + PushWordENew PEI + jmp MainAsmLoop + +OpD4: + DirectIndirect8 PEI NONE + movl %edx, %eax + PushWord PEI + jmp MainAsmLoop + +/* PER */ +Op62E1: + RelativeLong PER NONE + movl %edx, %eax + PushWordENew PER + jmp MainAsmLoop + +Op62: + RelativeLong PER NONE + movl %edx, %eax + PushWord PER + jmp MainAsmLoop + +/* PHA */ +Op48E1: + addl $6, CYCLES + movb AL, %al + PushByteE PHA + jmp MainAsmLoop + +Op48M1: + addl $6, CYCLES + movb AL, %al + PushByte PHA + jmp MainAsmLoop + +Op48M0: + addl $6, CYCLES + movw AA, %ax + PushWord PHA + jmp MainAsmLoop + +/* PHB */ +Op8BE1: + addl $6, CYCLES + movb DB, %al + PushByteE PHB + jmp MainAsmLoop + +Op8B: + addl $6, CYCLES + movb DB, %al + PushByte PHB + jmp MainAsmLoop + +/* PHD */ +Op0BE1: + addl $6, CYCLES + movw DD, %ax + PushWordENew PHD + jmp MainAsmLoop + +Op0B: + addl $6, CYCLES + movw DD, %ax + PushWord PHD + jmp MainAsmLoop + +/* PHK */ +Op4BE1: + addl $6, CYCLES + movb PB, %al + PushByteE PHK + jmp MainAsmLoop + +Op4B: + addl $6, CYCLES + movb PB, %al + PushByte PHK + jmp MainAsmLoop + +/* PHP */ +Op08E1: + addl $6, CYCLES + S9xPackStatus PHP + movb FLAGS, %al + PushByteE PHP + jmp MainAsmLoop + +Op08: + addl $6, CYCLES + S9xPackStatus PHP + movb FLAGS, %al + PushByte PHP + jmp MainAsmLoop + +/* PHX */ +OpDAE1: + addl $6, CYCLES + movb XL, %al + PushByteE PHX + jmp MainAsmLoop + +OpDAX1: + addl $6, CYCLES + movb XL, %al + PushByte PHX + jmp MainAsmLoop + +OpDAX0: + addl $6, CYCLES + movw XX, %ax + PushWord PHX + jmp MainAsmLoop + +/* PHY */ +Op5AE1: + addl $6, CYCLES + movb YL, %al + PushByteE PHY + jmp MainAsmLoop + +Op5AX1: + addl $6, CYCLES + movb YL, %al + PushByte PHY + jmp MainAsmLoop + +Op5AX0: + addl $6, CYCLES + movw YY, %ax + PushWord PHY + jmp MainAsmLoop + +/* PLA */ +Op68E1: + addl $12, CYCLES + PullByteE PLA + movb %al, AL + SetZN + jmp MainAsmLoop + +Op68M1: + addl $12, CYCLES + PullByte PLA + movb %al, AL + SetZN + jmp MainAsmLoop + +Op68M0: + addl $12, CYCLES + PullWord PLA + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* PLB */ +OpABE1: + addl $12, CYCLES + PullByteE PLB + movb %al, DB + SetZN + andl $0xff, %eax + sall $16, %eax + movl %eax, ShiftedDB + jmp MainAsmLoop + +OpAB: + addl $12, CYCLES + PullByte PLB + movb %al, DB + SetZN + andl $0xff, %eax + sall $16, %eax + movl %eax, ShiftedDB + jmp MainAsmLoop + +/* PLD */ +Op2BE1: + addl $12, CYCLES + PullWordENew PLD + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +Op2B: + addl $12, CYCLES + PullWord PLD + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* PLP */ +Op28E1: + addl $12, CYCLES + PullByteE PLPE + movb %al, FLAGS + + testb $IndexFlag, FLAGS + jz .PLP16E + xorb %al, %al + movb %al, XH + movb %al, YH +.PLP16E: + S9xUnpackStatus PLPE + S9xFixCycles PLPE +/* CheckForIrq PLP */ + jmp MainAsmLoop + +Op28: + addl $12, CYCLES + PullByte PLP + movb %al, FLAGS + + testb $IndexFlag, FLAGS + jz .PLP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.PLP16: + S9xUnpackStatus PLP + S9xFixCycles PLP +/* CheckForIrq PLP */ + jmp MainAsmLoop + +/* PLX */ +OpFAE1: + addl $12, CYCLES + PullByteE PLX + movb %al, XL + SetZN + jmp MainAsmLoop + +OpFAX1: + addl $12, CYCLES + PullByte PLX + movb %al, XL + SetZN + jmp MainAsmLoop + +OpFAX0: + addl $12, CYCLES + PullWord PLX + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* PLY */ +Op7AE1: + addl $12, CYCLES + PullByteE PLY + movb %al, YL + SetZN + jmp MainAsmLoop + +Op7AX1: + addl $12, CYCLES + PullByte PLY + movb %al, YL + SetZN + jmp MainAsmLoop + +Op7AX0: + addl $12, CYCLES + PullWord PLY + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* SEC */ +Op38: + movb $1, _Carry + addl $6, CYCLES + jmp MainAsmLoop + +/* SED */ +OpF8: + + orb $Decimal, FLAGS + addl $6, CYCLES + jmp MainAsmLoop + +/* SEI */ +Op78: + orb $IRQ, FLAGS + addl $6, CYCLES + jmp MainAsmLoop + +/* TAX */ +OpAAX1: + addl $6, CYCLES + movb AL, %al + movb %al, XL + SetZN + jmp MainAsmLoop + +OpAAX0: + addl $6, CYCLES + movw AA, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TAY */ +OpA8X1: + addl $6, CYCLES + movb AL, %al + movb %al, YL + SetZN + jmp MainAsmLoop + +OpA8X0: + addl $6, CYCLES + movw AA, %ax + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TCD */ +Op5B: + addl $6, CYCLES + movw AA, %ax + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TCS */ +Op1B: + addl $6, CYCLES + movw AA, %ax + movw %ax, SS + testw $Emulation, FLAGS16 + jz .TCS_EXIT + movb $1, SH +.TCS_EXIT: + jmp MainAsmLoop + +/* TDC */ +Op7B: + addl $6, CYCLES + movw DD, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TSC */ +Op3B: + addl $6, CYCLES + movw SS, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TSX */ +OpBAX1: + addl $6, CYCLES + movb SL, %al + movb %al, XL + SetZN + jmp MainAsmLoop + +OpBAX0: + addl $6, CYCLES + movw SS, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TXA */ +Op8AM1: + addl $6, CYCLES + movb XL, %al + movb %al, AL + SetZN + jmp MainAsmLoop + +Op8AM0: + addl $6, CYCLES + movw XX, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TXS */ +Op9A: + addl $6, CYCLES + movw XX, %ax + movw %ax, SS + testw $Emulation, FLAGS16 + jz .TXS_EXIT + movb $1, SH +.TXS_EXIT: + jmp MainAsmLoop + +/* TXY */ +Op9BX1: + addl $6, CYCLES + movb XL, %al + movb %al, YL + SetZN + jmp MainAsmLoop + +Op9BX0: + addl $6, CYCLES + movw XX, %ax + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TYA */ +Op98M1: + addl $6, CYCLES + movb YL, %al + movb %al, AL + SetZN + jmp MainAsmLoop + +Op98M0: + addl $6, CYCLES + movw YY, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* TYX */ +OpBBX1: + addl $6, CYCLES + movb YL, %al + movb %al, XL + SetZN + jmp MainAsmLoop + +OpBBX0: + addl $6, CYCLES + movw YY, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp MainAsmLoop + +/* XCE */ +OpFB: + addl $6, CYCLES + movw FLAGS16, %ax + andw $~(Emulation | Carry), FLAGS16 + GetCarry + jnc .XCE_NO_CARRY + orw $Emulation, FLAGS16 +.XCE_NO_CARRY: + testw $Emulation, %ax + setnz _Carry + testw $Emulation, FLAGS16 + jz .XCE_NO_EMULATION2 + orw $(MemoryFlag | IndexFlag), FLAGS16 + movb $1, SH +.XCE_NO_EMULATION2: + testw $IndexFlag, FLAGS16 + jz .XCE_NO_INDEX + xorl %eax, %eax + movb %al, XH + movb %al, YH +.XCE_NO_INDEX: + S9xFixCycles XCE + jmp MainAsmLoop + +.data +.LC0: + .string "*** BRK" +.text + +Op00: +#ifdef DEBUGGER + testb $TRACE_FLAG, Flags + je .BRK_NO_TRACE + pushl $.LC0 + ccall S9xTraceMessage + addl $4,%esp +.BRK_NO_TRACE: +#endif + movb $1, BRKTriggered + testw $Emulation, FLAGS16 + jnz .BRK_EMULATION + movb PB, %al + PushByte BRK1 + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord BRK2 + + S9xPackStatus BRK + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte BRK3 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $12, CYCLES + movl $0xFFE6, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSetPCBase + jmp MainAsmLoop +.BRK_EMULATION: + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord BRK2 + + S9xPackStatus BRK2 + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte BRK3 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $6, CYCLES + movl $0xFFFE, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSetPCBase + jmp MainAsmLoop + +.data +.LC1: + .string "*** IRQ" +.text +.globl S9xOpcode_IRQ + +S9xOpcode_IRQ: +#ifdef DEBUGGER + testb $TRACE_FLAG, Flags + je .IRQ_NO_TRACE + pushl $.LC1 + ccall S9xTraceMessage + addl $4, %esp +.IRQ_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .IRQ_EMULATION + movb PB, %al + PushByte IRQ1 + movl PC, %eax + subl PCBase, %eax + PushWord IRQ2 + + S9xPackStatus IRQ + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte IRQ3 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $12, CYCLES + testb $0xff, SA1Enabled + jz .noirqsa1vector + movl FillRAM, %eax + movb 0x2209(%eax), %dl + testb $0x40, %dl + jz .noirqsa1vector + xorl %edx, %edx + movw 0x220e(%eax), %dx + jmp S9xSetPCBase +.noirqsa1vector: + movl $0xFFEE, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + jmp S9xSetPCBase +.IRQ_EMULATION: + movl PC, %eax + subl PCBase, %eax + PushWord IRQ4 + + S9xPackStatus IRQ2 + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte IRQ5 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $6, CYCLES + movl $0xFFFE, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + jmp S9xSetPCBase + +.data +.LC2: + .string "*** NMI" +.text +.globl S9xOpcode_NMI + +S9xOpcode_NMI: +#ifdef DEBUGGER + testb $TRACE_FLAG, Flags + je .NMI_NO_TRACE + pushl $.LC2 + ccall S9xTraceMessage + addl $4, %esp +.NMI_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .NMI_EMULATION + movb PB, %al + PushByte NMI1 + movl PC, %eax + subl PCBase, %eax + PushWord NMI2 + + S9xPackStatus NMI + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte NMI3 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $12, CYCLES + movl $0xFFEA, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + jmp S9xSetPCBase +.NMI_EMULATION: + movl PC, %eax + subl PCBase, %eax + PushWord NMI4 + + S9xPackStatus NMI2 + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte NMI5 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $6, CYCLES + movl $0xFFFA, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + jmp S9xSetPCBase + +.data +.LC3: + .string "*** COP" +.text + +Op02: +#ifdef DEBUGGER + testb $TRACE_FLAG, Flags + je .COP_NO_TRACE + pushl $.LC3 + ccall S9xTraceMessage + addl $4,%esp +.COP_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .COP_EMULATION + movb PB, %al + PushByte COP1 + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord COP2 + + S9xPackStatus COP + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte COP3 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $12, CYCLES + movl $0xFFE4, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSetPCBase + jmp MainAsmLoop +.COP_EMULATION: + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord COP4 + + S9xPackStatus COP2 + movb FLAGS, %al + movb %al, OpenBus + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte COP5 + xorl %ecx, %ecx + movl %ecx, ShiftedPB + movb %cl, PB + addl $6, CYCLES + movl $0xFFF4, %edx + call S9xGetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* JML */ +OpDC: + AbsoluteIndirectLong8 JML JUMP + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, ShiftedPB + sarl $16, %ecx + movb %cl, PB + addl $12, CYCLES + call S9xSetPCBase + jmp MainAsmLoop + +Op5C: + AbsoluteLong8 JML JUMP + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSetPCBase + jmp MainAsmLoop + +/* JMP */ +Op4C: + Absolute8 JMP JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +Op6C: + AbsoluteIndirect8 JMP JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +Op7C: + AbsoluteIndexedIndirect8 JMP JUMP + addl $6, CYCLES + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* JSL */ +Op22E1: + movb PB, %al + PushByte JSL_ABSL_E + movl PC, %eax + subl PCBase, %eax + addl $2, %eax + PushWordENew JSL_ABSL_E + AbsoluteLong8 JSL JUMP + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSetPCBase + jmp MainAsmLoop + +Op22: + movb PB, %al + PushByte JSL_ABSL + movl PC, %eax + subl PCBase, %eax + addl $2, %eax + PushWord JSL_ABSL + AbsoluteLong8 JSL JUMP + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSetPCBase + jmp MainAsmLoop + +/* RTL */ +Op6BE1: + addl $12, CYCLES + PullWord RTL_E + pushl %eax + PullByte RTL_E + movl SS, %edx + addl $0xFF, %edx + movb $0x01, %dh + movw %dx, SS + popl %edx + movb %al, PB + incw %dx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + movl %eax, ShiftedPB + orl %eax, %edx + call S9xSetPCBase + jmp MainAsmLoop + +Op6B: + addl $12, CYCLES + PullWord RTL + pushl %eax + PullByte RTL + popl %edx + movb %al, PB + incw %dx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + movl %eax, ShiftedPB + orl %eax, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* JSR ABS */ +Op20: + addl $6, CYCLES + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord JSR_ABS + Absolute8 JSR_ABS JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* JSR ABS INDEXED INDIRECT */ +OpFCE1: + addl $6, CYCLES + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWordENew JSR_AII_E + AbsoluteIndexedIndirect8 JSR JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +OpFC: + addl $6, CYCLES + movl PC, %eax + subl PCBase, %eax + incl %eax + PushWord JSR_AII + AbsoluteIndexedIndirect8 JSR JUMP + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* RTS */ +Op60: + addl $6 * 3, CYCLES + PullWord RTS + incl %eax + movl %eax, %edx + andl $0xffff, %edx + orl ShiftedPB, %edx + call S9xSetPCBase + jmp MainAsmLoop + +/* MVN */ +Op54X1: + addl MemSpeedx2, CYCLES + addl $12, CYCLES + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, ShiftedDB + movb 1(PC), %dl + movb %dl, OpenBus + sall $16, %edx + movw XX, %dx + call S9xGetByte + movl ShiftedDB, %edx + movw YY, %dx + call S9xSetByte + incb XL + incb YL + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVN_EXIT8 + decl PC + jmp MainAsmLoop +.MVN_EXIT8: + addl $2, PC + jmp MainAsmLoop + +Op54X0: + addl MemSpeedx2, CYCLES + addl $12, CYCLES + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, ShiftedDB + movb 1(PC), %dl + movb %dl, OpenBus + sall $16, %edx + movw XX, %dx + call S9xGetByte + movl ShiftedDB, %edx + movw YY, %dx + call S9xSetByte + incw XX + incw YY + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVN_EXIT16 + decl PC + jmp MainAsmLoop +.MVN_EXIT16: + addl $2, PC + jmp MainAsmLoop + +/* MVP */ +Op44X1: + addl MemSpeedx2, CYCLES + addl $12, CYCLES + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, ShiftedDB + movb 1(PC), %dl + movb %dl, OpenBus + sall $16, %edx + movw XX, %dx + call S9xGetByte + movl ShiftedDB, %edx + movw YY, %dx + call S9xSetByte + decb XL + decb YL + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVP_EXIT8 + decl PC + jmp MainAsmLoop +.MVP_EXIT8: + addl $2, PC + jmp MainAsmLoop + +Op44X0: + addl MemSpeedx2, CYCLES + addl $12, CYCLES + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, ShiftedDB + movb 1(PC), %dl + movb %dl, OpenBus + sall $16, %edx + movw XX, %dx + call S9xGetByte + movl ShiftedDB, %edx + movw YY, %dx + call S9xSetByte + decw XX + decw YY + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVP_EXIT16 + decl PC + jmp MainAsmLoop +.MVP_EXIT16: + addl $2, PC + jmp MainAsmLoop + +/* REP */ +OpC2: + addl MemSpeed, CYCLES + addl $6, CYCLES + movb (PC), %al + incl PC + notb %al + andb %al, FLAGS + andb %al, _Negative + andb %al, _Carry + testb $Zero, %al + setz %ah + orb %ah, _Zero + shrb $6, %al + andb %al, _Overflow + + testw $Emulation, FLAGS16 + jz .REP_NO_EMU + orb $(MemoryFlag | IndexFlag), FLAGS + +.REP_NO_EMU: + testb $IndexFlag, FLAGS + jz .REP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.REP16: + S9xFixCycles REP +/* CheckForIrq REP */ + jmp MainAsmLoop + +/* SEP */ +OpE2: + addl MemSpeed, CYCLES + addl $6, CYCLES + movb (PC), %al + incl PC + orb %al, FLAGS + orb %al, _Negative + movb %al, %ah + shrb $6, %ah + andb $1, %ah + orb %ah, _Overflow + test $Zero, %al + jz .SEP_NO_ZERO + movb $0, _Zero +.SEP_NO_ZERO: + andb $1, %al + orb %al, _Carry + testw $Emulation, FLAGS16 + jz .SEP_NO_EMU + orb $(MemoryFlag | IndexFlag), FLAGS + +.SEP_NO_EMU: + testb $IndexFlag, FLAGS + jz .SEP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.SEP16: + S9xFixCycles SEP + jmp MainAsmLoop + +/* XBA */ +OpEB: + addl $12, CYCLES + movb AL, %ah + movb AH, %al + movb %ah, AH + movb %al, AL + SetZN + jmp MainAsmLoop + +/* RTI */ +Op40: + addl $12, CYCLES + PullByte RTI + movb %al, FLAGS + PullWord RTI + andl $0xffff, %eax + pushl %eax + testw $Emulation, FLAGS16 + jnz .RTI_EMU + PullByte RTI2 + andl $0xff, %eax + jmp .RTI_SKIP_EMU +.RTI_EMU: + orb $(MemoryFlag | IndexFlag), FLAGS + /*XXX: HERE xorl %eax, %eax*/ + movl ShiftedPB, %eax + sarl $16, %eax +.RTI_SKIP_EMU: + movb %al, PB + popl %edx + sall $16, %eax + orl %eax, %edx + movl %eax, ShiftedPB + + call S9xSetPCBase + testb $IndexFlag, FLAGS + jz .RTI16 + xorb %al, %al + movb %al, XH + movb %al, YH +.RTI16: + S9xUnpackStatus RTI + S9xFixCycles RTI +/* CheckForIrq RTI */ + jmp MainAsmLoop + +/* WAI */ +OpCB: +#if 0 + cmpb $0, IRQActive + je .L5334 + addl $12, CYCLES + jmp MainAsmLoop +.L5334: +#endif + movb $1, WaitingForInterrupt + decl PC + movb Shutdown, %al + testb %al, %al + je .NoShutdown + movl NextEvent, CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + cmpb $0, APUExecuting + je MainAsmLoop + movb $0, CPUExecuting +.WAITExecAPU: +#ifdef DEBUGGER + testb $2,APUFlags + je .WAITNoAPUS9xTrace + STORE_REGISTERS + ccall S9xTraceAPU + LOAD_REGISTERS +.WAITNoAPUS9xTrace: +#endif + xorl %eax,%eax +#ifdef SPC700_C + movl APUPC,%edx + SAVE_CYCLES + movb (%edx),%al +#else + movb (APUPC),%al +#endif + movl S9xAPUCycles(,%eax,4), %edx + movl S9xApuOpcodes(,%eax,4),%eax + addl %edx, APUCycles + call *%eax +#ifdef SPC700_C + LOAD_CYCLES +#endif + movl NextEvent, %eax + cmpl %eax, APUCycles + jl .WAITExecAPU + movb $1, CPUExecuting + jmp MainAsmLoop +.NoShutdown: + addl $12, CYCLES + jmp MainAsmLoop + +/* STP */ +OpDB: + decl PC + orb $DEBUG_MODE_FLAG, Flags + jmp MainAsmLoop + +/* Reserved opcode (WDM) */ + +Op42: + jmp MainAsmLoop + +.globl S9xOpcodesM1X1 +.data + .align 4 +S9xOpcodesM1X1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl S9xOpcodesE1 +.data + .align 4 +S9xOpcodesE1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08E1 + .long Op09M1 + .long Op0AM1 + .long Op0BE1 + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22E1 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28E1 + .long Op29M1 + .long Op2AM1 + .long Op2BE1 + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48E1 + .long Op49M1 + .long Op4AM1 + .long Op4BE1 + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AE1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62E1 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68E1 + .long Op69M1 + .long Op6AM1 + .long Op6BE1 + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AE1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8BE1 + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpABE1 + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4E1 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAE1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4E1 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAE1 + .long OpFB + .long OpFCE1 + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl S9xOpcodesM1X0 + .align 4 +S9xOpcodesM1X0: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X0 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X0 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X0 + .long Op85M1 + .long Op86X0 + .long Op87M1 + .long Op88X0 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX0 + .long Op8DM1 + .long Op8EX0 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X0 + .long Op95M1 + .long Op96X0 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX0 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X0 + .long OpA1M1 + .long OpA2X0 + .long OpA3M1 + .long OpA4X0 + .long OpA5M1 + .long OpA6X0 + .long OpA7M1 + .long OpA8X0 + .long OpA9M1 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM1 + .long OpAEX0 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X0 + .long OpB5M1 + .long OpB6X0 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM1 + .long OpBEX0 + .long OpBFM1 + .long OpC0X0 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X0 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X0 + .long OpC9M1 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X0 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X0 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X0 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl S9xOpcodesM0X0 + .align 4 +S9xOpcodesM0X0: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X0 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X0 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X0 + .long Op85M0 + .long Op86X0 + .long Op87M0 + .long Op88X0 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX0 + .long Op8DM0 + .long Op8EX0 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X0 + .long Op95M0 + .long Op96X0 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX0 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X0 + .long OpA1M0 + .long OpA2X0 + .long OpA3M0 + .long OpA4X0 + .long OpA5M0 + .long OpA6X0 + .long OpA7M0 + .long OpA8X0 + .long OpA9M0 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM0 + .long OpAEX0 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X0 + .long OpB5M0 + .long OpB6X0 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM0 + .long OpBEX0 + .long OpBFM0 + .long OpC0X0 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X0 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X0 + .long OpC9M0 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X0 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X0 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X0 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + +.globl S9xOpcodesM0X1 + .align 4 +S9xOpcodesM0X1: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X1 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X1 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X1 + .long Op85M0 + .long Op86X1 + .long Op87M0 + .long Op88X1 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX1 + .long Op8DM0 + .long Op8EX1 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X1 + .long Op95M0 + .long Op96X1 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX1 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X1 + .long OpA1M0 + .long OpA2X1 + .long OpA3M0 + .long OpA4X1 + .long OpA5M0 + .long OpA6X1 + .long OpA7M0 + .long OpA8X1 + .long OpA9M0 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM0 + .long OpAEX1 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X1 + .long OpB5M0 + .long OpB6X1 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM0 + .long OpBEX1 + .long OpBFM0 + .long OpC0X1 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X1 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X1 + .long OpC9M0 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X1 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X1 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X1 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 diff --git a/src/i386/fxemu2.asm b/src/i386/fxemu2.asm new file mode 100644 index 0000000..aea6b95 --- /dev/null +++ b/src/i386/fxemu2.asm @@ -0,0 +1,2692 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +%include "src/i386/macros.mac" + +EXTSYM FxTable,FxTableb,FxTablec,FxTabled,SfxMemTable,flagnz,fxbit01,fxbit23 +EXTSYM fxxand,sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc +EXTSYM sfxramdata,fxbit45,fxbit67,SFXProc,ChangeOps +EXTSYM PLOTJmpa,PLOTJmpb + +NEWSYM FxEmu2AsmStart + +%include "src/i386/fxemu2.mac" + + + + + + +; * Optimise PLOT, COLOR! +SECTION .text +NEWSYM FlushCache + ; Copy 512 bytes from pb:eax to SfxCACHERAM + ret + +SECTION .bss +NEWSYM tempsfx, resb 3 + +SECTION .data ;ALIGN=32 + +; FxChip emulation by _Demo_ +; Optimised by zsKnight +; based on fxemu by lestat + +NEWSYM SfxR0, dd 0 ; default source/destination register +NEWSYM SfxR1, dd 0 ; pixel plot X position register +NEWSYM SfxR2, dd 0 ; pixel plot Y position register +NEWSYM SfxR3, dd 0 ; +NEWSYM SfxR4, dd 0 ; lower 16 bit result of lmult +NEWSYM SfxR5, dd 0 ; +NEWSYM SfxR6, dd 0 ; multiplier for fmult and lmult +NEWSYM SfxR7, dd 0 ; fixed point texel X position for merge +NEWSYM SfxR8, dd 0 ; fixed point texel Y position for merge +NEWSYM SfxR9, dd 0 ; +NEWSYM SfxR10, dd 0 ; +NEWSYM SfxR11, dd 0 ; return address set by link +NEWSYM SfxR12, dd 0 ; loop counter +NEWSYM SfxR13, dd 0 ; loop point address +NEWSYM SfxR14, dd 0 ; rom address for getb, getbh, getbl, getbs +NEWSYM SfxR15, dd 0 ; program counter + +NEWSYM SfxSFR, dd 0 ; status flag register (16bit) +;SFR status flag register bits: +; 0 - +; 1 Z Zero flag +; 2 CY Carry flag +; 3 S Sign flag +; 4 OV Overflow flag +; 5 G Go flag (set to 1 when the GSU is running) +; 6 R Set to 1 when reading ROM using R14 address +; 7 - +; 8 ALT1 Mode set-up flag for the next instruction +; 9 ALT2 Mode set-up flag for the next instruction +;10 IL Immediate lower 8-bit flag +;11 IH Immediate higher 8-bit flag +;12 B Set to 1 when the WITH instruction is executed +;13 - +;14 - +;15 IRQ Set to 1 when GSU caused an interrupt +; Set to 0 when read by 658c16 + +NEWSYM SfxBRAMR, dd 0 ; backup ram read only on/off (8bit) +NEWSYM SfxPBR, dd 0 ; program bank register (8bit) +NEWSYM SfxROMBR, dd 0 ; rom bank register (8bit) +NEWSYM SfxCFGR, dd 0 ; control flags register (8bit) +NEWSYM SfxSCBR, dd 0 ; screen bank register (8bit) +NEWSYM SfxCLSR, dd 0 ; clock speed register (8bit) +NEWSYM SfxSCMR, dd 0 ; screen mode register (8bit) +NEWSYM SfxVCR, dd 0 ; version code register (8bit) +NEWSYM SfxRAMBR, dd 0 ; ram bank register (8bit) +NEWSYM SfxCBR, dd 0 ; cache base register (16bit) + +NEWSYM SfxCOLR, dd 0 ; Internal color register +NEWSYM SfxPOR, dd 0 ; Plot option register + +NEWSYM SfxCacheFlags, dd 0 ; Saying what parts of the cache was written to +NEWSYM SfxLastRamAdr, dd 0 ; Last RAM address accessed +NEWSYM SfxDREG, dd 0 ; Current destination register index +NEWSYM SfxSREG, dd 0 ; Current source register index +NEWSYM SfxRomBuffer, dd 0 ; Current byte read by R14 +NEWSYM SfxPIPE, dd 0 ; Instructionset pipe +NEWSYM SfxPipeAdr, dd 0 ; The address of where the pipe was read from + +NEWSYM SfxnRamBanks, dd 4 ; Number of 64kb-banks in FxRam (Don't confuse it with SNES-Ram!!!) +NEWSYM SfxnRomBanks, dd 0 ; Number of 32kb-banks in Cart-ROM + +NEWSYM SfxvScreenHeight, dd 0 ; 128, 160 or 192 +NEWSYM SfxvScreenSize, dd 0 + +NEWSYM SfxCacheActive, dd 0 ; Cache Active + +NEWSYM SfxCarry, dd 0 ; Carry flag +NEWSYM SfxSignZero, dd 1 ; Sign and Zero flag +NEWSYM SfxB, dd 0 ; B flag (1 when with instruction executed) +NEWSYM SfxOverflow, dd 0 ; Overflow flag + +NEWSYM SfxCACHERAM, times 512 db 0 ; 512 bytes of GSU cache memory +num2writesfxreg equ $-SfxR0 +; pharos equ hack *sigh* +NEWSYM PHnum2writesfxreg, dd num2writesfxreg + +NEWSYM SfxCPB, dd 0 +NEWSYM SfxCROM, dd 0 +NEWSYM SfxRAMMem, dd 0 +NEWSYM withr15sk, dd 0 +NEWSYM sfxclineloc, dd 0 +NEWSYM SCBRrel, dd 0 +NEWSYM fxbit01pcal, dd 0 +NEWSYM fxbit23pcal, dd 0 +NEWSYM fxbit45pcal, dd 0 +NEWSYM fxbit67pcal, dd 0 + +;SfxRAM times 256*1024 db 0 + +; If we need this later... + +SECTION .text +NEWSYM FxOp00 ; STOP stop GSU execution (and maybe generate an IRQ) ; Verified. + FETCHPIPE + mov [SfxPIPE],cl + and dword [SfxSFR],0FFFFh-32 ; Clear Go flag (set to 1 when the GSU is running) + test dword [SfxCFGR],080h ; Check if the interrupt generation is on + jnz .NoIRQ + or dword [SfxSFR],08000h ; Set IRQ Flag +.NoIRQ + CLRFLAGS + inc ebp + mov eax,[NumberOfOpcodes] + add eax,0F0000000h + add [ChangeOps],eax + mov dword [NumberOfOpcodes],1 + mov dword[SFXProc],0 + xor cl,cl + ret + +NEWSYM FxOp01 ; NOP no operation ; Verified. + FETCHPIPE + CLRFLAGS + inc ebp ; Increase program counter + ret + +NEWSYM FxOp02 ; CACHE reintialize GSU cache + mov eax,ebp + FETCHPIPE + sub eax,[SfxCPB] + and eax,0FFF0h + cmp dword [SfxCBR],eax + je .SkipUpdate + cmp byte [SfxCacheActive],1 + je .SkipUpdate + mov dword [SfxCBR],eax + mov dword [SfxCacheActive],1 + call FlushCache +.SkipUpdate + CLRFLAGS + inc ebp ; Increase program counter + ret + +NEWSYM FxOp03 ; LSR logic shift right ; Verified. + mov eax,[esi] ; Read Source + FETCHPIPE + mov [SfxCarry],al + and byte[SfxCarry],1 + shr ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp04 ; ROL rotate left (RCL?) ; V + shr byte[SfxCarry],1 + mov eax,[esi] ; Read Source + FETCHPIPE + rcl ax,1 + rcl byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp05 ; BRA branch always ; Verified. + movsx eax,byte[ebp] + mov cl,[ebp+1] + inc ebp + add ebp,eax + call [FxTable+ecx*4] + ret + +NEWSYM FxOp06 ; BGE branch on greater or equals ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp07 ; BLT branch on lesss than ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp08 ; BNE branch on not equal ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp09 ; BEQ branch on equal (z=1) ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0A ; BPL branch on plus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0B ; BMI branch on minus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0C ; BCC branch on carry clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0D ; BCS branch on carry set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0E ; BVC branch on overflow clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp0F ; BVS branch on overflow set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + ret +.nojump + inc ebp + call [FxTable+ecx*4] + ret + +NEWSYM FxOp10 ; TO RN set register n as destination register + TORN 0 +NEWSYM FxOp11 ; TO RN set register n as destination register + TORN 1 +NEWSYM FxOp12 ; TO RN set register n as destination register + TORN 2 +NEWSYM FxOp13 ; TO RN set register n as destination register + TORN 3 +NEWSYM FxOp14 ; TO RN set register n as destination register + TORN 4 +NEWSYM FxOp15 ; TO RN set register n as destination register + TORN 5 +NEWSYM FxOp16 ; TO RN set register n as destination register + TORN 6 +NEWSYM FxOp17 ; TO RN set register n as destination register + TORN 7 +NEWSYM FxOp18 ; TO RN set register n as destination register + TORN 8 +NEWSYM FxOp19 ; TO RN set register n as destination register + TORN 9 +NEWSYM FxOp1A ; TO RN set register n as destination register + TORN 10 +NEWSYM FxOp1B ; TO RN set register n as destination register + TORN 11 +NEWSYM FxOp1C ; TO RN set register n as destination register + TORN 12 +NEWSYM FxOp1D ; TO RN set register n as destination register + TORN 13 +NEWSYM FxOp1E ; TO RN set register n as destination register + FETCHPIPE + mov edi,SfxR0+14*4 + inc ebp + call [FxTable+ecx*4] + mov edi,SfxR0 + UpdateR14 + ret +NEWSYM FxOp1F ; TO RN set register n as destination register + FETCHPIPE + mov edi,SfxR0+15*4 + inc ebp + call [FxTable+ecx*4] + mov ebp,[SfxCPB] + add ebp,[SfxR15] + mov edi,SfxR0 + ret + +NEWSYM FxOp20 ; WITH set register n as source and destination register + WITH 0 +NEWSYM FxOp21 ; WITH set register n as source and destination register + WITH 1 +NEWSYM FxOp22 ; WITH set register n as source and destination register + WITH 2 +NEWSYM FxOp23 ; WITH set register n as source and destination register + WITH 3 +NEWSYM FxOp24 ; WITH set register n as source and destination register + WITH 4 +NEWSYM FxOp25 ; WITH set register n as source and destination register + WITH 5 +NEWSYM FxOp26 ; WITH set register n as source and destination register + WITH 6 +NEWSYM FxOp27 ; WITH set register n as source and destination register + WITH 7 +NEWSYM FxOp28 ; WITH set register n as source and destination register + WITH 8 +NEWSYM FxOp29 ; WITH set register n as source and destination register + WITH 9 +NEWSYM FxOp2A ; WITH set register n as source and destination register + WITH 10 +NEWSYM FxOp2B ; WITH set register n as source and destination register + WITH 11 +NEWSYM FxOp2C ; WITH set register n as source and destination register + WITH 12 +NEWSYM FxOp2D ; WITH set register n as source and destination register + WITH 13 +NEWSYM FxOp2E ; WITH set register n as source and destination register + FETCHPIPE + mov esi,SfxR0+14*4 + mov edi,SfxR0+14*4 + mov dword [SfxB],1 + inc ebp + call [FxTablec+ecx*4] + mov dword [SfxB],0 ; Clear B Flag + mov esi,SfxR0 + mov edi,SfxR0 + UpdateR14 + ret +NEWSYM FxOp2F ; WITH set register n as source and destination register + FETCHPIPE + mov esi,SfxR0+15*4 + mov edi,SfxR0+15*4 + mov dword [SfxB],1 + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov dword[withr15sk],0 + mov [SfxR15],eax + call [FxTableb+ecx*4] + cmp dword[withr15sk],1 + je .skip + mov ebp,[SfxCPB] + add ebp,[SfxR15] +.skip + mov dword [SfxB],0 ; Clear B Flag + mov esi,SfxR0 + mov edi,SfxR0 + ret + +NEWSYM FxOp30 ; STW RN store word + STWRN 0 +NEWSYM FxOp31 ; STW RN store word + STWRN 1 +NEWSYM FxOp32 ; STW RN store word + STWRN 2 +NEWSYM FxOp33 ; STW RN store word + STWRN 3 +NEWSYM FxOp34 ; STW RN store word + STWRN 4 +NEWSYM FxOp35 ; STW RN store word + STWRN 5 +NEWSYM FxOp36 ; STW RN store word + STWRN 6 +NEWSYM FxOp37 ; STW RN store word + STWRN 7 +NEWSYM FxOp38 ; STW RN store word + STWRN 8 +NEWSYM FxOp39 ; STW RN store word + STWRN 9 +NEWSYM FxOp3A ; STW RN store word + STWRN 10 +NEWSYM FxOp3B ; STW RN store word + STWRN 11 + +NEWSYM FxOp30A1 ; STB RN store byte + STBRN 0 +NEWSYM FxOp31A1 ; STB RN store byte + STBRN 1 +NEWSYM FxOp32A1 ; STB RN store byte + STBRN 2 +NEWSYM FxOp33A1 ; STB RN store byte + STBRN 3 +NEWSYM FxOp34A1 ; STB RN store byte + STBRN 4 +NEWSYM FxOp35A1 ; STB RN store byte + STBRN 5 +NEWSYM FxOp36A1 ; STB RN store byte + STBRN 6 +NEWSYM FxOp37A1 ; STB RN store byte + STBRN 7 +NEWSYM FxOp38A1 ; STB RN store byte + STBRN 8 +NEWSYM FxOp39A1 ; STB RN store byte + STBRN 9 +NEWSYM FxOp3AA1 ; STB RN store byte + STBRN 10 +NEWSYM FxOp3BA1 ; STB RN store byte + STBRN 11 + +NEWSYM FxOp3C ; LOOP decrement loop counter, and branch on not zero ; V + dec word [SfxR12] ; decrement loop counter + FETCHPIPE + mov eax,[SfxR12] + mov [SfxSignZero],eax + or eax,eax + jz .NoBranch + mov eax,dword [SfxR13] + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + ret +.NoBranch + inc ebp + CLRFLAGS + ret + +NEWSYM FxOp3D ; ALT1 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,01h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + ret + +NEWSYM FxOp3E ; ALT2 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,02h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + ret + +NEWSYM FxOp3F ; ALT3 set alt3 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,03h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + ret + +NEWSYM FxOp40 ; LDW RN load word from RAM + LDWRN 0 +NEWSYM FxOp41 ; LDW RN load word from RAM + LDWRN 1 +NEWSYM FxOp42 ; LDW RN load word from RAM + LDWRN 2 +NEWSYM FxOp43 ; LDW RN load word from RAM + LDWRN 3 +NEWSYM FxOp44 ; LDW RN load word from RAM + LDWRN 4 +NEWSYM FxOp45 ; LDW RN load word from RAM + LDWRN 5 +NEWSYM FxOp46 ; LDW RN load word from RAM + LDWRN 6 +NEWSYM FxOp47 ; LDW RN load word from RAM + LDWRN 7 +NEWSYM FxOp48 ; LDW RN load word from RAM + LDWRN 8 +NEWSYM FxOp49 ; LDW RN load word from RAM + LDWRN 9 +NEWSYM FxOp4A ; LDW RN load word from RAM + LDWRN 10 +NEWSYM FxOp4B ; LDW RN load word from RAM + LDWRN 11 + +NEWSYM FxOp40A1 ; LDB RN load byte from RAM + LDBRN 0 +NEWSYM FxOp41A1 ; LDB RN load byte from RAM + LDBRN 1 +NEWSYM FxOp42A1 ; LDB RN load byte from RAM + LDBRN 2 +NEWSYM FxOp43A1 ; LDB RN load byte from RAM + LDBRN 3 +NEWSYM FxOp44A1 ; LDB RN load byte from RAM + LDBRN 4 +NEWSYM FxOp45A1 ; LDB RN load byte from RAM + LDBRN 5 +NEWSYM FxOp46A1 ; LDB RN load byte from RAM + LDBRN 6 +NEWSYM FxOp47A1 ; LDB RN load byte from RAM + LDBRN 7 +NEWSYM FxOp48A1 ; LDB RN load byte from RAM + LDBRN 8 +NEWSYM FxOp49A1 ; LDB RN load byte from RAM + LDBRN 9 +NEWSYM FxOp4AA1 ; LDB RN load byte from RAM + LDBRN 10 +NEWSYM FxOp4BA1 ; LDB RN load byte from RAM + LDBRN 11 + +NEWSYM FxOp4C1284b ; PLOT 4bit + plotlines4b plotb +NEWSYM FxOp4C1284bz ; PLOT 4bit, zero check + plotlines4b plotbz +NEWSYM FxOp4C1284bd ; PLOT 4bit, dither + plotlines4b plotbd +NEWSYM FxOp4C1284bzd ; PLOT 4bit, zero check + dither + plotlines4b plotbzd + +NEWSYM FxOp4C1282b ; PLOT 2bit + plotlines2b plotb +NEWSYM FxOp4C1282bz ; PLOT 2bit, zero check + plotlines2b plotbz +NEWSYM FxOp4C1282bd ; PLOT 2bit, dither + plotlines2b plotbd +NEWSYM FxOp4C1282bzd ; PLOT 2bit, zero check + dither + plotlines2b plotbzd + +NEWSYM FxOp4C1288b ; PLOT 8bit + plotlines8b plotb +NEWSYM FxOp4C1288bz ; PLOT 8bit, zero check + plotlines8b plotbz +NEWSYM FxOp4C1288bd ; PLOT 8bit, dither + plotlines8b plotbd +NEWSYM FxOp4C1288bzd ; PLOT 8bit, zero check + dither + plotlines8b plotbzd + +NEWSYM FxOp4C1288bl ; PLOT 8bit + plotlines8bl plotb +NEWSYM FxOp4C1288bzl ; PLOT 8bit, zero check + plotlines8bl plotbz +NEWSYM FxOp4C1288bdl ; PLOT 8bit, dither + plotlines8bl plotbd +NEWSYM FxOp4C1288bzdl ; PLOT 8bit, zero check + dither + plotlines8bl plotbzd + +NEWSYM FxOp4C ; PLOT plot pixel with R1,R2 as x,y and the color register as the color + jmp FxOp4C1284b + FETCHPIPE + inc ebp + CLRFLAGS + mov ebx,[SfxR2] + mov bh,[SfxR1] + mov eax,[sfxclineloc] + mov ebx,[eax+ebx*4] + cmp ebx,0FFFFFFFFh + je near .nodraw + xor eax,eax + ; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj + ; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color + ; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles + ; 16+8(4/3) 16+4(4/2) 16(4/0) + push ecx + mov al,[SfxSCMR] + and al,00000011b ; 4 + 32 + cmp al,0 + je near .colors4 + cmp al,3 + je near .colors256 + + shl ebx,5 ; x32 (16 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_16 + test byte[SfxCOLR],0Fh + jz .nodraw +.nozerocheck_16 + mov dl,[SfxCOLR] + test byte[SfxPOR],02h + jz .nodither4b + mov dh,[SfxR1] + xor dh,[SfxR2] + test dh,01h + jz .nodither4b + shr dh,4 +.nodither4b + and byte[eax],bh + and byte[eax+1],bh + and byte[eax+16],bh + and byte[eax+17],bh + test dl,01h + jz .nodraw_16 + or byte[eax], bl +.nodraw_16 + test dl,02h + jz .nodraw2_16 + or byte[eax+1], bl +.nodraw2_16 + test dl,04h + jz .nodraw3_16 + or byte[eax+16],bl +.nodraw3_16 + test dl,08h + jz .nodraw4_16 + or byte[eax+17],bl +.nodraw4_16 +.nodraw + inc word [SfxR1] + ret + +.colors4 + shl ebx,4 ; x16 (4 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_4 + test byte[SfxCOLR],03h + jz .noplot_4 +.nozerocheck_4 + mov dl,[SfxCOLR] + test byte[SfxPOR],02h + jz .nodither2b + mov dh,[SfxR1] + xor dh,[SfxR2] + test dh,01h + jz .nodither2b + shr dh,4 +.nodither2b + and byte[eax],bh + and byte[eax+1],bh + test dl,01h + jz .nodraw_4 + or byte[eax], bl +.nodraw_4 + test dl,02h + jz .nodraw2_4 + or byte[eax+1], bl +.nodraw2_4 +.noplot_4 + inc word [SfxR1] + ret + +.colors256 + shl ebx,6 ; x64 (256 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_256 + mov dl,0FFh + test byte[SfxPOR],08h + jz .nozerocheckb_256 + mov dl,0Fh +.nozerocheckb_256 + test byte[SfxCOLR],dl + jz .noplot_256 +.nozerocheck_256 + mov dl,[SfxCOLR] + and byte[eax],bh + and byte[eax+1],bh + and byte[eax+16],bh + and byte[eax+17],bh + and byte[eax+32],bh + and byte[eax+33],bh + and byte[eax+48],bh + and byte[eax+49],bh + test dl,01h + jz .nodraw_256 + or byte[eax], bl +.nodraw_256 + test dl,02h + jz .nodraw2_256 + or byte[eax+1], bl +.nodraw2_256 + test dl,04h + jz .nodraw3_256 + or byte[eax+16],bl +.nodraw3_256 + test dl,08h + jz .nodraw4_256 + or byte[eax+17],bl +.nodraw4_256 + test dl,10h + jz .nodraw5_256 + or byte[eax+32], bl +.nodraw5_256 + test dl,20h + jz .nodraw6_256 + or byte[eax+33], bl +.nodraw6_256 + test dl,40h + jz .nodraw7_256 + or byte[eax+48],bl +.nodraw7_256 + test dl,80h + jz .nodraw8_256 + or byte[eax+49],bl +.nodraw8_256 +.noplot_256 + inc word [SfxR1] + ret + +SECTION .bss +.prevx resw 1 +.prevy resw 1 + +sfxwarning resb 1 + +SECTION .text + +NEWSYM FxOp4CA1 ; RPIX read color of the pixel with R1,R2 as x,y + FETCHPIPE + mov ebx,[SfxR2] + mov bh,[SfxR1] + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov ebx,[eax+ebx*4] + cmp ebx,0FFFFFFFFh + je near .nodraw + xor eax,eax + ; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj + ; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color + ; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles + ; 16+8(4/3) 16+4(4/2) 16(4/0) + push ecx + mov al,[SfxSCMR] + and al,00000011b ; 4 + 32 + + cmp al,0 + je near .colors4 + cmp al,3 + je near .colors256 + + shl ebx,5 ; x32 (16 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_16 + or bh,01h +.nodraw_16 + test byte[eax+1],bl + jz .nodraw2_16 + or bh,02h +.nodraw2_16 + test byte[eax+16],bl + jz .nodraw3_16 + or bh,04h +.nodraw3_16 + test byte[eax+17],bl + jz .nodraw4_16 + or bh,08h +.nodraw4_16 +.nodraw + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + ret + +.colors4 + shl ebx,4 ; x16 (4 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_4 + or bh,01h +.nodraw_4 + test byte[eax+1],bl + jz .nodraw2_4 + or bh,02h +.nodraw2_4 + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + ret + +.colors256 + shl ebx,6 ; x64 (256 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_256 + or bh,01h +.nodraw_256 + test byte[eax+1],bl + jz .nodraw2_256 + or bh,02h +.nodraw2_256 + test byte[eax+16],bl + jz .nodraw3_256 + or bh,04h +.nodraw3_256 + test byte[eax+17],bl + jz .nodraw4_256 + or bh,08h +.nodraw4_256 + test byte[eax+32],bl + jz .nodraw5_256 + or bh,10h +.nodraw5_256 + test byte[eax+33],bl + jz .nodraw6_256 + or bh,20h +.nodraw6_256 + test byte[eax+48],bl + jz .nodraw7_256 + or bh,40h +.nodraw7_256 + test byte[eax+49],bl + jz .nodraw8_256 + or bh,80h +.nodraw8_256 + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + ret + +NEWSYM FxOp4D ; SWAP swap upper and lower byte of a register ; V + mov eax,[esi] ; Read Source + FETCHPIPE + ror ax,8 + inc ebp ; Increase program counter + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp4E ; COLOR copy source register to color register ; V + FETCHPIPE + mov eax,[esi] ; Read Source + ; if bit 3 of SfxPOR is set, then don't modify the upper 4 bits + test byte[SfxPOR],04h + jz .nohighnibble + mov bl,al + shr bl,4 + and al,0F0h + or al,bl +.nohighnibble + test byte[SfxPOR],08h + jnz .preserveupper + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx +.nocolchange + CLRFLAGS + inc ebp ; Increase program counter + ret +.preserveupper + mov bl,[SfxCOLR] + and al,0Fh + and bl,0F0h + or al,bl + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx + CLRFLAGS + inc ebp ; Increase program counter + ret + +NEWSYM FxOp4EA1 ; CMODE set plot option register ; V + FETCHPIPE + mov eax,[esi] ; Read Source + inc ebp ; Increase program counter + mov dword [SfxPOR],eax + + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov [sfxclineloc],eax + + + push ebx + mov al,[SfxSCMR] + and eax,00000011b + mov bl,[SfxPOR] + and bl,0Fh + shl bl,2 + or al,bl + mov ebx,[PLOTJmpb+eax*4] + mov eax,[PLOTJmpa+eax*4] + mov dword [FxTable+4Ch*4],eax + mov dword [FxTableb+4Ch*4],eax + mov dword [FxTablec+4Ch*4],eax + mov dword [FxTabled+4Ch*4],ebx + pop ebx + + CLRFLAGS + ret + +NEWSYM FxOp4F ; NOT perform exclusive exor with 1 on all bits ; V + mov eax,[esi] ; Read Source + FETCHPIPE + xor eax,0FFFFh + inc ebp ; Increase program counter + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp50 ; ADD RN add, register + register + ADDRN 0 +NEWSYM FxOp51 ; ADD RN add, register + register + ADDRN 1 +NEWSYM FxOp52 ; ADD RN add, register + register + ADDRN 2 +NEWSYM FxOp53 ; ADD RN add, register + register + ADDRN 3 +NEWSYM FxOp54 ; ADD RN add, register + register + ADDRN 4 +NEWSYM FxOp55 ; ADD RN add, register + register + ADDRN 5 +NEWSYM FxOp56 ; ADD RN add, register + register + ADDRN 6 +NEWSYM FxOp57 ; ADD RN add, register + register + ADDRN 7 +NEWSYM FxOp58 ; ADD RN add, register + register + ADDRN 8 +NEWSYM FxOp59 ; ADD RN add, register + register + ADDRN 9 +NEWSYM FxOp5A ; ADD RN add, register + register + ADDRN 10 +NEWSYM FxOp5B ; ADD RN add, register + register + ADDRN 11 +NEWSYM FxOp5C ; ADD RN add, register + register + ADDRN 12 +NEWSYM FxOp5D ; ADD RN add, register + register + ADDRN 13 +NEWSYM FxOp5E ; ADD RN add, register + register + ADDRN 14 +NEWSYM FxOp5F ; ADD RN add, register + register + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + add ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp50A1 ; ADC RN add with carry, register + register + ADCRN 0 +NEWSYM FxOp51A1 ; ADC RN add with carry, register + register + ADCRN 1 +NEWSYM FxOp52A1 ; ADC RN add with carry, register + register + ADCRN 2 +NEWSYM FxOp53A1 ; ADC RN add with carry, register + register + ADCRN 3 +NEWSYM FxOp54A1 ; ADC RN add with carry, register + register + ADCRN 4 +NEWSYM FxOp55A1 ; ADC RN add with carry, register + register + ADCRN 5 +NEWSYM FxOp56A1 ; ADC RN add with carry, register + register + ADCRN 6 +NEWSYM FxOp57A1 ; ADC RN add with carry, register + register + ADCRN 7 +NEWSYM FxOp58A1 ; ADC RN add with carry, register + register + ADCRN 8 +NEWSYM FxOp59A1 ; ADC RN add with carry, register + register + ADCRN 9 +NEWSYM FxOp5AA1 ; ADC RN add with carry, register + register + ADCRN 10 +NEWSYM FxOp5BA1 ; ADC RN add with carry, register + register + ADCRN 11 +NEWSYM FxOp5CA1 ; ADC RN add with carry, register + register + ADCRN 12 +NEWSYM FxOp5DA1 ; ADC RN add with carry, register + register + ADCRN 13 +NEWSYM FxOp5EA1 ; ADC RN add with carry, register + register + ADCRN 14 +NEWSYM FxOp5FA1 ; ADC RN add with carry, register + register + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + shr byte[SfxCarry],1 + adc ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +; Weird opcode (FxOp50A2, add 0, wow!) +NEWSYM FxOp50A2 ; ADI RN add, register + immediate + ADIRN 0 +NEWSYM FxOp51A2 ; ADI RN add, register + immediate + ADIRN 1 +NEWSYM FxOp52A2 ; ADI RN add, register + immediate + ADIRN 2 +NEWSYM FxOp53A2 ; ADI RN add, register + immediate + ADIRN 3 +NEWSYM FxOp54A2 ; ADI RN add, register + immediate + ADIRN 4 +NEWSYM FxOp55A2 ; ADI RN add, register + immediate + ADIRN 5 +NEWSYM FxOp56A2 ; ADI RN add, register + immediate + ADIRN 6 +NEWSYM FxOp57A2 ; ADI RN add, register + immediate + ADIRN 7 +NEWSYM FxOp58A2 ; ADI RN add, register + immediate + ADIRN 8 +NEWSYM FxOp59A2 ; ADI RN add, register + immediate + ADIRN 9 +NEWSYM FxOp5AA2 ; ADI RN add, register + immediate + ADIRN 10 +NEWSYM FxOp5BA2 ; ADI RN add, register + immediate + ADIRN 11 +NEWSYM FxOp5CA2 ; ADI RN add, register + immediate + ADIRN 12 +NEWSYM FxOp5DA2 ; ADI RN add, register + immediate + ADIRN 13 +NEWSYM FxOp5EA2 ; ADI RN add, register + immediate + ADIRN 14 +NEWSYM FxOp5FA2 ; ADI RN add, register + immediate + ADIRN 15 + +; Another very useful opcode +NEWSYM FxOp50A3 ; ADCIRN add with carry, register + immediate + ADCIRN 0 +NEWSYM FxOp51A3 ; ADCIRN add with carry, register + immediate + ADCIRN 1 +NEWSYM FxOp52A3 ; ADCIRN add with carry, register + immediate + ADCIRN 2 +NEWSYM FxOp53A3 ; ADCIRN add with carry, register + immediate + ADCIRN 3 +NEWSYM FxOp54A3 ; ADCIRN add with carry, register + immediate + ADCIRN 4 +NEWSYM FxOp55A3 ; ADCIRN add with carry, register + immediate + ADCIRN 5 +NEWSYM FxOp56A3 ; ADCIRN add with carry, register + immediate + ADCIRN 6 +NEWSYM FxOp57A3 ; ADCIRN add with carry, register + immediate + ADCIRN 7 +NEWSYM FxOp58A3 ; ADCIRN add with carry, register + immediate + ADCIRN 8 +NEWSYM FxOp59A3 ; ADCIRN add with carry, register + immediate + ADCIRN 9 +NEWSYM FxOp5AA3 ; ADCIRN add with carry, register + immediate + ADCIRN 10 +NEWSYM FxOp5BA3 ; ADCIRN add with carry, register + immediate + ADCIRN 11 +NEWSYM FxOp5CA3 ; ADCIRN add with carry, register + immediate + ADCIRN 12 +NEWSYM FxOp5DA3 ; ADCIRN add with carry, register + immediate + ADCIRN 13 +NEWSYM FxOp5EA3 ; ADCIRN add with carry, register + immediate + ADCIRN 14 +NEWSYM FxOp5FA3 ; ADCIRN add with carry, register + immediate + ADCIRN 15 + +NEWSYM FxOp60 ; SUBRN subtract, register - register + SUBRN 0 +NEWSYM FxOp61 ; SUBRN subtract, register - register + SUBRN 1 +NEWSYM FxOp62 ; SUBRN subtract, register - register + SUBRN 2 +NEWSYM FxOp63 ; SUBRN subtract, register - register + SUBRN 3 +NEWSYM FxOp64 ; SUBRN subtract, register - register + SUBRN 4 +NEWSYM FxOp65 ; SUBRN subtract, register - register + SUBRN 5 +NEWSYM FxOp66 ; SUBRN subtract, register - register + SUBRN 6 +NEWSYM FxOp67 ; SUBRN subtract, register - register + SUBRN 7 +NEWSYM FxOp68 ; SUBRN subtract, register - register + SUBRN 8 +NEWSYM FxOp69 ; SUBRN subtract, register - register + SUBRN 9 +NEWSYM FxOp6A ; SUBRN subtract, register - register + SUBRN 10 +NEWSYM FxOp6B ; SUBRN subtract, register - register + SUBRN 11 +NEWSYM FxOp6C ; SUBRN subtract, register - register + SUBRN 12 +NEWSYM FxOp6D ; SUBRN subtract, register - register + SUBRN 13 +NEWSYM FxOp6E ; SUBRN subtract, register - register + SUBRN 14 +NEWSYM FxOp6F ; SUBRN subtract, register - register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp60A1 ; SBCRN subtract with carry, register - register + SBCRN 0 +NEWSYM FxOp61A1 ; SBCRN subtract with carry, register - register + SBCRN 1 +NEWSYM FxOp62A1 ; SBCRN subtract with carry, register - register + SBCRN 2 +NEWSYM FxOp63A1 ; SBCRN subtract with carry, register - register + SBCRN 3 +NEWSYM FxOp64A1 ; SBCRN subtract with carry, register - register + SBCRN 4 +NEWSYM FxOp65A1 ; SBCRN subtract with carry, register - register + SBCRN 5 +NEWSYM FxOp66A1 ; SBCRN subtract with carry, register - register + SBCRN 6 +NEWSYM FxOp67A1 ; SBCRN subtract with carry, register - register + SBCRN 7 +NEWSYM FxOp68A1 ; SBCRN subtract with carry, register - register + SBCRN 8 +NEWSYM FxOp69A1 ; SBCRN subtract with carry, register - register + SBCRN 9 +NEWSYM FxOp6AA1 ; SBCRN subtract with carry, register - register + SBCRN 10 +NEWSYM FxOp6BA1 ; SBCRN subtract with carry, register - register + SBCRN 11 +NEWSYM FxOp6CA1 ; SBCRN subtract with carry, register - register + SBCRN 12 +NEWSYM FxOp6DA1 ; SBCRN subtract with carry, register - register + SBCRN 13 +NEWSYM FxOp6EA1 ; SBCRN subtract with carry, register - register + SBCRN 14 +NEWSYM FxOp6FA1 ; SBCRN subtract with carry, register - register + mov eax,[esi] ; Read Source + mov ebx,ebp + FETCHPIPE + sub ebx,[SfxCPB] + cmp byte[SfxCarry],1 + sbb ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp60A2 ; SUBIRN subtract, register - immediate + SUBIRN 0 +NEWSYM FxOp61A2 ; SUBIRN subtract, register - immediate + SUBIRN 1 +NEWSYM FxOp62A2 ; SUBIRN subtract, register - immediate + SUBIRN 2 +NEWSYM FxOp63A2 ; SUBIRN subtract, register - immediate + SUBIRN 3 +NEWSYM FxOp64A2 ; SUBIRN subtract, register - immediate + SUBIRN 4 +NEWSYM FxOp65A2 ; SUBIRN subtract, register - immediate + SUBIRN 5 +NEWSYM FxOp66A2 ; SUBIRN subtract, register - immediate + SUBIRN 6 +NEWSYM FxOp67A2 ; SUBIRN subtract, register - immediate + SUBIRN 7 +NEWSYM FxOp68A2 ; SUBIRN subtract, register - immediate + SUBIRN 8 +NEWSYM FxOp69A2 ; SUBIRN subtract, register - immediate + SUBIRN 9 +NEWSYM FxOp6AA2 ; SUBIRN subtract, register - immediate + SUBIRN 10 +NEWSYM FxOp6BA2 ; SUBIRN subtract, register - immediate + SUBIRN 11 +NEWSYM FxOp6CA2 ; SUBIRN subtract, register - immediate + SUBIRN 12 +NEWSYM FxOp6DA2 ; SUBIRN subtract, register - immediate + SUBIRN 13 +NEWSYM FxOp6EA2 ; SUBIRN subtract, register - immediate + SUBIRN 14 +NEWSYM FxOp6FA2 ; SUBIRN subtract, register - immediate + SUBIRN 15 + +NEWSYM FxOp60A3 ; CMPRN compare, register, register + CMPRN 0 +NEWSYM FxOp61A3 ; CMPRN compare, register, register + CMPRN 1 +NEWSYM FxOp62A3 ; CMPRN compare, register, register + CMPRN 2 +NEWSYM FxOp63A3 ; CMPRN compare, register, register + CMPRN 3 +NEWSYM FxOp64A3 ; CMPRN compare, register, register + CMPRN 4 +NEWSYM FxOp65A3 ; CMPRN compare, register, register + CMPRN 5 +NEWSYM FxOp66A3 ; CMPRN compare, register, register + CMPRN 6 +NEWSYM FxOp67A3 ; CMPRN compare, register, register + CMPRN 7 +NEWSYM FxOp68A3 ; CMPRN compare, register, register + CMPRN 8 +NEWSYM FxOp69A3 ; CMPRN compare, register, register + CMPRN 9 +NEWSYM FxOp6AA3 ; CMPRN compare, register, register + CMPRN 10 +NEWSYM FxOp6BA3 ; CMPRN compare, register, register + CMPRN 11 +NEWSYM FxOp6CA3 ; CMPRN compare, register, register + CMPRN 12 +NEWSYM FxOp6DA3 ; CMPRN compare, register, register + CMPRN 13 +NEWSYM FxOp6EA3 ; CMPRN compare, register, register + CMPRN 14 +NEWSYM FxOp6FA3 ; CMPRN compare, register, register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + mov [SfxSignZero],eax + CLRFLAGS + inc ebp ; Increase program counter + ret + +NEWSYM FxOp70 ; MERGE R7 as upper byte, R8 as lower byte (used for texture-mapping) */ + ; V + xor eax,eax + FETCHPIPE + mov ah,byte [SfxR7+1] + mov al,byte [SfxR8+1] + inc ebp + mov [edi],eax ; Write Destination + mov dword[SfxSignZero],0001h + test eax,0F0F0h + jz .nozero + mov dword[SfxSignZero],0000h +.nozero + test eax,08080h + jz .nosign + or dword [SfxSignZero],80000h +.nosign + mov dword [SfxOverflow],1 + test ax,0c0c0h + jnz .Overflow + mov dword [SfxOverflow],0 +.Overflow + mov dword [SfxCarry],1 + test ax,0e0e0h + jnz .Carry + mov dword [SfxCarry],0 +.Carry + CLRFLAGS + ret + +NEWSYM FxOp71 ; AND RN register & register + ANDRN 1 +NEWSYM FxOp72 ; AND RN register & register + ANDRN 2 +NEWSYM FxOp73 ; AND RN register & register + ANDRN 3 +NEWSYM FxOp74 ; AND RN register & register + ANDRN 4 +NEWSYM FxOp75 ; AND RN register & register + ANDRN 5 +NEWSYM FxOp76 ; AND RN register & register + ANDRN 6 +NEWSYM FxOp77 ; AND RN register & register + ANDRN 7 +NEWSYM FxOp78 ; AND RN register & register + ANDRN 8 +NEWSYM FxOp79 ; AND RN register & register + ANDRN 9 +NEWSYM FxOp7A ; AND RN register & register + ANDRN 10 +NEWSYM FxOp7B ; AND RN register & register + ANDRN 11 +NEWSYM FxOp7C ; AND RN register & register + ANDRN 12 +NEWSYM FxOp7D ; AND RN register & register + ANDRN 13 +NEWSYM FxOp7E ; AND RN register & register + ANDRN 14 +NEWSYM FxOp7F ; AND RN register & register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp71A1 ; BIC RN register & ~register + BICRN 1 +NEWSYM FxOp72A1 ; BIC RN register & ~register + BICRN 2 +NEWSYM FxOp73A1 ; BIC RN register & ~register + BICRN 3 +NEWSYM FxOp74A1 ; BIC RN register & ~register + BICRN 4 +NEWSYM FxOp75A1 ; BIC RN register & ~register + BICRN 5 +NEWSYM FxOp76A1 ; BIC RN register & ~register + BICRN 6 +NEWSYM FxOp77A1 ; BIC RN register & ~register + BICRN 7 +NEWSYM FxOp78A1 ; BIC RN register & ~register + BICRN 8 +NEWSYM FxOp79A1 ; BIC RN register & ~register + BICRN 9 +NEWSYM FxOp7AA1 ; BIC RN register & ~register + BICRN 10 +NEWSYM FxOp7BA1 ; BIC RN register & ~register + BICRN 11 +NEWSYM FxOp7CA1 ; BIC RN register & ~register + BICRN 12 +NEWSYM FxOp7DA1 ; BIC RN register & ~register + BICRN 13 +NEWSYM FxOp7EA1 ; BIC RN register & ~register + BICRN 14 +NEWSYM FxOp7FA1 ; BIC RN register & ~register + FETCHPIPE + mov ebx,ebp + sub ebx,[SfxCPB] + mov eax,[esi] ; Read Source + xor ebx,0FFFFh + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp71A2 ; ANDIRN and #n - register & immediate + ANDIRN 1 +NEWSYM FxOp72A2 ; ANDIRN and #n - register & immediate + ANDIRN 2 +NEWSYM FxOp73A2 ; ANDIRN and #n - register & immediate + ANDIRN 3 +NEWSYM FxOp74A2 ; ANDIRN and #n - register & immediate + ANDIRN 4 +NEWSYM FxOp75A2 ; ANDIRN and #n - register & immediate + ANDIRN 5 +NEWSYM FxOp76A2 ; ANDIRN and #n - register & immediate + ANDIRN 6 +NEWSYM FxOp77A2 ; ANDIRN and #n - register & immediate + ANDIRN 7 +NEWSYM FxOp78A2 ; ANDIRN and #n - register & immediate + ANDIRN 8 +NEWSYM FxOp79A2 ; ANDIRN and #n - register & immediate + ANDIRN 9 +NEWSYM FxOp7AA2 ; ANDIRN and #n - register & immediate + ANDIRN 10 +NEWSYM FxOp7BA2 ; ANDIRN and #n - register & immediate + ANDIRN 11 +NEWSYM FxOp7CA2 ; ANDIRN and #n - register & immediate + ANDIRN 12 +NEWSYM FxOp7DA2 ; ANDIRN and #n - register & immediate + ANDIRN 13 +NEWSYM FxOp7EA2 ; ANDIRN and #n - register & immediate + ANDIRN 14 +NEWSYM FxOp7FA2 ; ANDIRN and #n - register & immediate + ANDIRN 15 + +NEWSYM FxOp71A3 ; BICIRN register & ~immediate + BICIRN 1 ^ 0FFFFh +NEWSYM FxOp72A3 ; BICIRN register & ~immediate + BICIRN 2 ^ 0FFFFh +NEWSYM FxOp73A3 ; BICIRN register & ~immediate + BICIRN 3 ^ 0FFFFh +NEWSYM FxOp74A3 ; BICIRN register & ~immediate + BICIRN 4 ^ 0FFFFh +NEWSYM FxOp75A3 ; BICIRN register & ~immediate + BICIRN 5 ^ 0FFFFh +NEWSYM FxOp76A3 ; BICIRN register & ~immediate + BICIRN 6 ^ 0FFFFh +NEWSYM FxOp77A3 ; BICIRN register & ~immediate + BICIRN 7 ^ 0FFFFh +NEWSYM FxOp78A3 ; BICIRN register & ~immediate + BICIRN 8 ^ 0FFFFh +NEWSYM FxOp79A3 ; BICIRN register & ~immediate + BICIRN 9 ^ 0FFFFh +NEWSYM FxOp7AA3 ; BICIRN register & ~immediate + BICIRN 10 ^ 0FFFFh +NEWSYM FxOp7BA3 ; BICIRN register & ~immediate + BICIRN 11 ^ 0FFFFh +NEWSYM FxOp7CA3 ; BICIRN register & ~immediate + BICIRN 12 ^ 0FFFFh +NEWSYM FxOp7DA3 ; BICIRN register & ~immediate + BICIRN 13 ^ 0FFFFh +NEWSYM FxOp7EA3 ; BICIRN register & ~immediate + BICIRN 14 ^ 0FFFFh +NEWSYM FxOp7FA3 ; BICIRN register & ~immediate + BICIRN 15 ^ 0FFFFh + +NEWSYM FxOp80 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 0 +NEWSYM FxOp81 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 1 +NEWSYM FxOp82 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 2 +NEWSYM FxOp83 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 3 +NEWSYM FxOp84 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 4 +NEWSYM FxOp85 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 5 +NEWSYM FxOp86 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 6 +NEWSYM FxOp87 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 7 +NEWSYM FxOp88 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 8 +NEWSYM FxOp89 ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 9 +NEWSYM FxOp8A ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 10 +NEWSYM FxOp8B ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 11 +NEWSYM FxOp8C ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 12 +NEWSYM FxOp8D ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 13 +NEWSYM FxOp8E ; MULTRN 8 bit to 16 bit signed multiply, register * register + MULTRN 14 +NEWSYM FxOp8F ; MULTRN 8 bit to 16 bit signed multiply, register * register + FETCHPIPE + mov ebx,ebp + mov al,byte [esi] ; Read Source + sub ebx,[SfxCPB] + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp80A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 0 +NEWSYM FxOp81A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 1 +NEWSYM FxOp82A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 2 +NEWSYM FxOp83A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 3 +NEWSYM FxOp84A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 4 +NEWSYM FxOp85A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 5 +NEWSYM FxOp86A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 6 +NEWSYM FxOp87A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 7 +NEWSYM FxOp88A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 8 +NEWSYM FxOp89A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 9 +NEWSYM FxOp8AA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 10 +NEWSYM FxOp8BA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 11 +NEWSYM FxOp8CA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 12 +NEWSYM FxOp8DA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 13 +NEWSYM FxOp8EA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRN 14 +NEWSYM FxOp8FA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + FETCHPIPE + mov ebx,ebp + mov al,byte [esi] ; Read Source + sub ebx,[SfxCPB] + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret + +NEWSYM FxOp80A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 0 +NEWSYM FxOp81A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 1 +NEWSYM FxOp82A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 2 +NEWSYM FxOp83A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 3 +NEWSYM FxOp84A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 4 +NEWSYM FxOp85A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 5 +NEWSYM FxOp86A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 6 +NEWSYM FxOp87A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 7 +NEWSYM FxOp88A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 8 +NEWSYM FxOp89A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 9 +NEWSYM FxOp8AA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 10 +NEWSYM FxOp8BA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 11 +NEWSYM FxOp8CA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 12 +NEWSYM FxOp8DA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 13 +NEWSYM FxOp8EA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 14 +NEWSYM FxOp8FA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRN 15 + +NEWSYM FxOp80A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 0 +NEWSYM FxOp81A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 1 +NEWSYM FxOp82A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 2 +NEWSYM FxOp83A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 3 +NEWSYM FxOp84A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 4 +NEWSYM FxOp85A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 5 +NEWSYM FxOp86A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 6 +NEWSYM FxOp87A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 7 +NEWSYM FxOp88A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 8 +NEWSYM FxOp89A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 9 +NEWSYM FxOp8AA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 10 +NEWSYM FxOp8BA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 11 +NEWSYM FxOp8CA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 12 +NEWSYM FxOp8DA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 13 +NEWSYM FxOp8EA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 14 +NEWSYM FxOp8FA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRN 15 + +NEWSYM FxOp90 ; SBK store word to last accessed RAM address ; V + mov ebx,[SfxLastRamAdr] ; Load last ram address + mov eax,[esi] ; Read Source + FETCHPIPE + mov [ebx],al ; Store Word + sub ebx,[SfxRAMMem] + xor ebx,1 + add ebx,[SfxRAMMem] + inc ebp ; Increase program counter + mov [ebx],ah ; Store Word + CLRFLAGS + ret + +NEWSYM FxOp91 ; LINK#n R11 = R15 + immediate + LINK 1 +NEWSYM FxOp92 ; LINK#n R11 = R15 + immediate + LINK 2 +NEWSYM FxOp93 ; LINK#n R11 = R15 + immediate + LINK 3 +NEWSYM FxOp94 ; LINK#n R11 = R15 + immediate + LINK 4 + +NEWSYM FxOp95 ; SEX sign extend 8 bit to 16 bit ; V + movsx eax, byte [esi] ; Read Source + FETCHPIPE + and eax,0FFFFh + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp96 ; ASR aritmethic shift right by one ; V + mov eax,[esi] ; Read Source + FETCHPIPE + mov [SfxCarry],al + and byte[SfxCarry],1 + sar ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp96A1 ; DIV2 aritmethic shift right by one ; V + mov eax,[esi] ; Read Source + FETCHPIPE + cmp ax,-1 + je .minusone + mov [SfxCarry],al + and byte[SfxCarry],1 + sar ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + ret +.minusone + mov byte[SfxCarry],1 + xor eax,eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp97 ; ROR rotate right by one ; V + FETCHPIPE + mov eax,[esi] ; Read Source + shr byte[SfxCarry],1 + rcr ax,1 + setc byte[SfxCarry] + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp98 ; JMPRN jump to address of register + JMPRN 8 +NEWSYM FxOp99 ; JMPRN jump to address of register + JMPRN 9 +NEWSYM FxOp9A ; JMPRN jump to address of register + JMPRN 10 +NEWSYM FxOp9B ; JMPRN jump to address of register + JMPRN 11 +NEWSYM FxOp9C ; JMPRN jump to address of register + JMPRN 12 +NEWSYM FxOp9D ; JMPRN jump to address of register + JMPRN 13 + +NEWSYM FxOp98A1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 8 +NEWSYM FxOp99A1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 9 +NEWSYM FxOp9AA1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 10 +NEWSYM FxOp9BA1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 11 +NEWSYM FxOp9CA1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 12 +NEWSYM FxOp9DA1 ; LJMPRN set program bank to source register and jump to address of register + LJMPRN 13 + +NEWSYM FxOp9E ; LOB set upper byte to zero (keep low byte) ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,0FFh + inc ebp + mov [edi],eax ; Write Destination + shl eax,8 + mov dword [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOp9F ; FMULT 16 bit to 32 bit signed multiplication, upper 16 bits only + ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR6] + FETCHPIPE + imul bx + inc ebp + and edx,0FFFFh + mov [SfxSignZero],edx + mov [edi],edx ; Write Destination + shr ax,15 + mov [SfxCarry],al + CLRFLAGS + ret + +NEWSYM FxOp9FA1 ; LMULT 16 bit to 32 bit signed multiplication ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR6] + FETCHPIPE + imul bx + and edx,0FFFFh + inc ebp + mov [edi],edx ; Write Destination + mov [SfxR4],ax + mov [SfxSignZero],edx + shr ax,15 + mov [SfxCarry],al + CLRFLAGS + ret + +NEWSYM FxOpA0 ; IBTRN,#PP immediate byte transfer + IBTRN 0 +NEWSYM FxOpA1 ; IBTRN,#PP immediate byte transfer + IBTRN 1 +NEWSYM FxOpA2 ; IBTRN,#PP immediate byte transfer + IBTRN 2 +NEWSYM FxOpA3 ; IBTRN,#PP immediate byte transfer + IBTRN 3 +NEWSYM FxOpA4 ; IBTRN,#PP immediate byte transfer + IBTRN 4 +NEWSYM FxOpA5 ; IBTRN,#PP immediate byte transfer + IBTRN 5 +NEWSYM FxOpA6 ; IBTRN,#PP immediate byte transfer + IBTRN 6 +NEWSYM FxOpA7 ; IBTRN,#PP immediate byte transfer + IBTRN 7 +NEWSYM FxOpA8 ; IBTRN,#PP immediate byte transfer + IBTRN 8 +NEWSYM FxOpA9 ; IBTRN,#PP immediate byte transfer + IBTRN 9 +NEWSYM FxOpAA ; IBTRN,#PP immediate byte transfer + IBTRN 10 +NEWSYM FxOpAB ; IBTRN,#PP immediate byte transfer + IBTRN 11 +NEWSYM FxOpAC ; IBTRN,#PP immediate byte transfer + IBTRN 12 +NEWSYM FxOpAD ; IBTRN,#PP immediate byte transfer + IBTRN 13 +NEWSYM FxOpAE ; IBTRN,#PP immediate byte transfer + movsx eax,byte[ebp] + mov cl,[ebp+1] + add ebp,2 + mov [SfxR0+14*4],ax + UpdateR14 + CLRFLAGS + ret +NEWSYM FxOpAF ; IBTRN,#PP immediate byte transfer + movsx eax,byte[ebp] + mov cl,[ebp+1] + and eax,0FFFFh + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + ret + +NEWSYM FxOpA0A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 0 +NEWSYM FxOpA1A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 1 +NEWSYM FxOpA2A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 2 +NEWSYM FxOpA3A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 3 +NEWSYM FxOpA4A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 4 +NEWSYM FxOpA5A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 5 +NEWSYM FxOpA6A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 6 +NEWSYM FxOpA7A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 7 +NEWSYM FxOpA8A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 8 +NEWSYM FxOpA9A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 9 +NEWSYM FxOpAAA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 10 +NEWSYM FxOpABA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 11 +NEWSYM FxOpACA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 12 +NEWSYM FxOpADA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRN 13 +NEWSYM FxOpAEA1 ; LMS rn,(yy) load word from RAM (short address) + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + inc ebp + mov [SfxR0+14*4],bx ; Write data + UpdateR14 + CLRFLAGS + ret +NEWSYM FxOpAFA1 ; LMS rn,(yy) load word from RAM (short address) + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + and ebx,0FFFFh + mov ebp,[SfxCPB] + add ebp,ebx + CLRFLAGS + ret + +NEWSYM FxOpA0A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 0 +NEWSYM FxOpA1A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 1 +NEWSYM FxOpA2A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 2 +NEWSYM FxOpA3A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 3 +NEWSYM FxOpA4A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 4 +NEWSYM FxOpA5A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 5 +NEWSYM FxOpA6A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 6 +NEWSYM FxOpA7A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 7 +NEWSYM FxOpA8A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 8 +NEWSYM FxOpA9A2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 9 +NEWSYM FxOpAAA2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 10 +NEWSYM FxOpABA2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 11 +NEWSYM FxOpACA2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 12 +NEWSYM FxOpADA2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 13 +NEWSYM FxOpAEA2 ; SMS (yy),rn store word in RAM (short address) + SMSRN 14 +NEWSYM FxOpAFA2 ; SMS (yy),rn store word in RAM (short address) + xor eax,eax + mov ebx,ebp + sub ebx,[SfxCPB] + mov al,[ebp] + inc ebp + add eax,eax + FETCHPIPE + add eax,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax + inc ebp + mov [eax],bx ; Write word to ram + CLRFLAGS + ret + +NEWSYM FxOpB0 ; FROM rn set source register + FROMRN 0 +NEWSYM FxOpB1 ; FROM rn set source register + FROMRN 1 +NEWSYM FxOpB2 ; FROM rn set source register + FROMRN 2 +NEWSYM FxOpB3 ; FROM rn set source register + FROMRN 3 +NEWSYM FxOpB4 ; FROM rn set source register + FROMRN 4 +NEWSYM FxOpB5 ; FROM rn set source register + FROMRN 5 +NEWSYM FxOpB6 ; FROM rn set source register + FROMRN 6 +NEWSYM FxOpB7 ; FROM rn set source register + FROMRN 7 +NEWSYM FxOpB8 ; FROM rn set source register + FROMRN 8 +NEWSYM FxOpB9 ; FROM rn set source register + FROMRN 9 +NEWSYM FxOpBA ; FROM rn set source register + FROMRN 10 +NEWSYM FxOpBB ; FROM rn set source register + FROMRN 11 +NEWSYM FxOpBC ; FROM rn set source register + FROMRN 12 +NEWSYM FxOpBD ; FROM rn set source register + FROMRN 13 +NEWSYM FxOpBE ; FROM rn set source register + FROMRN 14 +NEWSYM FxOpBF ; FROM rn set source register + FETCHPIPE + mov esi,SfxR0+15*4 + inc ebp ; Increase program counter + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov esi,SfxR0 + ret + +NEWSYM FxOpC0 ; HIB move high-byte to low-byte ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,0FF00h + mov dword [SfxSignZero],eax + shr eax,8 + inc ebp + mov [edi],eax + CLRFLAGS + ret + +NEWSYM FxOpC1 ; OR rn or rn + ORRN 1 +NEWSYM FxOpC2 ; OR rn or rn + ORRN 2 +NEWSYM FxOpC3 ; OR rn or rn + ORRN 3 +NEWSYM FxOpC4 ; OR rn or rn + ORRN 4 +NEWSYM FxOpC5 ; OR rn or rn + ORRN 5 +NEWSYM FxOpC6 ; OR rn or rn + ORRN 6 +NEWSYM FxOpC7 ; OR rn or rn + ORRN 7 +NEWSYM FxOpC8 ; OR rn or rn + ORRN 8 +NEWSYM FxOpC9 ; OR rn or rn + ORRN 9 +NEWSYM FxOpCA ; OR rn or rn + ORRN 10 +NEWSYM FxOpCB ; OR rn or rn + ORRN 11 +NEWSYM FxOpCC ; OR rn or rn + ORRN 12 +NEWSYM FxOpCD ; OR rn or rn + ORRN 13 +NEWSYM FxOpCE ; OR rn or rn + ORRN 14 +NEWSYM FxOpCF ; OR rn or rn + mov eax,[esi] ; Read Source + mov ebx,ebp + FETCHPIPE + sub ebx,[SfxCPB] + or eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOpC1A1 ; XOR rn xor rn + XORRN 1 +NEWSYM FxOpC2A1 ; XOR rn xor rn + XORRN 2 +NEWSYM FxOpC3A1 ; XOR rn xor rn + XORRN 3 +NEWSYM FxOpC4A1 ; XOR rn xor rn + XORRN 4 +NEWSYM FxOpC5A1 ; XOR rn xor rn + XORRN 5 +NEWSYM FxOpC6A1 ; XOR rn xor rn + XORRN 6 +NEWSYM FxOpC7A1 ; XOR rn xor rn + XORRN 7 +NEWSYM FxOpC8A1 ; XOR rn xor rn + XORRN 8 +NEWSYM FxOpC9A1 ; XOR rn xor rn + XORRN 9 +NEWSYM FxOpCAA1 ; XOR rn xor rn + XORRN 10 +NEWSYM FxOpCBA1 ; XOR rn xor rn + XORRN 11 +NEWSYM FxOpCCA1 ; XOR rn xor rn + XORRN 12 +NEWSYM FxOpCDA1 ; XOR rn xor rn + XORRN 13 +NEWSYM FxOpCEA1 ; XOR rn xor rn + XORRN 14 +NEWSYM FxOpCFA1 ; XOR rn xor rn + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + xor eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret + +NEWSYM FxOpC1A2 ; OR #n OR #n + ORI 1 +NEWSYM FxOpC2A2 ; OR #n OR #n + ORI 2 +NEWSYM FxOpC3A2 ; OR #n OR #n + ORI 3 +NEWSYM FxOpC4A2 ; OR #n OR #n + ORI 4 +NEWSYM FxOpC5A2 ; OR #n OR #n + ORI 5 +NEWSYM FxOpC6A2 ; OR #n OR #n + ORI 6 +NEWSYM FxOpC7A2 ; OR #n OR #n + ORI 7 +NEWSYM FxOpC8A2 ; OR #n OR #n + ORI 8 +NEWSYM FxOpC9A2 ; OR #n OR #n + ORI 9 +NEWSYM FxOpCAA2 ; OR #n OR #n + ORI 10 +NEWSYM FxOpCBA2 ; OR #n OR #n + ORI 11 +NEWSYM FxOpCCA2 ; OR #n OR #n + ORI 12 +NEWSYM FxOpCDA2 ; OR #n OR #n + ORI 13 +NEWSYM FxOpCEA2 ; OR #n OR #n + ORI 14 +NEWSYM FxOpCFA2 ; OR #n OR #n + ORI 15 + +NEWSYM FxOpC1A3 ; XOR #n xor #n + XORI 1 +NEWSYM FxOpC2A3 ; XOR #n xor #n + XORI 2 +NEWSYM FxOpC3A3 ; XOR #n xor #n + XORI 3 +NEWSYM FxOpC4A3 ; XOR #n xor #n + XORI 4 +NEWSYM FxOpC5A3 ; XOR #n xor #n + XORI 5 +NEWSYM FxOpC6A3 ; XOR #n xor #n + XORI 6 +NEWSYM FxOpC7A3 ; XOR #n xor #n + XORI 7 +NEWSYM FxOpC8A3 ; XOR #n xor #n + XORI 8 +NEWSYM FxOpC9A3 ; XOR #n xor #n + XORI 9 +NEWSYM FxOpCAA3 ; XOR #n xor #n + XORI 10 +NEWSYM FxOpCBA3 ; XOR #n xor #n + XORI 11 +NEWSYM FxOpCCA3 ; XOR #n xor #n + XORI 12 +NEWSYM FxOpCDA3 ; XOR #n xor #n + XORI 13 +NEWSYM FxOpCEA3 ; XOR #n xor #n + XORI 14 +NEWSYM FxOpCFA3 ; XOR #n xor #n + XORI 15 + +NEWSYM FxOpD0 ; INC rn increase by one + INCRN 0 +NEWSYM FxOpD1 ; INC rn increase by one + INCRN 1 +NEWSYM FxOpD2 ; INC rn increase by one + INCRN 2 +NEWSYM FxOpD3 ; INC rn increase by one + INCRN 3 +NEWSYM FxOpD4 ; INC rn increase by one + INCRN 4 +NEWSYM FxOpD5 ; INC rn increase by one + INCRN 5 +NEWSYM FxOpD6 ; INC rn increase by one + INCRN 6 +NEWSYM FxOpD7 ; INC rn increase by one + INCRN 7 +NEWSYM FxOpD8 ; INC rn increase by one + INCRN 8 +NEWSYM FxOpD9 ; INC rn increase by one + INCRN 9 +NEWSYM FxOpDA ; INC rn increase by one + INCRN 10 +NEWSYM FxOpDB ; INC rn increase by one + INCRN 11 +NEWSYM FxOpDC ; INC rn increase by one + INCRN 12 +NEWSYM FxOpDD ; INC rn increase by one + INCRN 13 +NEWSYM FxOpDE ; INC rn increase by one + FETCHPIPE + mov eax,[SfxR0+14*4] ; Read Source + inc ax + mov [SfxR0+14*4],eax + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + UpdateR14 + ret + +NEWSYM FxOpDF ; GETC transfer ROM buffer to color register + mov eax,[SfxRomBuffer] + FETCHPIPE + mov eax,[eax] + test byte[SfxPOR],04h + jz .nohighnibble + mov bl,al + shr bl,4 + and al,0F0h + or al,bl +.nohighnibble + test byte[SfxPOR],08h + jnz .preserveupper + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx +.nocolchange + CLRFLAGS + inc ebp ; Increase program counter + ret +.preserveupper + mov bl,[SfxCOLR] + and al,0Fh + and bl,0F0h + or al,bl + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx + CLRFLAGS + inc ebp ; Increase program counter + ret + +NEWSYM FxOpDFA2 ; RAMB set current RAM bank ; Verified + mov eax,[esi] ; Read Source + mov ebx,[SfxnRamBanks] + FETCHPIPE + dec ebx + and eax,ebx + mov dword [SfxRAMBR],eax + shl eax,16 + add eax,[sfxramdata] + mov dword [SfxRAMMem],eax + CLRFLAGS + inc ebp + ret + +NEWSYM FxOpDFA3 ; ROMB set current ROM bank ; Verified + mov eax,[esi] ; Read Source + and eax,07Fh + FETCHPIPE + mov dword [SfxROMBR],eax + mov eax,[SfxMemTable+eax*4] + mov [SfxCROM],eax + CLRFLAGS + inc ebp + ret + +NEWSYM FxOpE0 ; DEC rn decrement by one + DECRN 0 +NEWSYM FxOpE1 ; DEC rn decrement by one + DECRN 1 +NEWSYM FxOpE2 ; DEC rn decrement by one + DECRN 2 +NEWSYM FxOpE3 ; DEC rn decrement by one + DECRN 3 +NEWSYM FxOpE4 ; DEC rn decrement by one + DECRN 4 +NEWSYM FxOpE5 ; DEC rn decrement by one + DECRN 5 +NEWSYM FxOpE6 ; DEC rn decrement by one + DECRN 6 +NEWSYM FxOpE7 ; DEC rn decrement by one + DECRN 7 +NEWSYM FxOpE8 ; DEC rn decrement by one + DECRN 8 +NEWSYM FxOpE9 ; DEC rn decrement by one + DECRN 9 +NEWSYM FxOpEA ; DEC rn decrement by one + DECRN 10 +NEWSYM FxOpEB ; DEC rn decrement by one + DECRN 11 +NEWSYM FxOpEC ; DEC rn decrement by one + DECRN 12 +NEWSYM FxOpED ; DEC rn decrement by one + DECRN 13 +NEWSYM FxOpEE ; DEC rn decrement by one + dec word[SfxR0+14*4] + FETCHPIPE + mov eax,[SfxR0+14*4] ; Read Source + mov [SfxSignZero],eax + UpdateR14 + CLRFLAGS + inc ebp + ret + +NEWSYM FxOpEF ; getb get byte from ROM at address R14 ; V + FETCHPIPE + mov eax,[SfxRomBuffer] + inc ebp + mov eax,[eax] + and eax,0FFh +; cmp edi,SfxR15 +; je .nor15 + mov [edi],eax ; Write DREG + CLRFLAGS + ret +.nor15 +; mov eax,ebp +; sub eax,[SfxCPB] +; mov [SfxR15],al + or eax,8000h + mov [edi],eax ; Write DREG + CLRFLAGS + ret + +NEWSYM FxOpEFA1 ; getbh get high-byte from ROM at address R14 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxRomBuffer] + and eax,0FFh + FETCHPIPE + mov ah,[ebx] + inc ebp + mov [edi],eax ; Write DREG + CLRFLAGS + ret + +NEWSYM FxOpEFA2 ; getbl get low-byte from ROM at address R14 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxRomBuffer] + and eax,0FF00h + FETCHPIPE + mov al,[ebx] + inc ebp + mov [edi],eax ; Write DREG + CLRFLAGS + ret + +NEWSYM FxOpEFA3 ; getbs get sign extended byte from ROM at address R14 ; V + mov ebx,[SfxRomBuffer] + FETCHPIPE + movsx eax,byte[ebx] + inc ebp + mov [edi],ax ; Write DREG + CLRFLAGS + ret + +NEWSYM FxOpF0 ; IWT RN,#xx immediate word transfer to register + IWTRN 0 +NEWSYM FxOpF1 ; IWT RN,#xx immediate word transfer to register + IWTRN 1 +NEWSYM FxOpF2 ; IWT RN,#xx immediate word transfer to register + IWTRN 2 +NEWSYM FxOpF3 ; IWT RN,#xx immediate word transfer to register + IWTRN 3 +NEWSYM FxOpF4 ; IWT RN,#xx immediate word transfer to register + IWTRN 4 +NEWSYM FxOpF5 ; IWT RN,#xx immediate word transfer to register + IWTRN 5 +NEWSYM FxOpF6 ; IWT RN,#xx immediate word transfer to register + IWTRN 6 +NEWSYM FxOpF7 ; IWT RN,#xx immediate word transfer to register + IWTRN 7 +NEWSYM FxOpF8 ; IWT RN,#xx immediate word transfer to register + IWTRN 8 +NEWSYM FxOpF9 ; IWT RN,#xx immediate word transfer to register + IWTRN 9 +NEWSYM FxOpFA ; IWT RN,#xx immediate word transfer to register + IWTRN 10 +NEWSYM FxOpFB ; IWT RN,#xx immediate word transfer to register + IWTRN 11 +NEWSYM FxOpFC ; IWT RN,#xx immediate word transfer to register + IWTRN 12 +NEWSYM FxOpFD ; IWT RN,#xx immediate word transfer to register + IWTRN 13 +NEWSYM FxOpFE ; IWT RN,#xx immediate word transfer to register + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + add ebp,3 + mov [SfxR0+14*4],eax + UpdateR14 + CLRFLAGS + ret +NEWSYM FxOpFF ; IWT RN,#xx immediate word transfer to register + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + ret + +NEWSYM FxOpF0A1 ; LM RN,(XX) load word from RAM + LMRN 0 +NEWSYM FxOpF1A1 ; LM RN,(XX) load word from RAM + LMRN 1 +NEWSYM FxOpF2A1 ; LM RN,(XX) load word from RAM + LMRN 2 +NEWSYM FxOpF3A1 ; LM RN,(XX) load word from RAM + LMRN 3 +NEWSYM FxOpF4A1 ; LM RN,(XX) load word from RAM + LMRN 4 +NEWSYM FxOpF5A1 ; LM RN,(XX) load word from RAM + LMRN 5 +NEWSYM FxOpF6A1 ; LM RN,(XX) load word from RAM + LMRN 6 +NEWSYM FxOpF7A1 ; LM RN,(XX) load word from RAM + LMRN 7 +NEWSYM FxOpF8A1 ; LM RN,(XX) load word from RAM + LMRN 8 +NEWSYM FxOpF9A1 ; LM RN,(XX) load word from RAM + LMRN 9 +NEWSYM FxOpFAA1 ; LM RN,(XX) load word from RAM + LMRN 10 +NEWSYM FxOpFBA1 ; LM RN,(XX) load word from RAM + LMRN 11 +NEWSYM FxOpFCA1 ; LM RN,(XX) load word from RAM + LMRN 12 +NEWSYM FxOpFDA1 ; LM RN,(XX) load word from RAM + LMRN 13 +NEWSYM FxOpFEA1 ; LM RN,(XX) load word from RAM + xor eax,eax + mov cl,[ebp+2] + mov ax,[ebp] + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + add ebp,3 + mov dh,[eax+ebx] + mov word [SfxR0+14*4],dx ; Store Word + UpdateR14 + CLRFLAGS + ret +NEWSYM FxOpFFA1 ; LM RN,(XX) load word from RAM + FETCHPIPE + mov eax,ecx + inc ebp + FETCHPIPE + inc ebp + mov ah,cl + FETCHPIPE + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + mov dh,[eax+ebx] + and edx,0FFFFh + mov ebp,[SfxCPB] + add ebp,edx + CLRFLAGS + ret + +NEWSYM FxOpF0A2 ; SM (XX),RN store word in RAM + SMRN 0 +NEWSYM FxOpF1A2 ; SM (XX),RN store word in RAM + SMRN 1 +NEWSYM FxOpF2A2 ; SM (XX),RN store word in RAM + SMRN 2 +NEWSYM FxOpF3A2 ; SM (XX),RN store word in RAM + SMRN 3 +NEWSYM FxOpF4A2 ; SM (XX),RN store word in RAM + SMRN 4 +NEWSYM FxOpF5A2 ; SM (XX),RN store word in RAM + SMRN 5 +NEWSYM FxOpF6A2 ; SM (XX),RN store word in RAM + SMRN 6 +NEWSYM FxOpF7A2 ; SM (XX),RN store word in RAM + SMRN 7 +NEWSYM FxOpF8A2 ; SM (XX),RN store word in RAM + SMRN 8 +NEWSYM FxOpF9A2 ; SM (XX),RN store word in RAM + SMRN 9 +NEWSYM FxOpFAA2 ; SM (XX),RN store word in RAM + SMRN 10 +NEWSYM FxOpFBA2 ; SM (XX),RN store word in RAM + SMRN 11 +NEWSYM FxOpFCA2 ; SM (XX),RN store word in RAM + SMRN 12 +NEWSYM FxOpFDA2 ; SM (XX),RN store word in RAM + SMRN 13 +NEWSYM FxOpFEA2 ; SM (XX),RN store word in RAM + SMRN 14 +NEWSYM FxOpFFA2 ; SM (XX),RN store word in RAM + FETCHPIPE + mov ebx,ebp + sub ebx,[SfxCPB] + mov eax,ecx + inc ebp + FETCHPIPE + inc ebp + mov ah,cl + FETCHPIPE + mov dx,bx + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov [eax+ebx],dl + xor eax,1 + inc ebp + mov [eax+ebx],dh + CLRFLAGS + ret + +SECTION .bss ;ALIGN=32 + +NEWSYM NumberOfOpcodes, resd 1 ; Number of opcodes to execute +NEWSYM NumberOfOpcodesBU, resd 1 ; Number of opcodes to execute backup value +NEWSYM sfxwarningb, resb 1 + +SECTION .text + +NEWSYM MainLoop + mov eax,[SfxPBR] + and eax,0FFh +; mov byte[fxtrace+eax],1 + mov ebp,[SfxCPB] + add ebp,[SfxR15] + xor ecx,ecx + mov cl,[SfxPIPE] + mov ch,[SfxSFR+1] + and ch,03h + ; pack esi/edi + PackEsiEdi + jmp [FxTabled+ecx*4] + jmp .LoopAgain +ALIGN16 +.LoopAgain + call [FxTable+ecx*4] + dec dword [NumberOfOpcodes] + jnz .LoopAgain +.EndLoop +NEWSYM FXEndLoop + sub ebp,[SfxCPB] + mov [SfxR15],ebp + mov [SfxPIPE],cl + and byte[SfxSFR+1],0FFh-03h + or [SfxSFR+1],ch + UnPackEsiEdi + ret + +SECTION .data +NEWSYM fxtrace, db 0; times 65536 db 0 +SECTION .text + +NEWSYM FxEmu2AsmEnd diff --git a/src/i386/fxemu2.mac b/src/i386/fxemu2.mac new file mode 100644 index 0000000..9ec7671 --- /dev/null +++ b/src/i386/fxemu2.mac @@ -0,0 +1,834 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + + + + + + + + +%macro FETCHPIPE 0 +; mov edx,[SfxPBR] +; mov edx,[SfxMemTable+edx*4] +; mov edx,[SfxCPB] +; mov edx,[SfxR15] + mov cl,[ebp] +%endmacro + +%macro UpdateR14 0 +; mov edx,[SfxROMBR] +; mov edx,[SfxMemTable+edx*4] + mov eax,[SfxCROM] +; and dword[SfxR14],0FFFFh + add eax,[SfxR14] + mov [SfxRomBuffer],eax +%endmacro + +%macro UpdateR15 0 + mov ebp,[SfxCPB] + add ebp,[SfxR15] +%endmacro + +%macro CLRFLAGS 0 + ;and dword [SfxSFR],0FFFFh-0100h-0200h-1000h ; Clear ALT1,ALT2 and B Flags +; xor ch,ch +; mov dword [SfxB],0 ; Clear B Flag +; mov esi,SfxR0 +; mov edi,SfxR0 +%endmacro + +%macro TORN 1 ; V + FETCHPIPE + mov edi, SfxR0+%1*4 + inc ebp ; Increase program counter + call [FxTable+ecx*4] + mov edi,SfxR0 + ret +%endmacro + +%macro WITH 1 ; Verified. + FETCHPIPE + mov esi,SfxR0+%1*4 + mov edi,SfxR0+%1*4 + mov dword [SfxB],1 + inc ebp ; Increase program counter + call [FxTablec+ecx*4] + mov esi,SfxR0 + mov edi,SfxR0 + mov dword [SfxB],0 ; Clear B Flag + ret +%endmacro + +%macro STWRN 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + mov ebx,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + add dword [SfxLastRamAdr],ebx ; Save last ram address + mov edx,[esi] ; Read Source + FETCHPIPE + mov [ebx+eax],dl ; Store Word + xor eax,1 + inc ebp ; Increase program counter + mov [ebx+eax],dh ; Store Word + CLRFLAGS + ret +%endmacro + +%macro STBRN 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + FETCHPIPE + add eax,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + mov ebx,[esi] ; Read Source + mov byte [eax],bl ; Store Byte + CLRFLAGS + inc ebp ; Increase program counter + ret +%endmacro + +%macro LDWRN 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + mov ebx,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + FETCHPIPE + mov dl,[ebx+eax] ; Store Word + add dword [SfxLastRamAdr],ebx ; Save last ram address + xor eax,1 + and edx,0FFFFh + inc ebp ; Increase program counter + mov dh,[ebx+eax] ; Store Word + mov [edi],edx ; Read Source + CLRFLAGS + ret +%endmacro + +%macro LDBRN 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + FETCHPIPE + add eax,[SfxRAMMem] + xor ebx,ebx + mov dword [SfxLastRamAdr],eax ; Save last ram address + mov bl,[eax] ; Read Byte + inc ebp ; Increase program counter + mov [edi],ebx ; Store Result + CLRFLAGS + ret +%endmacro + +; test byte[SfxPOR],01h +; jnz .nozerocheck +; test byte[SfxPOR],02h +; jz .nodither + +; **** Can pre-calculate [SfxSCBR] << 10 + [sfxramdata] +; Pre-calculate fxbit values from color register + +%macro drawpix4b 0 + and [eax],edx + and [eax+16],edx + xor edx,0FFFFFFFFh + mov ebx,[fxbit01pcal] + and ebx,edx + or [eax], ebx + and edx,[fxbit23pcal] + or [eax+16], edx +%endmacro + +%macro drawpix4bd 0 + and [eax],edx + and [eax+16],edx + xor edx,0FFFFFFFFh + mov ebx,[fxbit45pcal] + and ebx,edx + or [eax], ebx + and edx,[fxbit67pcal] + or [eax+16], edx +%endmacro + +%macro drawpix2b 0 + and [eax],edx + xor edx,0FFFFFFFFh + and edx,[fxbit01pcal] + or [eax], edx +%endmacro + +%macro drawpix2bd 0 + and [eax],edx + xor edx,0FFFFFFFFh + and edx,[fxbit45pcal] + or [eax], edx +%endmacro + +%macro drawpix8b 0 + and [eax],edx + and [eax+16],edx + and [eax+32],edx + and [eax+48],edx + xor edx,0FFFFFFFFh + mov ebx,[fxbit01pcal] + and ebx,edx + or [eax], ebx + mov ebx,[fxbit23pcal] + and ebx,edx + or [eax+16], ebx + mov ebx,[fxbit45pcal] + and ebx,edx + or [eax+32], ebx + and edx,[fxbit67pcal] + or [eax+48], edx +%endmacro + +%macro drawpix8bd 0 + and [eax],edx + and [eax+16],edx + and [eax+32],edx + and [eax+48],edx + xor edx,0FFFFFFFFh + mov ebx,[fxbit45pcal] + and ebx,edx + or [eax], ebx + mov ebx,[fxbit67pcal] + and ebx,edx + or [eax+16], ebx + mov ebx,[fxbit01pcal] + and ebx,edx + or [eax+32], ebx + and edx,[fxbit23pcal] + or [eax+48], edx +%endmacro + +%macro plotb 5 + shl eax,%3 + and ebx,07h + add ebx,ebx + add eax,ebx + add eax,[SCBRrel] + mov bl,[SfxR1] + mov edx,[fxxand+ebx*4] + %2 +%endmacro + +%macro plotbz 5 + shl eax,%3 + and ebx,07h + add ebx,ebx + add eax,ebx + add eax,[SCBRrel] + mov bl,[SfxR1] + mov edx,[fxxand+ebx*4] + test byte[SfxCOLR],%5 + jz .nodraw + %2 +%endmacro + +%macro plotbd 5 + shl eax,%3 + and ebx,07h + add ebx,ebx + add eax,ebx + add eax,[SCBRrel] + mov bl,[SfxR1] + mov edx,[fxxand+ebx*4] + mov bl,[SfxR1] + xor bl,[SfxR2] + test bl,01h + jz near .nodither4b + %4 + inc word [SfxR1] + %1 +.nodither4b + %2 +%endmacro + +%macro plotbzd 5 + shl eax,%3 + and ebx,07h + add ebx,ebx + add eax,ebx + add eax,[SCBRrel] + mov bl,[SfxR1] + mov edx,[fxxand+ebx*4] + test byte[SfxCOLR],%5 + jz near .nodraw + mov bl,[SfxR1] + xor bl,[SfxR2] + test bl,01h + jz .nodither4b + %4 + inc word [SfxR1] + %1 +.nodither4b + %2 +%endmacro + +%macro plotlines4b 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 ret, drawpix4b, 5, drawpix4bd, 0Fh +.nodraw + inc word [SfxR1] + ret +%endmacro + +%macro plotlines4bb 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 FXReturn, drawpix4b, 5, drawpix4bd, 0Fh +.nodraw + inc word [SfxR1] + FXReturn +%endmacro + +%macro plotlines2b 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 ret, drawpix2b, 4, drawpix2bd, 03h +.nodraw + inc word [SfxR1] + ret +%endmacro + +%macro plotlines2bb 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 FXReturn, drawpix2b, 4, drawpix2bd, 03h +.nodraw + inc word [SfxR1] + FXReturn +%endmacro + +%macro plotlines8b 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 ret, drawpix8b, 6, drawpix8bd, 0FFh +.nodraw + inc word [SfxR1] + ret +%endmacro + +%macro plotlines8bb 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 FXReturn, drawpix8b, 6, drawpix8bd, 0FFh +.nodraw + inc word [SfxR1] + FXReturn +%endmacro + +%macro plotlines8bl 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 ret, drawpix8b, 6, drawpix8bd, 0Fh +.nodraw + inc word [SfxR1] + ret +%endmacro + +%macro plotlines8bbl 1 + mov ebx,[SfxR2] + FETCHPIPE + mov bh,[SfxR1] + mov eax,[sfxclineloc] + inc ebp + mov eax,[eax+ebx*4] + cmp eax,0FFFFFFFFh + je near .nodraw + %1 FXReturn, drawpix8b, 6, drawpix8bd, 0Fh +.nodraw + inc word [SfxR1] + FXReturn +%endmacro + +%macro ADDRN 1 ; V + mov eax, [esi] ; Read Source + mov ebx, [SfxR0+%1*4] + FETCHPIPE + add ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro ADCRN 1 ; V + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx, [SfxR0+%1*4] + shr byte[SfxCarry],1 + adc ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro ADIRN 1 ; V + mov eax, [esi] ; Read Source + FETCHPIPE + add ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro ADCIRN 1 ; V + FETCHPIPE + mov eax, [esi] ; Read Source + shr byte[SfxCarry],1 + adc ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro SUBRN 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + FETCHPIPE + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro SBCRN 1 ; V + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + cmp byte[SfxCarry],1 + sbb ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro SUBIRN 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + sub ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro CMPRN 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + FETCHPIPE + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + mov [SfxSignZero],eax + CLRFLAGS + inc ebp ; Increase program counter + ret +%endmacro + +%macro ANDRN 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read RN + FETCHPIPE + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro BICRN 1 ; V + mov ebx,[SfxR0+%1*4] ; Read RN + mov eax,[esi] ; Read Source + xor ebx,0FFFFh + FETCHPIPE + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro ANDIRN 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,%1 + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro BICIRN 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,%1 + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro MULTRN 1 ; V + mov al,byte [esi] ; Read Source + mov bl,byte [SfxR0+%1*4] ; Read RN + FETCHPIPE + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro UMULTRN 1 ; V + mov al,byte [esi] ; Read Source + mov bl,byte [SfxR0+%1*4] ; Read RN + FETCHPIPE + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro MULTIRN 1 ; V + mov al,byte [esi] ; Read Source + mov bl,%1 ; Read RN + FETCHPIPE + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro UMULTIRN 1 ; V + mov al,byte [esi] ; Read Source + mov bl,%1 ; Read RN + FETCHPIPE + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + ret +%endmacro + +%macro LINK 1 ; Verified. + mov eax,ebp + sub eax,[SfxCPB] + add eax,%1 + FETCHPIPE + mov word [SfxR11],ax + CLRFLAGS + inc ebp + ret +%endmacro + +%macro JMPRN 1 ; V + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read RN + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + ret +%endmacro + +%macro LJMPRN 1 ; V + FETCHPIPE + mov eax,[SfxR0+%1*4] + and eax,07Fh + mov byte[SfxPBR],al +; mov byte[fxtrace+eax],1 + mov eax,[SfxMemTable+eax*4] + mov [SfxCPB],eax + mov ebp,eax + add ebp,[esi] ; Read RN + mov dword [SfxCacheActive],0 + push ecx + call FxOp02 + pop ecx + dec ebp + ret +%endmacro + +%macro IBTRN 1 ; V + movsx eax,byte[ebp] + mov cl,[ebp+1] + add ebp,2 + mov [SfxR0+%1*4],ax + CLRFLAGS + ret +%endmacro + +%macro LMSRN 1 ; Verified. + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + inc ebp + mov [SfxR0+%1*4],bx ; Write data + CLRFLAGS + ret +%endmacro + +%macro SMSRN 1 ; Verified. + xor eax,eax + mov al,[ebp] + inc ebp + add eax,eax + mov cl,[ebp] + add eax,[SfxRAMMem] + mov ebx,[SfxR0+%1*4] ; Read data + mov dword [SfxLastRamAdr],eax + inc ebp + mov [eax],bx ; Write word to ram + CLRFLAGS + ret +%endmacro + +%macro FROMRN 1 ; V + FETCHPIPE + mov esi,SfxR0+%1*4 + inc ebp ; Increase program counter + call [FxTable+ecx*4] + mov esi,SfxR0 + ret +%endmacro + +%macro ORRN 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read + FETCHPIPE + or eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro XORRN 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read + FETCHPIPE + xor eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro ORI 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + or eax,%1 + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro XORI 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + xor eax,%1 + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + ret +%endmacro + +%macro INCRN 1 ; Verified + inc word[SfxR0+%1*4] + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read Source + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + ret +%endmacro + +%macro DECRN 1 ; Verified + dec word[SfxR0+%1*4] + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read Source + mov [SfxR0+%1*4],eax + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + ret +%endmacro + +%macro IWTRN 1 ; aka LEA ; Verified. + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + add ebp,3 + mov [SfxR0+%1*4],eax + CLRFLAGS + ret +%endmacro + +%macro LMRN 1 ; Verified! + xor eax,eax + mov cl,[ebp+2] + mov ax,[ebp] + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + add ebp,3 + mov dh,[eax+ebx] + mov word [SfxR0+%1*4],dx ; Store Word + CLRFLAGS + ret +%endmacro + +%macro SMRN 1 ; Verified + mov ebx,[SfxR0+%1*4] + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + mov dx,bx + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov [eax+ebx],dl + xor eax,1 + add ebp,3 + mov [eax+ebx],dh + CLRFLAGS + ret +%endmacro + +%macro PackEsiEdi 0 + mov eax,[SfxSREG] + shl eax,2 + add eax,SfxR0 + mov esi,eax + mov eax,[SfxDREG] + shl eax,2 + add eax,SfxR0 + mov edi,eax + mov eax,[SfxRAMBR] + shl eax,16 + add eax,[sfxramdata] + mov dword [SfxRAMMem],eax +%endmacro + +%macro UnPackEsiEdi 0 + mov eax,esi + sub eax,SfxR0 + shr eax,2 + mov [SfxSREG],eax + mov eax,edi + sub eax,SfxR0 + shr eax,2 + mov [SfxDREG],eax +%endmacro diff --git a/src/i386/fxemu2b.asm b/src/i386/fxemu2b.asm new file mode 100644 index 0000000..46fca6a --- /dev/null +++ b/src/i386/fxemu2b.asm @@ -0,0 +1,617 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +%include "src/i386/macros.mac" + +EXTSYM FxTable,FxTableb,FxTablec,SfxB,SfxCPB,SfxCROM,SfxCarry,SfxOverflow +EXTSYM SfxR0,SfxR14,SfxR15,SfxRomBuffer,SfxSignZero,withr15sk + +NEWSYM FxEmu2BAsmStart + +%include "src/i386/fxemu2.mac" +%include "src/i386/fxemu2b.mac" + + + + + + +NEWSYM FxOpb05 ; BRA branch always ; Verified. + movsx eax,byte[ebp] + mov cl,[ebp+1] + inc ebp + add ebp,eax + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb06 ; BGE branch on greater or equals ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jnz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb07 ; BLT branch on lesss than ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb08 ; BNE branch on not equal ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb09 ; BEQ branch on equal (z=1) ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0A ; BPL branch on plus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0B ; BMI branch on minus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0C ; BCC branch on carry clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0D ; BCS branch on carry set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0E ; BVC branch on overflow clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb0F ; BVS branch on overflow set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTableb+ecx*4] + ret +.nojump + inc ebp + call [FxTableb+ecx*4] + ret + +NEWSYM FxOpb10 ; TO RN set register n as destination register + TORNb 0 +NEWSYM FxOpb11 ; TO RN set register n as destination register + TORNb 1 +NEWSYM FxOpb12 ; TO RN set register n as destination register + TORNb 2 +NEWSYM FxOpb13 ; TO RN set register n as destination register + TORNb 3 +NEWSYM FxOpb14 ; TO RN set register n as destination register + TORNb 4 +NEWSYM FxOpb15 ; TO RN set register n as destination register + TORNb 5 +NEWSYM FxOpb16 ; TO RN set register n as destination register + TORNb 6 +NEWSYM FxOpb17 ; TO RN set register n as destination register + TORNb 7 +NEWSYM FxOpb18 ; TO RN set register n as destination register + TORNb 8 +NEWSYM FxOpb19 ; TO RN set register n as destination register + TORNb 9 +NEWSYM FxOpb1A ; TO RN set register n as destination register + TORNb 10 +NEWSYM FxOpb1B ; TO RN set register n as destination register + TORNb 11 +NEWSYM FxOpb1C ; TO RN set register n as destination register + TORNb 12 +NEWSYM FxOpb1D ; TO RN set register n as destination register + TORNb 13 +NEWSYM FxOpb1E ; TO RN set register n as destination register + FETCHPIPE + test dword [SfxB],1 + jnz .VersionB + mov edi,SfxR0+14*4 + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov dword[withr15sk],1 + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov edi,SfxR0 + UpdateR14 + ret +.VersionB + mov eax,[esi] ; Read Source + mov dword[withr15sk],1 + mov [SfxR0+14*4],eax ; Write + CLRFLAGS + UpdateR14 + inc ebp ; Increase program counter + ret +NEWSYM FxOpb1F ; TO RN set register n as destination register + FETCHPIPE + test dword [SfxB],1 + jnz .VersionB + mov edi,SfxR0+15*4 + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov ebp,[SfxCPB] + mov dword[withr15sk],1 + add ebp,[SfxR15] + mov edi,SfxR0 + ret +.VersionB + mov eax,[esi] ; Read Source + mov ebp,[SfxCPB] + mov dword[withr15sk],1 + add ebp,eax + CLRFLAGS + ret + +NEWSYM FxOpb3D ; ALT1 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,01h + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTableb+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpb3E ; ALT2 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,02h + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTable+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpb3F ; ALT3 set alt3 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,03h + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTable+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpbB0 ; FROM rn set source register + FROMRNb 0 +NEWSYM FxOpbB1 ; FROM rn set source register + FROMRNb 1 +NEWSYM FxOpbB2 ; FROM rn set source register + FROMRNb 2 +NEWSYM FxOpbB3 ; FROM rn set source register + FROMRNb 3 +NEWSYM FxOpbB4 ; FROM rn set source register + FROMRNb 4 +NEWSYM FxOpbB5 ; FROM rn set source register + FROMRNb 5 +NEWSYM FxOpbB6 ; FROM rn set source register + FROMRNb 6 +NEWSYM FxOpbB7 ; FROM rn set source register + FROMRNb 7 +NEWSYM FxOpbB8 ; FROM rn set source register + FROMRNb 8 +NEWSYM FxOpbB9 ; FROM rn set source register + FROMRNb 9 +NEWSYM FxOpbBA ; FROM rn set source register + FROMRNb 10 +NEWSYM FxOpbBB ; FROM rn set source register + FROMRNb 11 +NEWSYM FxOpbBC ; FROM rn set source register + FROMRNb 12 +NEWSYM FxOpbBD ; FROM rn set source register + FROMRNb 13 +NEWSYM FxOpbBE ; FROM rn set source register + FROMRNb 14 +NEWSYM FxOpbBF ; FROM rn set source register + test dword [SfxB],1 + jnz .VersionB + mov esi,SfxR0+15*4 + inc ebp ; Increase program counter + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov esi,SfxR0 + ret +.VersionB + FETCHPIPE + mov eax,ebp + sub eax,[SfxCPB] + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + shr al,7 + mov byte[SfxOverflow],al + CLRFLAGS + ret + +NEWSYM FxOpc05 ; BRA branch always ; Verified. + movsx eax,byte[ebp] + mov cl,[ebp+1] + inc ebp + add ebp,eax + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc06 ; BGE branch on greater or equals ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jnz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc07 ; BLT branch on lesss than ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc08 ; BNE branch on not equal ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc09 ; BEQ branch on equal (z=1) ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0A ; BPL branch on plus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0B ; BMI branch on minus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0C ; BCC branch on carry clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0D ; BCS branch on carry set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0E ; BVC branch on overflow clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc0F ; BVS branch on overflow set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTablec+ecx*4] + ret +.nojump + inc ebp + call [FxTablec+ecx*4] + ret + +NEWSYM FxOpc10 ; TO RN set register n as destination register + TORNc 0 +NEWSYM FxOpc11 ; TO RN set register n as destination register + TORNc 1 +NEWSYM FxOpc12 ; TO RN set register n as destination register + TORNc 2 +NEWSYM FxOpc13 ; TO RN set register n as destination register + TORNc 3 +NEWSYM FxOpc14 ; TO RN set register n as destination register + TORNc 4 +NEWSYM FxOpc15 ; TO RN set register n as destination register + TORNc 5 +NEWSYM FxOpc16 ; TO RN set register n as destination register + TORNc 6 +NEWSYM FxOpc17 ; TO RN set register n as destination register + TORNc 7 +NEWSYM FxOpc18 ; TO RN set register n as destination register + TORNc 8 +NEWSYM FxOpc19 ; TO RN set register n as destination register + TORNc 9 +NEWSYM FxOpc1A ; TO RN set register n as destination register + TORNc 10 +NEWSYM FxOpc1B ; TO RN set register n as destination register + TORNc 11 +NEWSYM FxOpc1C ; TO RN set register n as destination register + TORNc 12 +NEWSYM FxOpc1D ; TO RN set register n as destination register + TORNc 13 +NEWSYM FxOpc1E ; TO RN set register n as destination register + FETCHPIPE + mov eax,[esi] ; Read Source + mov [SfxR0+14*4],eax ; Write + CLRFLAGS + UpdateR14 + inc ebp ; Increase program counter + ret +NEWSYM FxOpc1F ; TO RN set register n as destination register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebp,[SfxCPB] + mov [SfxR15],eax + add ebp,eax + CLRFLAGS + ret + +NEWSYM FxOpc3D ; ALT1 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,01h + inc ebp + call [FxTablec+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpc3E ; ALT2 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,02h + inc ebp + call [FxTablec+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpc3F ; ALT3 set alt3 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,03h + inc ebp + call [FxTablec+ecx*4] + xor ch,ch + ret + +NEWSYM FxOpcB0 ; FROM rn set source register + FROMRNc 0 +NEWSYM FxOpcB1 ; FROM rn set source register + FROMRNc 1 +NEWSYM FxOpcB2 ; FROM rn set source register + FROMRNc 2 +NEWSYM FxOpcB3 ; FROM rn set source register + FROMRNc 3 +NEWSYM FxOpcB4 ; FROM rn set source register + FROMRNc 4 +NEWSYM FxOpcB5 ; FROM rn set source register + FROMRNc 5 +NEWSYM FxOpcB6 ; FROM rn set source register + FROMRNc 6 +NEWSYM FxOpcB7 ; FROM rn set source register + FROMRNc 7 +NEWSYM FxOpcB8 ; FROM rn set source register + FROMRNc 8 +NEWSYM FxOpcB9 ; FROM rn set source register + FROMRNc 9 +NEWSYM FxOpcBA ; FROM rn set source register + FROMRNc 10 +NEWSYM FxOpcBB ; FROM rn set source register + FROMRNc 11 +NEWSYM FxOpcBC ; FROM rn set source register + FROMRNc 12 +NEWSYM FxOpcBD ; FROM rn set source register + FROMRNc 13 +NEWSYM FxOpcBE ; FROM rn set source register + FROMRNc 14 +NEWSYM FxOpcBF ; FROM rn set source register + FETCHPIPE + mov eax,ebp + sub eax,[SfxCPB] + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + shr al,7 + mov byte[SfxOverflow],al + CLRFLAGS + ret + +NEWSYM FxEmu2BAsmEnd diff --git a/src/i386/fxemu2b.mac b/src/i386/fxemu2b.mac new file mode 100644 index 0000000..758feb6 --- /dev/null +++ b/src/i386/fxemu2b.mac @@ -0,0 +1,88 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + + + + + + + + +%macro TORNb 1 ; V + FETCHPIPE + test dword [SfxB],1 + jnz .VersionB + mov edi, SfxR0+%1*4 + inc ebp ; Increase program counter + mov eax,ebp + sub eax,[SfxCPB] + mov dword[withr15sk],1 + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov edi,SfxR0 + ret +.VersionB + mov eax,[esi] ; Read Source + mov dword[withr15sk],1 + inc ebp ; Increase program counter + mov [SfxR0+%1*4],eax ; Write + CLRFLAGS + ret +%endmacro + +%macro FROMRNb 1 ; V + FETCHPIPE + test dword [SfxB],1 + jnz .VersionB + mov esi,SfxR0+%1*4 + inc ebp ; Increase program counter + call [FxTable+ecx*4] + mov esi,SfxR0 + ret +.VersionB + mov eax,[SfxR0+%1*4] ; Read + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + shr al,7 + mov byte[SfxOverflow],al + CLRFLAGS + ret +%endmacro + +%macro TORNc 1 ; V + FETCHPIPE + mov eax,[esi] ; Read Source + inc ebp ; Increase program counter + mov [SfxR0+%1*4],eax ; Write + CLRFLAGS + ret +%endmacro + + +%macro FROMRNc 1 ; V + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + shr al,7 + mov byte[SfxOverflow],al + CLRFLAGS + ret +%endmacro diff --git a/src/i386/fxemu2c.asm b/src/i386/fxemu2c.asm new file mode 100644 index 0000000..fb08e91 --- /dev/null +++ b/src/i386/fxemu2c.asm @@ -0,0 +1,2557 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +%include "src/i386/macros.mac" + +EXTSYM FXEndLoop,FlushCache,FxOp02,FxTable,FxTableb,FxTablec,FxTabled +EXTSYM NumberOfOpcodes,SfxB,SfxCBR,SfxCFGR,SfxCOLR,SfxCPB,SfxCROM +EXTSYM SfxCacheActive,SfxCarry,SfxLastRamAdr,SfxMemTable,SfxOverflow +EXTSYM SfxPBR,SfxPIPE,SfxPOR,SfxR0,SfxR1,SfxR11,SfxR12,SfxR13,SfxR14 +EXTSYM SfxR15,SfxR2,SfxR4,SfxR6,SfxR7,SfxR8,SfxRAMBR,SfxRAMMem,SfxROMBR +EXTSYM SfxRomBuffer,SfxSCBR,SfxSCMR,SfxSFR,SfxSignZero,SfxnRamBanks,flagnz +EXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc,sfxramdata +EXTSYM withr15sk,sfxclineloc,SCBRrel,ChangeOps +EXTSYM fxbit01pcal,fxbit23pcal,fxbit45pcal,fxbit67pcal +EXTSYM fxbit01,fxbit23,fxbit45,fxbit67 +EXTSYM fxxand +EXTSYM PLOTJmpa,PLOTJmpb + +NEWSYM FxEmu2CAsmStart + +%include "src/i386/fxemu2.mac" +%include "src/i386/fxemu2b.mac" +%include "src/i386/fxemu2c.mac" + + + + +SECTION .text ;ALIGN=32 + +ALIGN32 +NEWSYM FxOpd00 ; STOP stop GSU execution (and maybe generate an IRQ) ; Verified. + FETCHPIPE + mov [SfxPIPE],cl + and dword [SfxSFR],0FFFFh-32 ; Clear Go flag (set to 1 when the GSU is running) + test dword [SfxCFGR],080h ; Check if the interrupt generation is on + jnz .NoIRQ + or dword [SfxSFR],08000h ; Set IRQ Flag +.NoIRQ + CLRFLAGS + inc ebp + mov eax,[NumberOfOpcodes] + add eax,0F0000000h + add [ChangeOps],eax + mov dword [NumberOfOpcodes],1 + jmp FXEndLoop + FXReturn + +NEWSYM FxOpd01 ; NOP no operation ; Verified. + FETCHPIPE + CLRFLAGS + inc ebp ; Increase program counter + FXReturn + +NEWSYM FxOpd02 ; CACHE reintialize GSU cache + mov eax,ebp + FETCHPIPE + sub eax,[SfxCPB] + and eax,0FFF0h + cmp dword [SfxCBR],eax + je .SkipUpdate + cmp byte [SfxCacheActive],1 + je .SkipUpdate + mov dword [SfxCBR],eax + mov dword [SfxCacheActive],1 + call FlushCache +.SkipUpdate + CLRFLAGS + inc ebp ; Increase program counter + FXReturn + +NEWSYM FxOpd03 ; LSR logic shift right ; Verified. + mov eax,[esi] ; Read Source + FETCHPIPE + mov [SfxCarry],al + and byte[SfxCarry],1 + shr ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd04 ; ROL rotate left (RCL?) ; V + shr byte[SfxCarry],1 + mov eax,[esi] ; Read Source + FETCHPIPE + rcl ax,1 + rcl byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd05 ; BRA branch always ; Verified. + movsx eax,byte[ebp] + mov cl,[ebp+1] + inc ebp + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd06 ; BGE branch on greater or equals ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd07 ; BLT branch on lesss than ; Verified. + movsx eax,byte[ebp] + mov ebx,[SfxSignZero] + shr ebx,15 + inc ebp + xor bl,[SfxOverflow] + mov cl,[ebp] + test bl,01h + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd08 ; BNE branch on not equal ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd09 ; BEQ branch on equal (z=1) ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],0FFFFh + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0A ; BPL branch on plus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0B ; BMI branch on minus ; Verified. + movsx eax,byte[ebp] + inc ebp + test dword[SfxSignZero],088000h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0C ; BCC branch on carry clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0D ; BCS branch on carry set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxCarry],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0E ; BVC branch on overflow clear ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jnz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd0F ; BVS branch on overflow set ; Verified. + movsx eax,byte[ebp] + inc ebp + test byte[SfxOverflow],01h + mov cl,[ebp] + jz .nojump + add ebp,eax + call [FxTable+ecx*4] + FXReturn2 +.nojump + inc ebp + call [FxTable+ecx*4] + FXReturn2 + +NEWSYM FxOpd10 ; TO RN set register n as destination register + TORNd 0 +NEWSYM FxOpd11 ; TO RN set register n as destination register + TORNd 1 +NEWSYM FxOpd12 ; TO RN set register n as destination register + TORNd 2 +NEWSYM FxOpd13 ; TO RN set register n as destination register + TORNd 3 +NEWSYM FxOpd14 ; TO RN set register n as destination register + TORNd 4 +NEWSYM FxOpd15 ; TO RN set register n as destination register + TORNd 5 +NEWSYM FxOpd16 ; TO RN set register n as destination register + TORNd 6 +NEWSYM FxOpd17 ; TO RN set register n as destination register + TORNd 7 +NEWSYM FxOpd18 ; TO RN set register n as destination register + TORNd 8 +NEWSYM FxOpd19 ; TO RN set register n as destination register + TORNd 9 +NEWSYM FxOpd1A ; TO RN set register n as destination register + TORNd 10 +NEWSYM FxOpd1B ; TO RN set register n as destination register + TORNd 11 +NEWSYM FxOpd1C ; TO RN set register n as destination register + TORNd 12 +NEWSYM FxOpd1D ; TO RN set register n as destination register + TORNd 13 +NEWSYM FxOpd1E ; TO RN set register n as destination register + FETCHPIPE + mov edi,SfxR0+14*4 + inc ebp + call [FxTable+ecx*4] + mov edi,SfxR0 + UpdateR14 + FXReturn +NEWSYM FxOpd1F ; TO RN set register n as destination register + FETCHPIPE + mov edi,SfxR0+15*4 + inc ebp + call [FxTable+ecx*4] + mov ebp,[SfxCPB] + add ebp,[SfxR15] + mov edi,SfxR0 + FXReturn + +NEWSYM FxOpd20 ; WITH set register n as source and destination register + WITHc 0 +NEWSYM FxOpd21 ; WITH set register n as source and destination register + WITHc 1 +NEWSYM FxOpd22 ; WITH set register n as source and destination register + WITHc 2 +NEWSYM FxOpd23 ; WITH set register n as source and destination register + WITHc 3 +NEWSYM FxOpd24 ; WITH set register n as source and destination register + WITHc 4 +NEWSYM FxOpd25 ; WITH set register n as source and destination register + WITHc 5 +NEWSYM FxOpd26 ; WITH set register n as source and destination register + WITHc 6 +NEWSYM FxOpd27 ; WITH set register n as source and destination register + WITHc 7 +NEWSYM FxOpd28 ; WITH set register n as source and destination register + WITHc 8 +NEWSYM FxOpd29 ; WITH set register n as source and destination register + WITHc 9 +NEWSYM FxOpd2A ; WITH set register n as source and destination register + WITHc 10 +NEWSYM FxOpd2B ; WITH set register n as source and destination register + WITHc 11 +NEWSYM FxOpd2C ; WITH set register n as source and destination register + WITHc 12 +NEWSYM FxOpd2D ; WITH set register n as source and destination register + WITHc 13 +NEWSYM FxOpd2E ; WITH set register n as source and destination register + FETCHPIPE + mov esi,SfxR0+14*4 + mov edi,SfxR0+14*4 + mov dword [SfxB],1 + inc ebp + call [FxTablec+ecx*4] + mov dword [SfxB],0 ; Clear B Flag + mov esi,SfxR0 + mov edi,SfxR0 + UpdateR14 + FXReturn +NEWSYM FxOpd2F ; WITH set register n as source and destination register + FETCHPIPE + mov esi,SfxR0+15*4 + mov edi,SfxR0+15*4 + mov dword [SfxB],1 + inc ebp + mov eax,ebp + sub eax,[SfxCPB] + mov dword[withr15sk],0 + mov [SfxR15],eax + call [FxTableb+ecx*4] + cmp dword[withr15sk],1 + je .skip + mov ebp,[SfxCPB] + add ebp,[SfxR15] +.skip + mov dword [SfxB],0 ; Clear B Flag + mov esi,SfxR0 + mov edi,SfxR0 + FXReturn + +NEWSYM FxOpd30 ; STW RN store word + STWRNc 0 +NEWSYM FxOpd31 ; STW RN store word + STWRNc 1 +NEWSYM FxOpd32 ; STW RN store word + STWRNc 2 +NEWSYM FxOpd33 ; STW RN store word + STWRNc 3 +NEWSYM FxOpd34 ; STW RN store word + STWRNc 4 +NEWSYM FxOpd35 ; STW RN store word + STWRNc 5 +NEWSYM FxOpd36 ; STW RN store word + STWRNc 6 +NEWSYM FxOpd37 ; STW RN store word + STWRNc 7 +NEWSYM FxOpd38 ; STW RN store word + STWRNc 8 +NEWSYM FxOpd39 ; STW RN store word + STWRNc 9 +NEWSYM FxOpd3A ; STW RN store word + STWRNc 10 +NEWSYM FxOpd3B ; STW RN store word + STWRNc 11 + +NEWSYM FxOpd30A1 ; STB RN store byte + STBRNc 0 +NEWSYM FxOpd31A1 ; STB RN store byte + STBRNc 1 +NEWSYM FxOpd32A1 ; STB RN store byte + STBRNc 2 +NEWSYM FxOpd33A1 ; STB RN store byte + STBRNc 3 +NEWSYM FxOpd34A1 ; STB RN store byte + STBRNc 4 +NEWSYM FxOpd35A1 ; STB RN store byte + STBRNc 5 +NEWSYM FxOpd36A1 ; STB RN store byte + STBRNc 6 +NEWSYM FxOpd37A1 ; STB RN store byte + STBRNc 7 +NEWSYM FxOpd38A1 ; STB RN store byte + STBRNc 8 +NEWSYM FxOpd39A1 ; STB RN store byte + STBRNc 9 +NEWSYM FxOpd3AA1 ; STB RN store byte + STBRNc 10 +NEWSYM FxOpd3BA1 ; STB RN store byte + STBRNc 11 + +NEWSYM FxOpd3C ; LOOP decrement loop counter, and branch on not zero ; V + dec word [SfxR12] ; decrement loop counter + FETCHPIPE + mov eax,[SfxR12] + mov [SfxSignZero],eax + or eax,eax + jz .NoBranch + mov eax,dword [SfxR13] + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + FXReturn +.NoBranch + inc ebp + CLRFLAGS + FXReturn + +NEWSYM FxOpd3D ; ALT1 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,01h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + FXReturn + +NEWSYM FxOpd3E ; ALT2 set alt1 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,02h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + FXReturn + +NEWSYM FxOpd3F ; ALT3 set alt3 mode ; Verified. + FETCHPIPE + mov dword [SfxB],0 + or ch,03h + inc ebp + call [FxTable+ecx*4] + xor ch,ch + FXReturn + +NEWSYM FxOpd40 ; LDW RN load word from RAM + LDWRNc 0 +NEWSYM FxOpd41 ; LDW RN load word from RAM + LDWRNc 1 +NEWSYM FxOpd42 ; LDW RN load word from RAM + LDWRNc 2 +NEWSYM FxOpd43 ; LDW RN load word from RAM + LDWRNc 3 +NEWSYM FxOpd44 ; LDW RN load word from RAM + LDWRNc 4 +NEWSYM FxOpd45 ; LDW RN load word from RAM + LDWRNc 5 +NEWSYM FxOpd46 ; LDW RN load word from RAM + LDWRNc 6 +NEWSYM FxOpd47 ; LDW RN load word from RAM + LDWRNc 7 +NEWSYM FxOpd48 ; LDW RN load word from RAM + LDWRNc 8 +NEWSYM FxOpd49 ; LDW RN load word from RAM + LDWRNc 9 +NEWSYM FxOpd4A ; LDW RN load word from RAM + LDWRNc 10 +NEWSYM FxOpd4B ; LDW RN load word from RAM + LDWRNc 11 + +NEWSYM FxOpd40A1 ; LDB RN load byte from RAM + LDBRNc 0 +NEWSYM FxOpd41A1 ; LDB RN load byte from RAM + LDBRNc 1 +NEWSYM FxOpd42A1 ; LDB RN load byte from RAM + LDBRNc 2 +NEWSYM FxOpd43A1 ; LDB RN load byte from RAM + LDBRNc 3 +NEWSYM FxOpd44A1 ; LDB RN load byte from RAM + LDBRNc 4 +NEWSYM FxOpd45A1 ; LDB RN load byte from RAM + LDBRNc 5 +NEWSYM FxOpd46A1 ; LDB RN load byte from RAM + LDBRNc 6 +NEWSYM FxOpd47A1 ; LDB RN load byte from RAM + LDBRNc 7 +NEWSYM FxOpd48A1 ; LDB RN load byte from RAM + LDBRNc 8 +NEWSYM FxOpd49A1 ; LDB RN load byte from RAM + LDBRNc 9 +NEWSYM FxOpd4AA1 ; LDB RN load byte from RAM + LDBRNc 10 +NEWSYM FxOpd4BA1 ; LDB RN load byte from RAM + LDBRNc 11 + + +NEWSYM FxOpd4C1284b ; PLOT 4bit + plotlines4bb plotb +NEWSYM FxOpd4C1284bz ; PLOT 4bit, zero check + plotlines4bb plotbz +NEWSYM FxOpd4C1284bd ; PLOT 4bit, dither + plotlines4bb plotbd +NEWSYM FxOpd4C1284bzd ; PLOT 4bit, zero check + dither + plotlines4bb plotbzd + +NEWSYM FxOpd4C1282b ; PLOT 2bit + plotlines2bb plotb +NEWSYM FxOpd4C1282bz ; PLOT 2bit, zero check + plotlines2bb plotbz +NEWSYM FxOpd4C1282bd ; PLOT 2bit, dither + plotlines2bb plotbd +NEWSYM FxOpd4C1282bzd ; PLOT 2bit, zero check + dither + plotlines2bb plotbzd + +NEWSYM FxOpd4C1288b ; PLOT 8bit + plotlines8bb plotb +NEWSYM FxOpd4C1288bz ; PLOT 8bit, zero check + plotlines8bb plotbz +NEWSYM FxOpd4C1288bd ; PLOT 8bit, dither + plotlines8bb plotb +NEWSYM FxOpd4C1288bzd ; PLOT 8bit, zero check + dither + plotlines8bb plotbz + +NEWSYM FxOpd4C1288bl ; PLOT 8bit + plotlines8bbl plotb +NEWSYM FxOpd4C1288bzl ; PLOT 8bit, zero check + plotlines8bbl plotbz +NEWSYM FxOpd4C1288bdl ; PLOT 8bit, dither + plotlines8bbl plotb +NEWSYM FxOpd4C1288bzdl ; PLOT 8bit, zero check + dither + plotlines8bbl plotbz + +NEWSYM FxOpd4C ; PLOT plot pixel with R1,R2 as x,y and the color register as the color + jmp FxOpd4C1284b + + FETCHPIPE + inc ebp + CLRFLAGS + mov ebx,[SfxR2] + mov bh,[SfxR1] + mov eax,[sfxclineloc] + mov ebx,[eax+ebx*4] + cmp ebx,0FFFFFFFFh + je near .nodraw + xor eax,eax + ; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj + ; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color + ; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles + ; 16+8(4/3) 16+4(4/2) 16(4/0) + push ecx + mov al,[SfxSCMR] + and al,00000011b ; 4 + 32 + cmp al,0 + je near .colors4 + cmp al,3 + je near .colors256 + + shl ebx,5 ; x32 (16 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_16 + test byte[SfxCOLR],0Fh + jz .nodraw +.nozerocheck_16 + mov dl,[SfxCOLR] + test byte[SfxPOR],02h + jz .nodither4b + mov dh,[SfxR1] + xor dh,[SfxR2] + test dh,01h + jz .nodither4b + shr dh,4 +.nodither4b + and byte[eax],bh + and byte[eax+1],bh + and byte[eax+16],bh + and byte[eax+17],bh + test dl,01h + jz .nodraw_16 + or byte[eax], bl +.nodraw_16 + test dl,02h + jz .nodraw2_16 + or byte[eax+1], bl +.nodraw2_16 + test dl,04h + jz .nodraw3_16 + or byte[eax+16],bl +.nodraw3_16 + test dl,08h + jz .nodraw4_16 + or byte[eax+17],bl +.nodraw4_16 +.nodraw + inc word [SfxR1] + FXReturn + +.colors4 + shl ebx,4 ; x16 (4 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_4 + test byte[SfxCOLR],03h + jz .noplot_4 +.nozerocheck_4 + mov dl,[SfxCOLR] + test byte[SfxPOR],02h + jz .nodither2b + mov dh,[SfxR1] + xor dh,[SfxR2] + test dh,01h + jz .nodither2b + shr dh,4 +.nodither2b + and byte[eax],bh + and byte[eax+1],bh + test dl,01h + jz .nodraw_4 + or byte[eax], bl +.nodraw_4 + test dl,02h + jz .nodraw2_4 + or byte[eax+1], bl +.nodraw2_4 +.noplot_4 + inc word [SfxR1] + FXReturn + +.colors256 + shl ebx,6 ; x64 (256 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + test byte[SfxPOR],01h + jnz .nozerocheck_256 + mov dl,0FFh + test byte[SfxPOR],08h + jz .nozerocheckb_256 + mov dl,0Fh +.nozerocheckb_256 + test byte[SfxCOLR],dl + jz .noplot_256 +.nozerocheck_256 + mov dl,[SfxCOLR] + and byte[eax],bh + and byte[eax+1],bh + and byte[eax+16],bh + and byte[eax+17],bh + and byte[eax+32],bh + and byte[eax+33],bh + and byte[eax+48],bh + and byte[eax+49],bh + test dl,01h + jz .nodraw_256 + or byte[eax], bl +.nodraw_256 + test dl,02h + jz .nodraw2_256 + or byte[eax+1], bl +.nodraw2_256 + test dl,04h + jz .nodraw3_256 + or byte[eax+16],bl +.nodraw3_256 + test dl,08h + jz .nodraw4_256 + or byte[eax+17],bl +.nodraw4_256 + test dl,10h + jz .nodraw5_256 + or byte[eax+32], bl +.nodraw5_256 + test dl,20h + jz .nodraw6_256 + or byte[eax+33], bl +.nodraw6_256 + test dl,40h + jz .nodraw7_256 + or byte[eax+48],bl +.nodraw7_256 + test dl,80h + jz .nodraw8_256 + or byte[eax+49],bl +.nodraw8_256 +.noplot_256 + inc word [SfxR1] + FXReturn + +SECTION .bss +.prevx resw 1 +.prevy resw 1 + +SECTION .text + +NEWSYM FxOpd4CA1 ; RPIX read color of the pixel with R1,R2 as x,y + FETCHPIPE + mov ebx,[SfxR2] + mov bh,[SfxR1] + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov ebx,[eax+ebx*4] + cmp ebx,0FFFFFFFFh + je near .nodraw + xor eax,eax + ; bits 5/2 : 00 = 128 pixels, 01 = 160 pixels, 10 = 192 pixels, 11 = obj + ; bits 1/0 : 00 = 4 color, 01 = 16-color, 10 = not used, 11 = 256 color + ; 192 pixels = 24 tiles, 160 pixels = 20 tiles, 128 pixels = 16 tiles + ; 16+8(4/3) 16+4(4/2) 16(4/0) + push ecx + mov al,[SfxSCMR] + and al,00000011b ; 4 + 32 + + cmp al,0 + je near .colors4 + cmp al,3 + je near .colors256 + + shl ebx,5 ; x32 (16 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_16 + or bh,01h +.nodraw_16 + test byte[eax+1],bl + jz .nodraw2_16 + or bh,02h +.nodraw2_16 + test byte[eax+16],bl + jz .nodraw3_16 + or bh,04h +.nodraw3_16 + test byte[eax+17],bl + jz .nodraw4_16 + or bh,08h +.nodraw4_16 +.nodraw + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + FXReturn + +.colors4 + shl ebx,4 ; x16 (4 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_4 + or bh,01h +.nodraw_4 + test byte[eax+1],bl + jz .nodraw2_4 + or bh,02h +.nodraw2_4 + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + FXReturn + +.colors256 + shl ebx,6 ; x64 (256 colors) + mov al,[SfxSCBR] + shl eax,10 ; Get SFX address + add eax,ebx + add eax,[sfxramdata] + mov ebx,[SfxR2] + and ebx,07h + shl ebx,1 + add eax,ebx + mov cl,[SfxR1] + and cl,07h + xor cl,07h + mov bl,1 + shl bl,cl + mov bh,bl + xor bh,0FFh + pop ecx + xor bh,bh + test byte[eax],bl + jz .nodraw_256 + or bh,01h +.nodraw_256 + test byte[eax+1],bl + jz .nodraw2_256 + or bh,02h +.nodraw2_256 + test byte[eax+16],bl + jz .nodraw3_256 + or bh,04h +.nodraw3_256 + test byte[eax+17],bl + jz .nodraw4_256 + or bh,08h +.nodraw4_256 + test byte[eax+32],bl + jz .nodraw5_256 + or bh,10h +.nodraw5_256 + test byte[eax+33],bl + jz .nodraw6_256 + or bh,20h +.nodraw6_256 + test byte[eax+48],bl + jz .nodraw7_256 + or bh,40h +.nodraw7_256 + test byte[eax+49],bl + jz .nodraw8_256 + or bh,80h +.nodraw8_256 + mov bl,bh + and ebx,0FFh + inc ebp +; UpdateR14 + CLRFLAGS + mov [edi],ebx ; Write Destination + mov [flagnz],ebx + FXReturn + +NEWSYM FxOpd4D ; SWAP swap upper and lower byte of a register ; V + mov eax,[esi] ; Read Source + FETCHPIPE + ror ax,8 + inc ebp ; Increase program counter + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd4E ; COLOR copy source register to color register ; V + FETCHPIPE + mov eax,[esi] ; Read Source + ; if bit 3 of SfxPOR is set, then don't modify the upper 4 bits + test byte[SfxPOR],04h + jz .nohighnibble + mov bl,al + shr bl,4 + and al,0F0h + or al,bl +.nohighnibble + test byte[SfxPOR],08h + jnz .preserveupper + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx +.nocolchange + CLRFLAGS + inc ebp ; Increase program counter + FXReturn +.preserveupper + mov bl,[SfxCOLR] + and al,0Fh + and bl,0F0h + or al,bl + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx + CLRFLAGS + inc ebp ; Increase program counter + FXReturn + +NEWSYM FxOpd4EA1 ; CMODE set plot option register ; V + FETCHPIPE + mov eax,[esi] ; Read Source + inc ebp ; Increase program counter + mov dword [SfxPOR],eax + + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov [sfxclineloc],eax + + + push ebx + mov al,[SfxSCMR] + and eax,00000011b + mov bl,[SfxPOR] + and bl,0Fh + shl bl,2 + or al,bl + mov ebx,[PLOTJmpb+eax*4] + mov eax,[PLOTJmpa+eax*4] + + mov dword [FxTable+4Ch*4],eax + mov dword [FxTableb+4Ch*4],eax + mov dword [FxTablec+4Ch*4],eax + mov dword [FxTabled+4Ch*4],ebx + pop ebx + + CLRFLAGS + FXReturn + +NEWSYM FxOpd4F ; NOT perform exclusive exor with 1 on all bits ; V + mov eax,[esi] ; Read Source + FETCHPIPE + xor eax,0FFFFh + inc ebp ; Increase program counter + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd50 ; ADD RN add, register + register + ADDRNc 0 +NEWSYM FxOpd51 ; ADD RN add, register + register + ADDRNc 1 +NEWSYM FxOpd52 ; ADD RN add, register + register + ADDRNc 2 +NEWSYM FxOpd53 ; ADD RN add, register + register + ADDRNc 3 +NEWSYM FxOpd54 ; ADD RN add, register + register + ADDRNc 4 +NEWSYM FxOpd55 ; ADD RN add, register + register + ADDRNc 5 +NEWSYM FxOpd56 ; ADD RN add, register + register + ADDRNc 6 +NEWSYM FxOpd57 ; ADD RN add, register + register + ADDRNc 7 +NEWSYM FxOpd58 ; ADD RN add, register + register + ADDRNc 8 +NEWSYM FxOpd59 ; ADD RN add, register + register + ADDRNc 9 +NEWSYM FxOpd5A ; ADD RN add, register + register + ADDRNc 10 +NEWSYM FxOpd5B ; ADD RN add, register + register + ADDRNc 11 +NEWSYM FxOpd5C ; ADD RN add, register + register + ADDRNc 12 +NEWSYM FxOpd5D ; ADD RN add, register + register + ADDRNc 13 +NEWSYM FxOpd5E ; ADD RN add, register + register + ADDRNc 14 +NEWSYM FxOpd5F ; ADD RN add, register + register + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + add ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd50A1 ; ADC RN add with carry, register + register + ADCRNc 0 +NEWSYM FxOpd51A1 ; ADC RN add with carry, register + register + ADCRNc 1 +NEWSYM FxOpd52A1 ; ADC RN add with carry, register + register + ADCRNc 2 +NEWSYM FxOpd53A1 ; ADC RN add with carry, register + register + ADCRNc 3 +NEWSYM FxOpd54A1 ; ADC RN add with carry, register + register + ADCRNc 4 +NEWSYM FxOpd55A1 ; ADC RN add with carry, register + register + ADCRNc 5 +NEWSYM FxOpd56A1 ; ADC RN add with carry, register + register + ADCRNc 6 +NEWSYM FxOpd57A1 ; ADC RN add with carry, register + register + ADCRNc 7 +NEWSYM FxOpd58A1 ; ADC RN add with carry, register + register + ADCRNc 8 +NEWSYM FxOpd59A1 ; ADC RN add with carry, register + register + ADCRNc 9 +NEWSYM FxOpd5AA1 ; ADC RN add with carry, register + register + ADCRNc 10 +NEWSYM FxOpd5BA1 ; ADC RN add with carry, register + register + ADCRNc 11 +NEWSYM FxOpd5CA1 ; ADC RN add with carry, register + register + ADCRNc 12 +NEWSYM FxOpd5DA1 ; ADC RN add with carry, register + register + ADCRNc 13 +NEWSYM FxOpd5EA1 ; ADC RN add with carry, register + register + ADCRNc 14 +NEWSYM FxOpd5FA1 ; ADC RN add with carry, register + register + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + shr byte[SfxCarry],1 + adc ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +; Weird Opdode (FxOpd50A2, add 0, wow!) +NEWSYM FxOpd50A2 ; ADI RN add, register + immediate + ADIRNc 0 +NEWSYM FxOpd51A2 ; ADI RN add, register + immediate + ADIRNc 1 +NEWSYM FxOpd52A2 ; ADI RN add, register + immediate + ADIRNc 2 +NEWSYM FxOpd53A2 ; ADI RN add, register + immediate + ADIRNc 3 +NEWSYM FxOpd54A2 ; ADI RN add, register + immediate + ADIRNc 4 +NEWSYM FxOpd55A2 ; ADI RN add, register + immediate + ADIRNc 5 +NEWSYM FxOpd56A2 ; ADI RN add, register + immediate + ADIRNc 6 +NEWSYM FxOpd57A2 ; ADI RN add, register + immediate + ADIRNc 7 +NEWSYM FxOpd58A2 ; ADI RN add, register + immediate + ADIRNc 8 +NEWSYM FxOpd59A2 ; ADI RN add, register + immediate + ADIRNc 9 +NEWSYM FxOpd5AA2 ; ADI RN add, register + immediate + ADIRNc 10 +NEWSYM FxOpd5BA2 ; ADI RN add, register + immediate + ADIRNc 11 +NEWSYM FxOpd5CA2 ; ADI RN add, register + immediate + ADIRNc 12 +NEWSYM FxOpd5DA2 ; ADI RN add, register + immediate + ADIRNc 13 +NEWSYM FxOpd5EA2 ; ADI RN add, register + immediate + ADIRNc 14 +NEWSYM FxOpd5FA2 ; ADI RN add, register + immediate + ADIRNc 15 + +; Another very useful Opdode +NEWSYM FxOpd50A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 0 +NEWSYM FxOpd51A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 1 +NEWSYM FxOpd52A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 2 +NEWSYM FxOpd53A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 3 +NEWSYM FxOpd54A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 4 +NEWSYM FxOpd55A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 5 +NEWSYM FxOpd56A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 6 +NEWSYM FxOpd57A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 7 +NEWSYM FxOpd58A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 8 +NEWSYM FxOpd59A3 ; ADCIRN add with carry, register + immediate + ADCIRNc 9 +NEWSYM FxOpd5AA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 10 +NEWSYM FxOpd5BA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 11 +NEWSYM FxOpd5CA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 12 +NEWSYM FxOpd5DA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 13 +NEWSYM FxOpd5EA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 14 +NEWSYM FxOpd5FA3 ; ADCIRN add with carry, register + immediate + ADCIRNc 15 + +NEWSYM FxOpd60 ; SUBRN subtract, register - register + SUBRNc 0 +NEWSYM FxOpd61 ; SUBRN subtract, register - register + SUBRNc 1 +NEWSYM FxOpd62 ; SUBRN subtract, register - register + SUBRNc 2 +NEWSYM FxOpd63 ; SUBRN subtract, register - register + SUBRNc 3 +NEWSYM FxOpd64 ; SUBRN subtract, register - register + SUBRNc 4 +NEWSYM FxOpd65 ; SUBRN subtract, register - register + SUBRNc 5 +NEWSYM FxOpd66 ; SUBRN subtract, register - register + SUBRNc 6 +NEWSYM FxOpd67 ; SUBRN subtract, register - register + SUBRNc 7 +NEWSYM FxOpd68 ; SUBRN subtract, register - register + SUBRNc 8 +NEWSYM FxOpd69 ; SUBRN subtract, register - register + SUBRNc 9 +NEWSYM FxOpd6A ; SUBRN subtract, register - register + SUBRNc 10 +NEWSYM FxOpd6B ; SUBRN subtract, register - register + SUBRNc 11 +NEWSYM FxOpd6C ; SUBRN subtract, register - register + SUBRNc 12 +NEWSYM FxOpd6D ; SUBRN subtract, register - register + SUBRNc 13 +NEWSYM FxOpd6E ; SUBRN subtract, register - register + SUBRNc 14 +NEWSYM FxOpd6F ; SUBRN subtract, register - register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd60A1 ; SBCRN subtract with carry, register - register + SBCRNc 0 +NEWSYM FxOpd61A1 ; SBCRN subtract with carry, register - register + SBCRNc 1 +NEWSYM FxOpd62A1 ; SBCRN subtract with carry, register - register + SBCRNc 2 +NEWSYM FxOpd63A1 ; SBCRN subtract with carry, register - register + SBCRNc 3 +NEWSYM FxOpd64A1 ; SBCRN subtract with carry, register - register + SBCRNc 4 +NEWSYM FxOpd65A1 ; SBCRN subtract with carry, register - register + SBCRNc 5 +NEWSYM FxOpd66A1 ; SBCRN subtract with carry, register - register + SBCRNc 6 +NEWSYM FxOpd67A1 ; SBCRN subtract with carry, register - register + SBCRNc 7 +NEWSYM FxOpd68A1 ; SBCRN subtract with carry, register - register + SBCRNc 8 +NEWSYM FxOpd69A1 ; SBCRN subtract with carry, register - register + SBCRNc 9 +NEWSYM FxOpd6AA1 ; SBCRN subtract with carry, register - register + SBCRNc 10 +NEWSYM FxOpd6BA1 ; SBCRN subtract with carry, register - register + SBCRNc 11 +NEWSYM FxOpd6CA1 ; SBCRN subtract with carry, register - register + SBCRNc 12 +NEWSYM FxOpd6DA1 ; SBCRN subtract with carry, register - register + SBCRNc 13 +NEWSYM FxOpd6EA1 ; SBCRN subtract with carry, register - register + SBCRNc 14 +NEWSYM FxOpd6FA1 ; SBCRN subtract with carry, register - register + mov eax,[esi] ; Read Source + mov ebx,ebp + FETCHPIPE + sub ebx,[SfxCPB] + cmp byte[SfxCarry],1 + sbb ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd60A2 ; SUBIRN subtract, register - immediate + SUBIRNc 0 +NEWSYM FxOpd61A2 ; SUBIRN subtract, register - immediate + SUBIRNc 1 +NEWSYM FxOpd62A2 ; SUBIRN subtract, register - immediate + SUBIRNc 2 +NEWSYM FxOpd63A2 ; SUBIRN subtract, register - immediate + SUBIRNc 3 +NEWSYM FxOpd64A2 ; SUBIRN subtract, register - immediate + SUBIRNc 4 +NEWSYM FxOpd65A2 ; SUBIRN subtract, register - immediate + SUBIRNc 5 +NEWSYM FxOpd66A2 ; SUBIRN subtract, register - immediate + SUBIRNc 6 +NEWSYM FxOpd67A2 ; SUBIRN subtract, register - immediate + SUBIRNc 7 +NEWSYM FxOpd68A2 ; SUBIRN subtract, register - immediate + SUBIRNc 8 +NEWSYM FxOpd69A2 ; SUBIRN subtract, register - immediate + SUBIRNc 9 +NEWSYM FxOpd6AA2 ; SUBIRN subtract, register - immediate + SUBIRNc 10 +NEWSYM FxOpd6BA2 ; SUBIRN subtract, register - immediate + SUBIRNc 11 +NEWSYM FxOpd6CA2 ; SUBIRN subtract, register - immediate + SUBIRNc 12 +NEWSYM FxOpd6DA2 ; SUBIRN subtract, register - immediate + SUBIRNc 13 +NEWSYM FxOpd6EA2 ; SUBIRN subtract, register - immediate + SUBIRNc 14 +NEWSYM FxOpd6FA2 ; SUBIRN subtract, register - immediate + SUBIRNc 15 + +NEWSYM FxOpd60A3 ; CMPRN compare, register, register + CMPRNc 0 +NEWSYM FxOpd61A3 ; CMPRN compare, register, register + CMPRNc 1 +NEWSYM FxOpd62A3 ; CMPRN compare, register, register + CMPRNc 2 +NEWSYM FxOpd63A3 ; CMPRN compare, register, register + CMPRNc 3 +NEWSYM FxOpd64A3 ; CMPRN compare, register, register + CMPRNc 4 +NEWSYM FxOpd65A3 ; CMPRN compare, register, register + CMPRNc 5 +NEWSYM FxOpd66A3 ; CMPRN compare, register, register + CMPRNc 6 +NEWSYM FxOpd67A3 ; CMPRN compare, register, register + CMPRNc 7 +NEWSYM FxOpd68A3 ; CMPRN compare, register, register + CMPRNc 8 +NEWSYM FxOpd69A3 ; CMPRN compare, register, register + CMPRNc 9 +NEWSYM FxOpd6AA3 ; CMPRN compare, register, register + CMPRNc 10 +NEWSYM FxOpd6BA3 ; CMPRN compare, register, register + CMPRNc 11 +NEWSYM FxOpd6CA3 ; CMPRN compare, register, register + CMPRNc 12 +NEWSYM FxOpd6DA3 ; CMPRN compare, register, register + CMPRNc 13 +NEWSYM FxOpd6EA3 ; CMPRN compare, register, register + CMPRNc 14 +NEWSYM FxOpd6FA3 ; CMPRN compare, register, register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + mov [SfxSignZero],eax + CLRFLAGS + inc ebp ; Increase program counter + FXReturn + +NEWSYM FxOpd70 ; MERGE R7 as upper byte, R8 as lower byte (used for texture-mapping) */ + ; V + xor eax,eax + FETCHPIPE + mov ah,byte [SfxR7+1] + mov al,byte [SfxR8+1] + inc ebp + mov [edi],eax ; Write Destination + mov dword[SfxSignZero],0001h + test eax,0F0F0h + jz .nozero + mov dword[SfxSignZero],0000h +.nozero + test eax,08080h + jz .nosign + or dword [SfxSignZero],80000h +.nosign + mov dword [SfxOverflow],1 + test ax,0c0c0h + jnz .Overflow + mov dword [SfxOverflow],0 +.Overflow + mov dword [SfxCarry],1 + test ax,0e0e0h + jnz .Carry + mov dword [SfxCarry],0 +.Carry + CLRFLAGS + FXReturn + +NEWSYM FxOpd71 ; AND RN register & register + ANDRNc 1 +NEWSYM FxOpd72 ; AND RN register & register + ANDRNc 2 +NEWSYM FxOpd73 ; AND RN register & register + ANDRNc 3 +NEWSYM FxOpd74 ; AND RN register & register + ANDRNc 4 +NEWSYM FxOpd75 ; AND RN register & register + ANDRNc 5 +NEWSYM FxOpd76 ; AND RN register & register + ANDRNc 6 +NEWSYM FxOpd77 ; AND RN register & register + ANDRNc 7 +NEWSYM FxOpd78 ; AND RN register & register + ANDRNc 8 +NEWSYM FxOpd79 ; AND RN register & register + ANDRNc 9 +NEWSYM FxOpd7A ; AND RN register & register + ANDRNc 10 +NEWSYM FxOpd7B ; AND RN register & register + ANDRNc 11 +NEWSYM FxOpd7C ; AND RN register & register + ANDRNc 12 +NEWSYM FxOpd7D ; AND RN register & register + ANDRNc 13 +NEWSYM FxOpd7E ; AND RN register & register + ANDRNc 14 +NEWSYM FxOpd7F ; AND RN register & register + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd71A1 ; BIC RN register & ~register + BICRNc 1 +NEWSYM FxOpd72A1 ; BIC RN register & ~register + BICRNc 2 +NEWSYM FxOpd73A1 ; BIC RN register & ~register + BICRNc 3 +NEWSYM FxOpd74A1 ; BIC RN register & ~register + BICRNc 4 +NEWSYM FxOpd75A1 ; BIC RN register & ~register + BICRNc 5 +NEWSYM FxOpd76A1 ; BIC RN register & ~register + BICRNc 6 +NEWSYM FxOpd77A1 ; BIC RN register & ~register + BICRNc 7 +NEWSYM FxOpd78A1 ; BIC RN register & ~register + BICRNc 8 +NEWSYM FxOpd79A1 ; BIC RN register & ~register + BICRNc 9 +NEWSYM FxOpd7AA1 ; BIC RN register & ~register + BICRNc 10 +NEWSYM FxOpd7BA1 ; BIC RN register & ~register + BICRNc 11 +NEWSYM FxOpd7CA1 ; BIC RN register & ~register + BICRNc 12 +NEWSYM FxOpd7DA1 ; BIC RN register & ~register + BICRNc 13 +NEWSYM FxOpd7EA1 ; BIC RN register & ~register + BICRNc 14 +NEWSYM FxOpd7FA1 ; BIC RN register & ~register + FETCHPIPE + mov ebx,ebp + sub ebx,[SfxCPB] + mov eax,[esi] ; Read Source + xor ebx,0FFFFh + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd71A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 1 +NEWSYM FxOpd72A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 2 +NEWSYM FxOpd73A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 3 +NEWSYM FxOpd74A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 4 +NEWSYM FxOpd75A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 5 +NEWSYM FxOpd76A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 6 +NEWSYM FxOpd77A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 7 +NEWSYM FxOpd78A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 8 +NEWSYM FxOpd79A2 ; ANDIRNc and #n - register & immediate + ANDIRNc 9 +NEWSYM FxOpd7AA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 10 +NEWSYM FxOpd7BA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 11 +NEWSYM FxOpd7CA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 12 +NEWSYM FxOpd7DA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 13 +NEWSYM FxOpd7EA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 14 +NEWSYM FxOpd7FA2 ; ANDIRNc and #n - register & immediate + ANDIRNc 15 + +NEWSYM FxOpd71A3 ; BICIRNc register & ~immediate + BICIRNc 1 ^ 0FFFFh +NEWSYM FxOpd72A3 ; BICIRNc register & ~immediate + BICIRNc 2 ^ 0FFFFh +NEWSYM FxOpd73A3 ; BICIRNc register & ~immediate + BICIRNc 3 ^ 0FFFFh +NEWSYM FxOpd74A3 ; BICIRNc register & ~immediate + BICIRNc 4 ^ 0FFFFh +NEWSYM FxOpd75A3 ; BICIRNc register & ~immediate + BICIRNc 5 ^ 0FFFFh +NEWSYM FxOpd76A3 ; BICIRNc register & ~immediate + BICIRNc 6 ^ 0FFFFh +NEWSYM FxOpd77A3 ; BICIRNc register & ~immediate + BICIRNc 7 ^ 0FFFFh +NEWSYM FxOpd78A3 ; BICIRNc register & ~immediate + BICIRNc 8 ^ 0FFFFh +NEWSYM FxOpd79A3 ; BICIRNc register & ~immediate + BICIRNc 9 ^ 0FFFFh +NEWSYM FxOpd7AA3 ; BICIRNc register & ~immediate + BICIRNc 10 ^ 0FFFFh +NEWSYM FxOpd7BA3 ; BICIRNc register & ~immediate + BICIRNc 11 ^ 0FFFFh +NEWSYM FxOpd7CA3 ; BICIRNc register & ~immediate + BICIRNc 12 ^ 0FFFFh +NEWSYM FxOpd7DA3 ; BICIRNc register & ~immediate + BICIRNc 13 ^ 0FFFFh +NEWSYM FxOpd7EA3 ; BICIRNc register & ~immediate + BICIRNc 14 ^ 0FFFFh +NEWSYM FxOpd7FA3 ; BICIRNc register & ~immediate + BICIRNc 15 ^ 0FFFFh + +NEWSYM FxOpd80 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 0 +NEWSYM FxOpd81 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 1 +NEWSYM FxOpd82 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 2 +NEWSYM FxOpd83 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 3 +NEWSYM FxOpd84 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 4 +NEWSYM FxOpd85 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 5 +NEWSYM FxOpd86 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 6 +NEWSYM FxOpd87 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 7 +NEWSYM FxOpd88 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 8 +NEWSYM FxOpd89 ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 9 +NEWSYM FxOpd8A ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 10 +NEWSYM FxOpd8B ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 11 +NEWSYM FxOpd8C ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 12 +NEWSYM FxOpd8D ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 13 +NEWSYM FxOpd8E ; MULTRNc 8 bit to 16 bit signed multiply, register * register + MULTRNc 14 +NEWSYM FxOpd8F ; MULTRNc 8 bit to 16 bit signed multiply, register * register + FETCHPIPE + mov ebx,ebp + mov al,byte [esi] ; Read Source + sub ebx,[SfxCPB] + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd80A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 0 +NEWSYM FxOpd81A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 1 +NEWSYM FxOpd82A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 2 +NEWSYM FxOpd83A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 3 +NEWSYM FxOpd84A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 4 +NEWSYM FxOpd85A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 5 +NEWSYM FxOpd86A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 6 +NEWSYM FxOpd87A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 7 +NEWSYM FxOpd88A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 8 +NEWSYM FxOpd89A1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 9 +NEWSYM FxOpd8AA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 10 +NEWSYM FxOpd8BA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 11 +NEWSYM FxOpd8CA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 12 +NEWSYM FxOpd8DA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 13 +NEWSYM FxOpd8EA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + UMULTRNc 14 +NEWSYM FxOpd8FA1 ; UMULRN 8 bit to 16 bit unsigned multiply, register * register + FETCHPIPE + mov ebx,ebp + mov al,byte [esi] ; Read Source + sub ebx,[SfxCPB] + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn + +NEWSYM FxOpd80A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 0 +NEWSYM FxOpd81A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 1 +NEWSYM FxOpd82A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 2 +NEWSYM FxOpd83A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 3 +NEWSYM FxOpd84A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 4 +NEWSYM FxOpd85A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 5 +NEWSYM FxOpd86A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 6 +NEWSYM FxOpd87A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 7 +NEWSYM FxOpd88A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 8 +NEWSYM FxOpd89A2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 9 +NEWSYM FxOpd8AA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 10 +NEWSYM FxOpd8BA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 11 +NEWSYM FxOpd8CA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 12 +NEWSYM FxOpd8DA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 13 +NEWSYM FxOpd8EA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 14 +NEWSYM FxOpd8FA2 ; MULIRN 8 bit to 16 bit signed multiply, register * immediate + MULTIRNc 15 + +NEWSYM FxOpd80A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 0 +NEWSYM FxOpd81A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 1 +NEWSYM FxOpd82A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 2 +NEWSYM FxOpd83A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 3 +NEWSYM FxOpd84A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 4 +NEWSYM FxOpd85A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 5 +NEWSYM FxOpd86A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 6 +NEWSYM FxOpd87A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 7 +NEWSYM FxOpd88A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 8 +NEWSYM FxOpd89A3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 9 +NEWSYM FxOpd8AA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 10 +NEWSYM FxOpd8BA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 11 +NEWSYM FxOpd8CA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 12 +NEWSYM FxOpd8DA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 13 +NEWSYM FxOpd8EA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 14 +NEWSYM FxOpd8FA3 ;UMULIRN 8 bit to 16 bit unsigned multiply, register * immediate + UMULTIRNc 15 + +NEWSYM FxOpd90 ; SBK store word to last accessed RAM address ; V + mov ebx,[SfxLastRamAdr] ; Load last ram address + mov eax,[esi] ; Read Source + FETCHPIPE + mov [ebx],al ; Store Word + sub ebx,[SfxRAMMem] + xor ebx,1 + add ebx,[SfxRAMMem] + inc ebp ; Increase program counter + mov [ebx],ah ; Store Word + CLRFLAGS + FXReturn + +NEWSYM FxOpd91 ; LINKc#n R11 = R15 + immediate + LINKc 1 +NEWSYM FxOpd92 ; LINKc#n R11 = R15 + immediate + LINKc 2 +NEWSYM FxOpd93 ; LINKc#n R11 = R15 + immediate + LINKc 3 +NEWSYM FxOpd94 ; LINKc#n R11 = R15 + immediate + LINKc 4 + +NEWSYM FxOpd95 ; SEX sign extend 8 bit to 16 bit ; V + movsx eax, byte [esi] ; Read Source + FETCHPIPE + and eax,0FFFFh + inc ebp + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd96 ; ASR aritmethic shift right by one ; V + mov eax,[esi] ; Read Source + FETCHPIPE + mov [SfxCarry],al + and byte[SfxCarry],1 + sar ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd96A1 ; DIV2 aritmethic shift right by one ; V + mov eax,[esi] ; Read Source + FETCHPIPE + cmp ax,-1 + je .minusone + mov [SfxCarry],al + and byte[SfxCarry],1 + sar ax,1 ; logic shift right + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + FXReturn +.minusone + mov byte[SfxCarry],1 + xor eax,eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov dword [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd97 ; ROR rotate right by one ; V + FETCHPIPE + mov eax,[esi] ; Read Source + shr byte[SfxCarry],1 + rcr ax,1 + setc byte[SfxCarry] + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd98 ; JMPRNc jump to address of register + JMPRNc 8 +NEWSYM FxOpd99 ; JMPRNc jump to address of register + JMPRNc 9 +NEWSYM FxOpd9A ; JMPRNc jump to address of register + JMPRNc 10 +NEWSYM FxOpd9B ; JMPRNc jump to address of register + JMPRNc 11 +NEWSYM FxOpd9C ; JMPRNc jump to address of register + JMPRNc 12 +NEWSYM FxOpd9D ; JMPRNc jump to address of register + JMPRNc 13 + +NEWSYM FxOpd98A1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 8 +NEWSYM FxOpd99A1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 9 +NEWSYM FxOpd9AA1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 10 +NEWSYM FxOpd9BA1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 11 +NEWSYM FxOpd9CA1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 12 +NEWSYM FxOpd9DA1 ; LJMPRNc set program bank to source register and jump to address of register + LJMPRNc 13 + +NEWSYM FxOpd9E ; LOB set upper byte to zero (keep low byte) ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,0FFh + inc ebp + mov [edi],eax ; Write Destination + shl eax,8 + mov dword [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpd9F ; FMULT 16 bit to 32 bit signed multiplication, upper 16 bits only + ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR6] + FETCHPIPE + imul bx + inc ebp + and edx,0FFFFh + mov [SfxSignZero],edx + mov [edi],edx ; Write Destination + shr ax,15 + mov [SfxCarry],al + CLRFLAGS + FXReturn + +NEWSYM FxOpd9FA1 ; LMULT 16 bit to 32 bit signed multiplication ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR6] + FETCHPIPE + imul bx + and edx,0FFFFh + inc ebp + mov [edi],edx ; Write Destination + mov [SfxR4],ax + mov [SfxSignZero],edx + shr ax,15 + mov [SfxCarry],al + CLRFLAGS + FXReturn + +NEWSYM FxOpdA0 ; IBTRNc,#PP immediate byte transfer + IBTRNc 0 +NEWSYM FxOpdA1 ; IBTRNc,#PP immediate byte transfer + IBTRNc 1 +NEWSYM FxOpdA2 ; IBTRNc,#PP immediate byte transfer + IBTRNc 2 +NEWSYM FxOpdA3 ; IBTRNc,#PP immediate byte transfer + IBTRNc 3 +NEWSYM FxOpdA4 ; IBTRNc,#PP immediate byte transfer + IBTRNc 4 +NEWSYM FxOpdA5 ; IBTRNc,#PP immediate byte transfer + IBTRNc 5 +NEWSYM FxOpdA6 ; IBTRNc,#PP immediate byte transfer + IBTRNc 6 +NEWSYM FxOpdA7 ; IBTRNc,#PP immediate byte transfer + IBTRNc 7 +NEWSYM FxOpdA8 ; IBTRNc,#PP immediate byte transfer + IBTRNc 8 +NEWSYM FxOpdA9 ; IBTRNc,#PP immediate byte transfer + IBTRNc 9 +NEWSYM FxOpdAA ; IBTRNc,#PP immediate byte transfer + IBTRNc 10 +NEWSYM FxOpdAB ; IBTRNc,#PP immediate byte transfer + IBTRNc 11 +NEWSYM FxOpdAC ; IBTRNc,#PP immediate byte transfer + IBTRNc 12 +NEWSYM FxOpdAD ; IBTRNc,#PP immediate byte transfer + IBTRNc 13 +NEWSYM FxOpdAE ; IBTRNc,#PP immediate byte transfer + movsx eax,byte[ebp] + mov cl,[ebp+1] + add ebp,2 + mov [SfxR0+14*4],ax + UpdateR14 + CLRFLAGS + FXReturn +NEWSYM FxOpdAF ; IBTRNc,#PP immediate byte transfer + movsx eax,byte[ebp] + mov cl,[ebp+1] + and eax,0FFFFh + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdA0A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 0 +NEWSYM FxOpdA1A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 1 +NEWSYM FxOpdA2A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 2 +NEWSYM FxOpdA3A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 3 +NEWSYM FxOpdA4A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 4 +NEWSYM FxOpdA5A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 5 +NEWSYM FxOpdA6A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 6 +NEWSYM FxOpdA7A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 7 +NEWSYM FxOpdA8A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 8 +NEWSYM FxOpdA9A1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 9 +NEWSYM FxOpdAAA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 10 +NEWSYM FxOpdABA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 11 +NEWSYM FxOpdACA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 12 +NEWSYM FxOpdADA1 ; LMS rn,(yy) load word from RAM (short address) + LMSRNc 13 +NEWSYM FxOpdAEA1 ; LMS rn,(yy) load word from RAM (short address) + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + inc ebp + mov [SfxR0+14*4],bx ; Write data + UpdateR14 + CLRFLAGS + FXReturn +NEWSYM FxOpdAFA1 ; LMS rn,(yy) load word from RAM (short address) + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + and ebx,0FFFFh + mov ebp,[SfxCPB] + add ebp,ebx + CLRFLAGS + FXReturn + +NEWSYM FxOpdA0A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 0 +NEWSYM FxOpdA1A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 1 +NEWSYM FxOpdA2A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 2 +NEWSYM FxOpdA3A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 3 +NEWSYM FxOpdA4A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 4 +NEWSYM FxOpdA5A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 5 +NEWSYM FxOpdA6A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 6 +NEWSYM FxOpdA7A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 7 +NEWSYM FxOpdA8A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 8 +NEWSYM FxOpdA9A2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 9 +NEWSYM FxOpdAAA2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 10 +NEWSYM FxOpdABA2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 11 +NEWSYM FxOpdACA2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 12 +NEWSYM FxOpdADA2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 13 +NEWSYM FxOpdAEA2 ; SMS (yy),rn store word in RAM (short address) + SMSRNc 14 +NEWSYM FxOpdAFA2 ; SMS (yy),rn store word in RAM (short address) + xor eax,eax + mov ebx,ebp + sub ebx,[SfxCPB] + mov al,[ebp] + inc ebp + add eax,eax + FETCHPIPE + add eax,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax + inc ebp + mov [eax],bx ; Write word to ram + CLRFLAGS + FXReturn + +NEWSYM FxOpdB0 ; FROM rn set source register + FROMRNd 0 +NEWSYM FxOpdB1 ; FROM rn set source register + FROMRNd 1 +NEWSYM FxOpdB2 ; FROM rn set source register + FROMRNd 2 +NEWSYM FxOpdB3 ; FROM rn set source register + FROMRNd 3 +NEWSYM FxOpdB4 ; FROM rn set source register + FROMRNd 4 +NEWSYM FxOpdB5 ; FROM rn set source register + FROMRNd 5 +NEWSYM FxOpdB6 ; FROM rn set source register + FROMRNd 6 +NEWSYM FxOpdB7 ; FROM rn set source register + FROMRNd 7 +NEWSYM FxOpdB8 ; FROM rn set source register + FROMRNd 8 +NEWSYM FxOpdB9 ; FROM rn set source register + FROMRNd 9 +NEWSYM FxOpdBA ; FROM rn set source register + FROMRNd 10 +NEWSYM FxOpdBB ; FROM rn set source register + FROMRNd 11 +NEWSYM FxOpdBC ; FROM rn set source register + FROMRNd 12 +NEWSYM FxOpdBD ; FROM rn set source register + FROMRNd 13 +NEWSYM FxOpdBE ; FROM rn set source register + FROMRNd 14 +NEWSYM FxOpdBF ; FROM rn set source register + FETCHPIPE + mov esi,SfxR0+15*4 + inc ebp ; Increase program counter + mov eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + call [FxTableb+ecx*4] + mov esi,SfxR0 + FXReturn + +NEWSYM FxOpdC0 ; HIB move high-byte to low-byte ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,0FF00h + mov dword [SfxSignZero],eax + shr eax,8 + inc ebp + mov [edi],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdC1 ; OR rn or rn + ORRNc 1 +NEWSYM FxOpdC2 ; OR rn or rn + ORRNc 2 +NEWSYM FxOpdC3 ; OR rn or rn + ORRNc 3 +NEWSYM FxOpdC4 ; OR rn or rn + ORRNc 4 +NEWSYM FxOpdC5 ; OR rn or rn + ORRNc 5 +NEWSYM FxOpdC6 ; OR rn or rn + ORRNc 6 +NEWSYM FxOpdC7 ; OR rn or rn + ORRNc 7 +NEWSYM FxOpdC8 ; OR rn or rn + ORRNc 8 +NEWSYM FxOpdC9 ; OR rn or rn + ORRNc 9 +NEWSYM FxOpdCA ; OR rn or rn + ORRNc 10 +NEWSYM FxOpdCB ; OR rn or rn + ORRNc 11 +NEWSYM FxOpdCC ; OR rn or rn + ORRNc 12 +NEWSYM FxOpdCD ; OR rn or rn + ORRNc 13 +NEWSYM FxOpdCE ; OR rn or rn + ORRNc 14 +NEWSYM FxOpdCF ; OR rn or rn + mov eax,[esi] ; Read Source + mov ebx,ebp + FETCHPIPE + sub ebx,[SfxCPB] + or eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdC1A1 ; XOR rn xor rn + XORRNc 1 +NEWSYM FxOpdC2A1 ; XOR rn xor rn + XORRNc 2 +NEWSYM FxOpdC3A1 ; XOR rn xor rn + XORRNc 3 +NEWSYM FxOpdC4A1 ; XOR rn xor rn + XORRNc 4 +NEWSYM FxOpdC5A1 ; XOR rn xor rn + XORRNc 5 +NEWSYM FxOpdC6A1 ; XOR rn xor rn + XORRNc 6 +NEWSYM FxOpdC7A1 ; XOR rn xor rn + XORRNc 7 +NEWSYM FxOpdC8A1 ; XOR rn xor rn + XORRNc 8 +NEWSYM FxOpdC9A1 ; XOR rn xor rn + XORRNc 9 +NEWSYM FxOpdCAA1 ; XOR rn xor rn + XORRNc 10 +NEWSYM FxOpdCBA1 ; XOR rn xor rn + XORRNc 11 +NEWSYM FxOpdCCA1 ; XOR rn xor rn + XORRNc 12 +NEWSYM FxOpdCDA1 ; XOR rn xor rn + XORRNc 13 +NEWSYM FxOpdCEA1 ; XOR rn xor rn + XORRNc 14 +NEWSYM FxOpdCFA1 ; XOR rn xor rn + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,ebp + sub ebx,[SfxCPB] + xor eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdC1A2 ; OR #n OR #n + ORIc 1 +NEWSYM FxOpdC2A2 ; OR #n OR #n + ORIc 2 +NEWSYM FxOpdC3A2 ; OR #n OR #n + ORIc 3 +NEWSYM FxOpdC4A2 ; OR #n OR #n + ORIc 4 +NEWSYM FxOpdC5A2 ; OR #n OR #n + ORIc 5 +NEWSYM FxOpdC6A2 ; OR #n OR #n + ORIc 6 +NEWSYM FxOpdC7A2 ; OR #n OR #n + ORIc 7 +NEWSYM FxOpdC8A2 ; OR #n OR #n + ORIc 8 +NEWSYM FxOpdC9A2 ; OR #n OR #n + ORIc 9 +NEWSYM FxOpdCAA2 ; OR #n OR #n + ORIc 10 +NEWSYM FxOpdCBA2 ; OR #n OR #n + ORIc 11 +NEWSYM FxOpdCCA2 ; OR #n OR #n + ORIc 12 +NEWSYM FxOpdCDA2 ; OR #n OR #n + ORIc 13 +NEWSYM FxOpdCEA2 ; OR #n OR #n + ORIc 14 +NEWSYM FxOpdCFA2 ; OR #n OR #n + ORIc 15 + +NEWSYM FxOpdC1A3 ; XOR #n xor #n + XORIc 1 +NEWSYM FxOpdC2A3 ; XOR #n xor #n + XORIc 2 +NEWSYM FxOpdC3A3 ; XOR #n xor #n + XORIc 3 +NEWSYM FxOpdC4A3 ; XOR #n xor #n + XORIc 4 +NEWSYM FxOpdC5A3 ; XOR #n xor #n + XORIc 5 +NEWSYM FxOpdC6A3 ; XOR #n xor #n + XORIc 6 +NEWSYM FxOpdC7A3 ; XOR #n xor #n + XORIc 7 +NEWSYM FxOpdC8A3 ; XOR #n xor #n + XORIc 8 +NEWSYM FxOpdC9A3 ; XOR #n xor #n + XORIc 9 +NEWSYM FxOpdCAA3 ; XOR #n xor #n + XORIc 10 +NEWSYM FxOpdCBA3 ; XOR #n xor #n + XORIc 11 +NEWSYM FxOpdCCA3 ; XOR #n xor #n + XORIc 12 +NEWSYM FxOpdCDA3 ; XOR #n xor #n + XORIc 13 +NEWSYM FxOpdCEA3 ; XOR #n xor #n + XORIc 14 +NEWSYM FxOpdCFA3 ; XOR #n xor #n + XORIc 15 + +NEWSYM FxOpdD0 ; INC rn increase by one + INCRNc 0 +NEWSYM FxOpdD1 ; INC rn increase by one + INCRNc 1 +NEWSYM FxOpdD2 ; INC rn increase by one + INCRNc 2 +NEWSYM FxOpdD3 ; INC rn increase by one + INCRNc 3 +NEWSYM FxOpdD4 ; INC rn increase by one + INCRNc 4 +NEWSYM FxOpdD5 ; INC rn increase by one + INCRNc 5 +NEWSYM FxOpdD6 ; INC rn increase by one + INCRNc 6 +NEWSYM FxOpdD7 ; INC rn increase by one + INCRNc 7 +NEWSYM FxOpdD8 ; INC rn increase by one + INCRNc 8 +NEWSYM FxOpdD9 ; INC rn increase by one + INCRNc 9 +NEWSYM FxOpdDA ; INC rn increase by one + INCRNc 10 +NEWSYM FxOpdDB ; INC rn increase by one + INCRNc 11 +NEWSYM FxOpdDC ; INC rn increase by one + INCRNc 12 +NEWSYM FxOpdDD ; INC rn increase by one + INCRNc 13 +NEWSYM FxOpdDE ; INC rn increase by one + FETCHPIPE + mov eax,[SfxR0+14*4] ; Read Source + inc ax + mov [SfxR0+14*4],eax + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + UpdateR14 + FXReturn + +NEWSYM FxOpdDF ; GETC transfer ROM buffer to color register + mov eax,[SfxRomBuffer] + FETCHPIPE + mov eax,[eax] + test byte[SfxPOR],04h + jz .nohighnibble + mov bl,al + shr bl,4 + and al,0F0h + or al,bl +.nohighnibble + test byte[SfxPOR],08h + jnz .preserveupper + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx +.nocolchange + CLRFLAGS + inc ebp ; Increase program counter + FXReturn +.preserveupper + mov bl,[SfxCOLR] + and al,0Fh + and bl,0F0h + or al,bl + cmp [SfxCOLR],al + je .nocolchange + mov [SfxCOLR],al + and eax,0FFh + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx + CLRFLAGS + inc ebp ; Increase program counter + FXReturn + +NEWSYM FxOpdDFA2 ; RAMB set current RAM bank ; Verified + mov eax,[esi] ; Read Source + mov ebx,[SfxnRamBanks] + FETCHPIPE + dec ebx + and eax,ebx + mov dword [SfxRAMBR],eax + shl eax,16 + add eax,[sfxramdata] + mov dword [SfxRAMMem],eax + CLRFLAGS + inc ebp + FXReturn + +NEWSYM FxOpdDFA3 ; ROMB set current ROM bank ; Verified + mov eax,[esi] ; Read Source + and eax,07Fh + FETCHPIPE + mov dword [SfxROMBR],eax + mov eax,[SfxMemTable+eax*4] + mov [SfxCROM],eax + CLRFLAGS + inc ebp + FXReturn + +NEWSYM FxOpdE0 ; DEC rn decrement by one + DECRNc 0 +NEWSYM FxOpdE1 ; DEC rn decrement by one + DECRNc 1 +NEWSYM FxOpdE2 ; DEC rn decrement by one + DECRNc 2 +NEWSYM FxOpdE3 ; DEC rn decrement by one + DECRNc 3 +NEWSYM FxOpdE4 ; DEC rn decrement by one + DECRNc 4 +NEWSYM FxOpdE5 ; DEC rn decrement by one + DECRNc 5 +NEWSYM FxOpdE6 ; DEC rn decrement by one + DECRNc 6 +NEWSYM FxOpdE7 ; DEC rn decrement by one + DECRNc 7 +NEWSYM FxOpdE8 ; DEC rn decrement by one + DECRNc 8 +NEWSYM FxOpdE9 ; DEC rn decrement by one + DECRNc 9 +NEWSYM FxOpdEA ; DEC rn decrement by one + DECRNc 10 +NEWSYM FxOpdEB ; DEC rn decrement by one + DECRNc 11 +NEWSYM FxOpdEC ; DEC rn decrement by one + DECRNc 12 +NEWSYM FxOpdED ; DEC rn decrement by one + DECRNc 13 +NEWSYM FxOpdEE ; DEC rn decrement by one + dec word[SfxR0+14*4] + FETCHPIPE + mov eax,[SfxR0+14*4] ; Read Source + mov [SfxSignZero],eax + UpdateR14 + CLRFLAGS + inc ebp + FXReturn + +NEWSYM FxOpdEF ; getb get byte from ROM at address R14 ; V + FETCHPIPE + mov eax,[SfxRomBuffer] + inc ebp + mov eax,[eax] + and eax,0FFh +; cmp edi,SfxR15 +; je .nor15 + mov [edi],eax ; Write DREG + CLRFLAGS + FXReturn +.nor15 + or eax,8000h + mov [edi],eax ; Write DREG + CLRFLAGS + FXReturn + + add eax,ebp + sub eax,[SfxCPB] + mov [SfxR15],eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdEFA1 ; getbh get high-byte from ROM at address R14 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxRomBuffer] + and eax,0FFh + FETCHPIPE + mov ah,[ebx] + inc ebp + mov [edi],eax ; Write DREG + CLRFLAGS + FXReturn + +NEWSYM FxOpdEFA2 ; getbl get low-byte from ROM at address R14 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxRomBuffer] + and eax,0FF00h + FETCHPIPE + mov al,[ebx] + inc ebp + mov [edi],eax ; Write DREG + CLRFLAGS + FXReturn + +NEWSYM FxOpdEFA3 ; getbs get sign extended byte from ROM at address R14 ; V + mov ebx,[SfxRomBuffer] + FETCHPIPE + movsx eax,byte[ebx] + inc ebp + mov [edi],ax ; Write DREG + CLRFLAGS + FXReturn + +NEWSYM FxOpdF0 ; IWT RN,#xx immediate word transfer to register + IWTRNc 0 +NEWSYM FxOpdF1 ; IWT RN,#xx immediate word transfer to register + IWTRNc 1 +NEWSYM FxOpdF2 ; IWT RN,#xx immediate word transfer to register + IWTRNc 2 +NEWSYM FxOpdF3 ; IWT RN,#xx immediate word transfer to register + IWTRNc 3 +NEWSYM FxOpdF4 ; IWT RN,#xx immediate word transfer to register + IWTRNc 4 +NEWSYM FxOpdF5 ; IWT RN,#xx immediate word transfer to register + IWTRNc 5 +NEWSYM FxOpdF6 ; IWT RN,#xx immediate word transfer to register + IWTRNc 6 +NEWSYM FxOpdF7 ; IWT RN,#xx immediate word transfer to register + IWTRNc 7 +NEWSYM FxOpdF8 ; IWT RN,#xx immediate word transfer to register + IWTRNc 8 +NEWSYM FxOpdF9 ; IWT RN,#xx immediate word transfer to register + IWTRNc 9 +NEWSYM FxOpdFA ; IWT RN,#xx immediate word transfer to register + IWTRNc 10 +NEWSYM FxOpdFB ; IWT RN,#xx immediate word transfer to register + IWTRNc 11 +NEWSYM FxOpdFC ; IWT RN,#xx immediate word transfer to register + IWTRNc 12 +NEWSYM FxOpdFD ; IWT RN,#xx immediate word transfer to register + IWTRNc 13 +NEWSYM FxOpdFE ; IWT RN,#xx immediate word transfer to register + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + add ebp,3 + mov [SfxR0+14*4],eax + UpdateR14 + CLRFLAGS + FXReturn +NEWSYM FxOpdFF ; IWT RN,#xx immediate word transfer to register + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + FXReturn + +NEWSYM FxOpdF0A1 ; LM RN,(XX) load word from RAM + LMRNc 0 +NEWSYM FxOpdF1A1 ; LM RN,(XX) load word from RAM + LMRNc 1 +NEWSYM FxOpdF2A1 ; LM RN,(XX) load word from RAM + LMRNc 2 +NEWSYM FxOpdF3A1 ; LM RN,(XX) load word from RAM + LMRNc 3 +NEWSYM FxOpdF4A1 ; LM RN,(XX) load word from RAM + LMRNc 4 +NEWSYM FxOpdF5A1 ; LM RN,(XX) load word from RAM + LMRNc 5 +NEWSYM FxOpdF6A1 ; LM RN,(XX) load word from RAM + LMRNc 6 +NEWSYM FxOpdF7A1 ; LM RN,(XX) load word from RAM + LMRNc 7 +NEWSYM FxOpdF8A1 ; LM RN,(XX) load word from RAM + LMRNc 8 +NEWSYM FxOpdF9A1 ; LM RN,(XX) load word from RAM + LMRNc 9 +NEWSYM FxOpdFAA1 ; LM RN,(XX) load word from RAM + LMRNc 10 +NEWSYM FxOpdFBA1 ; LM RN,(XX) load word from RAM + LMRNc 11 +NEWSYM FxOpdFCA1 ; LM RN,(XX) load word from RAM + LMRNc 12 +NEWSYM FxOpdFDA1 ; LM RN,(XX) load word from RAM + LMRNc 13 +NEWSYM FxOpdFEA1 ; LM RN,(XX) load word from RAM + xor eax,eax + mov cl,[ebp+2] + mov ax,[ebp] + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + add ebp,3 + mov dh,[eax+ebx] + mov word [SfxR0+14*4],dx ; Store Word + UpdateR14 + CLRFLAGS + FXReturn +NEWSYM FxOpdFFA1 ; LM RN,(XX) load word from RAM + FETCHPIPE + mov eax,ecx + inc ebp + FETCHPIPE + inc ebp + mov ah,cl + FETCHPIPE + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + mov dh,[eax+ebx] + and edx,0FFFFh + mov ebp,[SfxCPB] + add ebp,edx + CLRFLAGS + FXReturn + +NEWSYM FxOpdF0A2 ; SM (XX),RN store word in RAM + SMRNc 0 +NEWSYM FxOpdF1A2 ; SM (XX),RN store word in RAM + SMRNc 1 +NEWSYM FxOpdF2A2 ; SM (XX),RN store word in RAM + SMRNc 2 +NEWSYM FxOpdF3A2 ; SM (XX),RN store word in RAM + SMRNc 3 +NEWSYM FxOpdF4A2 ; SM (XX),RN store word in RAM + SMRNc 4 +NEWSYM FxOpdF5A2 ; SM (XX),RN store word in RAM + SMRNc 5 +NEWSYM FxOpdF6A2 ; SM (XX),RN store word in RAM + SMRNc 6 +NEWSYM FxOpdF7A2 ; SM (XX),RN store word in RAM + SMRNc 7 +NEWSYM FxOpdF8A2 ; SM (XX),RN store word in RAM + SMRNc 8 +NEWSYM FxOpdF9A2 ; SM (XX),RN store word in RAM + SMRNc 9 +NEWSYM FxOpdFAA2 ; SM (XX),RN store word in RAM + SMRNc 10 +NEWSYM FxOpdFBA2 ; SM (XX),RN store word in RAM + SMRNc 11 +NEWSYM FxOpdFCA2 ; SM (XX),RN store word in RAM + SMRNc 12 +NEWSYM FxOpdFDA2 ; SM (XX),RN store word in RAM + SMRNc 13 +NEWSYM FxOpdFEA2 ; SM (XX),RN store word in RAM + SMRNc 14 +NEWSYM FxOpdFFA2 ; SM (XX),RN store word in RAM + FETCHPIPE + mov ebx,ebp + sub ebx,[SfxCPB] + mov eax,ecx + inc ebp + FETCHPIPE + inc ebp + mov ah,cl + FETCHPIPE + mov dx,bx + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov [eax+ebx],dl + xor eax,1 + inc ebp + mov [eax+ebx],dh + CLRFLAGS + FXReturn + +NEWSYM FxEmu2CAsmEnd diff --git a/src/i386/fxemu2c.mac b/src/i386/fxemu2c.mac new file mode 100644 index 0000000..4595e12 --- /dev/null +++ b/src/i386/fxemu2c.mac @@ -0,0 +1,528 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + + + + + + + + +%macro FXReturn 0 + dec dword [NumberOfOpcodes] + jmp [FxTabled+ecx*4] + ALIGN32 +%endmacro + +%macro FXReturn2 0 + dec dword [NumberOfOpcodes] + js %%endloop + jmp [FxTabled+ecx*4] +%%endloop + jmp FXEndLoop +; jmp [FxTabled+ecx*4] + ALIGN32 +%endmacro + +%macro TORNd 1 ; V + FETCHPIPE + mov edi, SfxR0+%1*4 + inc ebp ; Increase program counter + call [FxTable+ecx*4] + mov edi,SfxR0 + FXReturn +%endmacro + +%macro WITHc 1 ; Verified. + FETCHPIPE + mov esi,SfxR0+%1*4 + mov edi,SfxR0+%1*4 + mov dword [SfxB],1 + inc ebp ; Increase program counter + call [FxTablec+ecx*4] + mov esi,SfxR0 + mov edi,SfxR0 + mov dword [SfxB],0 ; Clear B Flag + FXReturn +%endmacro + +%macro STWRNc 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + mov ebx,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + add dword [SfxLastRamAdr],ebx ; Save last ram address + mov edx,[esi] ; Read Source + FETCHPIPE + mov [ebx+eax],dl ; Store Word + xor eax,1 + inc ebp ; Increase program counter + mov [ebx+eax],dh ; Store Word + CLRFLAGS + FXReturn +%endmacro + +%macro STBRNc 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + FETCHPIPE + add eax,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + mov ebx,[esi] ; Read Source + mov byte [eax],bl ; Store Byte + CLRFLAGS + inc ebp ; Increase program counter + FXReturn +%endmacro + +%macro LDWRNc 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + mov ebx,[SfxRAMMem] + mov dword [SfxLastRamAdr],eax ; Save last ram address + FETCHPIPE + mov dl,[ebx+eax] ; Store Word + add dword [SfxLastRamAdr],ebx ; Save last ram address + xor eax,1 + and edx,0FFFFh + inc ebp ; Increase program counter + mov dh,[ebx+eax] ; Store Word + mov [edi],edx ; Read Source + CLRFLAGS + FXReturn +%endmacro + +%macro LDBRNc 1 ; V + mov eax,[SfxR0+%1*4] ; Read register + FETCHPIPE + add eax,[SfxRAMMem] + xor ebx,ebx + mov dword [SfxLastRamAdr],eax ; Save last ram address + mov bl,[eax] ; Read Byte + inc ebp ; Increase program counter + mov [edi],ebx ; Store Result + CLRFLAGS + FXReturn +%endmacro + +%macro ADDRNc 1 ; V + mov eax, [esi] ; Read Source + mov ebx, [SfxR0+%1*4] + FETCHPIPE + add ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro ADCRNc 1 ; V + FETCHPIPE + mov eax, [esi] ; Read Source + mov ebx, [SfxR0+%1*4] + shr byte[SfxCarry],1 + adc ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro ADIRNc 1 ; V + mov eax, [esi] ; Read Source + FETCHPIPE + add ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro ADCIRNc 1 ; V + FETCHPIPE + mov eax, [esi] ; Read Source + shr byte[SfxCarry],1 + adc ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + mov [SfxSignZero],eax + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro SUBRNc 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + FETCHPIPE + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro SBCRNc 1 ; V + FETCHPIPE + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + cmp byte[SfxCarry],1 + sbb ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro SUBIRNc 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + sub ax,%1 + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + inc ebp ; Increase program counter + mov [edi],eax ; Write Destination + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro CMPRNc 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] + FETCHPIPE + sub ax,bx + seto byte[SfxOverflow] + setc byte[SfxCarry] + xor byte[SfxCarry],1 + mov [SfxSignZero],eax + CLRFLAGS + inc ebp ; Increase program counter + FXReturn +%endmacro + +%macro ANDRNc 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read RN + FETCHPIPE + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro BICRNc 1 ; V + mov ebx,[SfxR0+%1*4] ; Read RN + mov eax,[esi] ; Read Source + xor ebx,0FFFFh + FETCHPIPE + and eax,ebx + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro ANDIRNc 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,%1 + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro BICIRNc 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + and eax,%1 + inc ebp + mov dword [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro MULTRNc 1 ; V + mov al,byte [esi] ; Read Source + mov bl,byte [SfxR0+%1*4] ; Read RN + FETCHPIPE + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro UMULTRNc 1 ; V + mov al,byte [esi] ; Read Source + mov bl,byte [SfxR0+%1*4] ; Read RN + FETCHPIPE + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro MULTIRNc 1 ; V + mov al,byte [esi] ; Read Source + mov bl,%1 ; Read RN + FETCHPIPE + imul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro UMULTIRNc 1 ; V + mov al,byte [esi] ; Read Source + mov bl,%1 ; Read RN + FETCHPIPE + mul bl + inc ebp + and eax,0FFFFh + mov [SfxSignZero],eax + mov [edi],eax ; Write Destination + CLRFLAGS + FXReturn +%endmacro + +%macro LINKc 1 ; Verified. + mov eax,ebp + sub eax,[SfxCPB] + add eax,%1 + FETCHPIPE + mov word [SfxR11],ax + CLRFLAGS + inc ebp + FXReturn +%endmacro + +%macro JMPRNc 1 ; V + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read RN + mov ebp,[SfxCPB] + add ebp,eax + CLRFLAGS + FXReturn +%endmacro + +%macro LJMPRNc 1 ; V + FETCHPIPE + mov eax,[SfxR0+%1*4] + and eax,07Fh + mov byte[SfxPBR],al +; mov byte[fxtrace+eax],1 + mov eax,[SfxMemTable+eax*4] + mov [SfxCPB],eax + mov ebp,eax + add ebp,[esi] ; Read RN + mov dword [SfxCacheActive],0 + push ecx + call FxOp02 + pop ecx + dec ebp + FXReturn +%endmacro + +%macro IBTRNc 1 ; V + movsx eax,byte[ebp] + mov cl,[ebp+1] + add ebp,2 + mov [SfxR0+%1*4],ax + CLRFLAGS + FXReturn +%endmacro + +%macro LMSRNc 1 ; Verified. + xor eax,eax + mov al,[ebp] + add eax,eax + inc ebp + add eax,[SfxRAMMem] + mov cl,[ebp] + mov dword [SfxLastRamAdr],eax + mov ebx,[eax] ; Read word from ram + inc ebp + mov [SfxR0+%1*4],bx ; Write data + CLRFLAGS + FXReturn +%endmacro + +%macro SMSRNc 1 ; Verified. + xor eax,eax + mov al,[ebp] + inc ebp + add eax,eax + mov cl,[ebp] + add eax,[SfxRAMMem] + mov ebx,[SfxR0+%1*4] ; Read data + mov dword [SfxLastRamAdr],eax + inc ebp + mov [eax],bx ; Write word to ram + CLRFLAGS + FXReturn +%endmacro + +%macro FROMRNd 1 ; V + FETCHPIPE + mov esi,SfxR0+%1*4 + inc ebp ; Increase program counter + call [FxTable+ecx*4] + mov esi,SfxR0 + FXReturn +%endmacro + +%macro ORRNc 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read + FETCHPIPE + or eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro XORRNc 1 ; V + mov eax,[esi] ; Read Source + mov ebx,[SfxR0+%1*4] ; Read + FETCHPIPE + xor eax,ebx + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro ORIc 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + or eax,%1 + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro XORIc 1 ; V + mov eax,[esi] ; Read Source + FETCHPIPE + xor eax,%1 + inc ebp + mov [edi],eax ; Write DREG + mov [SfxSignZero],eax + CLRFLAGS + FXReturn +%endmacro + +%macro INCRNc 1 ; Verified + inc word[SfxR0+%1*4] + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read Source + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + FXReturn +%endmacro + +%macro DECRNc 1 ; Verified + dec word[SfxR0+%1*4] + FETCHPIPE + mov eax,[SfxR0+%1*4] ; Read Source + mov [SfxR0+%1*4],eax + mov [SfxSignZero],eax + CLRFLAGS + inc ebp + FXReturn +%endmacro + +%macro IWTRNc 1 ; aka LEA ; Verified. + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + add ebp,3 + mov [SfxR0+%1*4],eax + CLRFLAGS + FXReturn +%endmacro + +%macro LMRNc 1 ; Verified! + xor eax,eax + mov cl,[ebp+2] + mov ax,[ebp] + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov dl,[eax+ebx] + xor eax,1 + add ebp,3 + mov dh,[eax+ebx] + mov word [SfxR0+%1*4],dx ; Store Word + CLRFLAGS + FXReturn +%endmacro + +%macro SMRNc 1 ; Verified + mov ebx,[SfxR0+%1*4] + mov eax,[ebp] + mov cl,[ebp+2] + and eax,0FFFFh + mov dx,bx + mov ebx,[SfxRAMMem] + mov [SfxLastRamAdr],eax + add [SfxLastRamAdr],ebx + mov [eax+ebx],dl + xor eax,1 + add ebp,3 + mov [eax+ebx],dh + CLRFLAGS + FXReturn +%endmacro diff --git a/src/i386/fxtable.asm b/src/i386/fxtable.asm new file mode 100644 index 0000000..69dda56 --- /dev/null +++ b/src/i386/fxtable.asm @@ -0,0 +1,3557 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +%include "src/i386/macros.mac" +EXTSYM FxTable,FxTableA1,FxTableA2,FxTableA3,FxTableb,FxTablebA1,FxTablebA2 +EXTSYM FxTablebA3,FxTablec,FxTablecA1,FxTablecA2,FxTablecA3,FxTabled +EXTSYM FxTabledA1,FxTabledA2,FxTabledA3,SfxMemTable,romdata,sfxramdata +EXTSYM sfxplottable + +EXTSYM FxOp00,FxOp01,FxOp02,FxOp03,FxOp04,FxOp05,FxOp06,FxOp07,FxOp08 +EXTSYM FxOp09,FxOp0A,FxOp0B,FxOp0C,FxOp0D,FxOp0E,FxOp0F,FxOp10,FxOp11 +EXTSYM FxOp12,FxOp13,FxOp14,FxOp15,FxOp16,FxOp17,FxOp18,FxOp19,FxOp1A +EXTSYM FxOp1B,FxOp1C,FxOp1D,FxOp1E,FxOp1F,FxOp20,FxOp21,FxOp22,FxOp23 +EXTSYM FxOp24,FxOp25,FxOp26,FxOp27,FxOp28,FxOp29,FxOp2A,FxOp2B,FxOp2C +EXTSYM FxOp2D,FxOp2E,FxOp2F,FxOp30,FxOp30A1,FxOp31,FxOp31A1,FxOp32 +EXTSYM FxOp32A1,FxOp33,FxOp33A1,FxOp34,FxOp34A1,FxOp35,FxOp35A1,FxOp36 +EXTSYM FxOp36A1,FxOp37,FxOp37A1,FxOp38,FxOp38A1,FxOp39,FxOp39A1,FxOp3A +EXTSYM FxOp3AA1,FxOp3B,FxOp3BA1,FxOp3C,FxOp3D,FxOp3E,FxOp3F,FxOp40 +EXTSYM FxOp40A1,FxOp41,FxOp41A1,FxOp42,FxOp42A1,FxOp43,FxOp43A1,FxOp44 +EXTSYM FxOp44A1,FxOp45,FxOp45A1,FxOp46,FxOp46A1,FxOp47,FxOp47A1,FxOp48 +EXTSYM FxOp48A1,FxOp49,FxOp49A1,FxOp4A,FxOp4AA1,FxOp4B,FxOp4BA1,FxOp4C +EXTSYM FxOp4CA1,FxOp4D,FxOp4E,FxOp4EA1,FxOp4F,FxOp50,FxOp50A1,FxOp50A2 +EXTSYM FxOp50A3,FxOp51,FxOp51A1,FxOp51A2,FxOp51A3,FxOp52,FxOp52A1,FxOp52A2 +EXTSYM FxOp52A3,FxOp53,FxOp53A1,FxOp53A2,FxOp53A3,FxOp54,FxOp54A1,FxOp54A2 +EXTSYM FxOp54A3,FxOp55,FxOp55A1,FxOp55A2,FxOp55A3,FxOp56,FxOp56A1,FxOp56A2 +EXTSYM FxOp56A3,FxOp57,FxOp57A1,FxOp57A2,FxOp57A3,FxOp58,FxOp58A1,FxOp58A2 +EXTSYM FxOp58A3,FxOp59,FxOp59A1,FxOp59A2,FxOp59A3,FxOp5A,FxOp5AA1,FxOp5AA2 +EXTSYM FxOp5AA3,FxOp5B,FxOp5BA1,FxOp5BA2,FxOp5BA3,FxOp5C,FxOp5CA1,FxOp5CA2 +EXTSYM FxOp5CA3,FxOp5D,FxOp5DA1,FxOp5DA2,FxOp5DA3,FxOp5E,FxOp5EA1,FxOp5EA2 +EXTSYM FxOp5EA3,FxOp5F,FxOp5FA1,FxOp5FA2,FxOp5FA3,FxOp60,FxOp60A1,FxOp60A2 +EXTSYM FxOp60A3,FxOp61,FxOp61A1,FxOp61A2,FxOp61A3,FxOp62,FxOp62A1,FxOp62A2 +EXTSYM FxOp62A3,FxOp63,FxOp63A1,FxOp63A2,FxOp63A3,FxOp64,FxOp64A1,FxOp64A2 +EXTSYM FxOp64A3,FxOp65,FxOp65A1,FxOp65A2,FxOp65A3,FxOp66,FxOp66A1,FxOp66A2 +EXTSYM FxOp66A3,FxOp67,FxOp67A1,FxOp67A2,FxOp67A3,FxOp68,FxOp68A1,FxOp68A2 +EXTSYM FxOp68A3,FxOp69,FxOp69A1,FxOp69A2,FxOp69A3,FxOp6A,FxOp6AA1,FxOp6AA2 +EXTSYM FxOp6AA3,FxOp6B,FxOp6BA1,FxOp6BA2,FxOp6BA3,FxOp6C,FxOp6CA1,FxOp6CA2 +EXTSYM FxOp6CA3,FxOp6D,FxOp6DA1,FxOp6DA2,FxOp6DA3,FxOp6E,FxOp6EA1,FxOp6EA2 +EXTSYM FxOp6EA3,FxOp6F,FxOp6FA1,FxOp6FA2,FxOp6FA3,FxOp70,FxOp71,FxOp71A1 +EXTSYM FxOp71A2,FxOp71A3,FxOp72,FxOp72A1,FxOp72A2,FxOp72A3,FxOp73,FxOp73A1 +EXTSYM FxOp73A2,FxOp73A3,FxOp74,FxOp74A1,FxOp74A2,FxOp74A3,FxOp75,FxOp75A1 +EXTSYM FxOp75A2,FxOp75A3,FxOp76,FxOp76A1,FxOp76A2,FxOp76A3,FxOp77,FxOp77A1 +EXTSYM FxOp77A2,FxOp77A3,FxOp78,FxOp78A1,FxOp78A2,FxOp78A3,FxOp79,FxOp79A1 +EXTSYM FxOp79A2,FxOp79A3,FxOp7A,FxOp7AA1,FxOp7AA2,FxOp7AA3,FxOp7B,FxOp7BA1 +EXTSYM FxOp7BA2,FxOp7BA3,FxOp7C,FxOp7CA1,FxOp7CA2,FxOp7CA3,FxOp7D,FxOp7DA1 +EXTSYM FxOp7DA2,FxOp7DA3,FxOp7E,FxOp7EA1,FxOp7EA2,FxOp7EA3,FxOp7F,FxOp7FA1 +EXTSYM FxOp7FA2,FxOp7FA3,FxOp80,FxOp80A1,FxOp80A2,FxOp80A3,FxOp81,FxOp81A1 +EXTSYM FxOp81A2,FxOp81A3,FxOp82,FxOp82A1,FxOp82A2,FxOp82A3,FxOp83,FxOp83A1 +EXTSYM FxOp83A2,FxOp83A3,FxOp84,FxOp84A1,FxOp84A2,FxOp84A3,FxOp85,FxOp85A1 +EXTSYM FxOp85A2,FxOp85A3,FxOp86,FxOp86A1,FxOp86A2,FxOp86A3,FxOp87,FxOp87A1 +EXTSYM FxOp87A2,FxOp87A3,FxOp88,FxOp88A1,FxOp88A2,FxOp88A3,FxOp89,FxOp89A1 +EXTSYM FxOp89A2,FxOp89A3,FxOp8A,FxOp8AA1,FxOp8AA2,FxOp8AA3,FxOp8B,FxOp8BA1 +EXTSYM FxOp8BA2,FxOp8BA3,FxOp8C,FxOp8CA1,FxOp8CA2,FxOp8CA3,FxOp8D,FxOp8DA1 +EXTSYM FxOp8DA2,FxOp8DA3,FxOp8E,FxOp8EA1,FxOp8EA2,FxOp8EA3,FxOp8F,FxOp8FA1 +EXTSYM FxOp8FA2,FxOp8FA3,FxOp90,FxOp91,FxOp92,FxOp93,FxOp94,FxOp95,FxOp96 +EXTSYM FxOp96A1,FxOp97,FxOp98,FxOp98A1,FxOp99,FxOp99A1,FxOp9A,FxOp9AA1,FxOp9B +EXTSYM FxOp9BA1,FxOp9C,FxOp9CA1,FxOp9D,FxOp9DA1,FxOp9E,FxOp9F,FxOp9FA1,FxOpA0 +EXTSYM FxOpA0A1,FxOpA0A2,FxOpA1,FxOpA1A1,FxOpA1A2,FxOpA2,FxOpA2A1,FxOpA2A2 +EXTSYM FxOpA3,FxOpA3A1,FxOpA3A2,FxOpA4,FxOpA4A1,FxOpA4A2,FxOpA5,FxOpA5A1 +EXTSYM FxOpA5A2,FxOpA6,FxOpA6A1,FxOpA6A2,FxOpA7,FxOpA7A1,FxOpA7A2,FxOpA8 +EXTSYM FxOpA8A1,FxOpA8A2,FxOpA9,FxOpA9A1,FxOpA9A2,FxOpAA,FxOpAAA1,FxOpAAA2 +EXTSYM FxOpAB,FxOpABA1,FxOpABA2,FxOpAC,FxOpACA1,FxOpACA2,FxOpAD,FxOpADA1 +EXTSYM FxOpADA2,FxOpAE,FxOpAEA1,FxOpAEA2,FxOpAF,FxOpAFA1,FxOpAFA2,FxOpB0 +EXTSYM FxOpB1,FxOpB2,FxOpB3,FxOpB4,FxOpB5,FxOpB6,FxOpB7,FxOpB8,FxOpB9,FxOpBA +EXTSYM FxOpBB,FxOpBC,FxOpBD,FxOpBE,FxOpBF,FxOpC0,FxOpC1,FxOpC1A1,FxOpC1A2 +EXTSYM FxOpC1A3,FxOpC2,FxOpC2A1,FxOpC2A2,FxOpC2A3,FxOpC3,FxOpC3A1,FxOpC3A2 +EXTSYM FxOpC3A3,FxOpC4,FxOpC4A1,FxOpC4A2,FxOpC4A3,FxOpC5,FxOpC5A1,FxOpC5A2 +EXTSYM FxOpC5A3,FxOpC6,FxOpC6A1,FxOpC6A2,FxOpC6A3,FxOpC7,FxOpC7A1,FxOpC7A2 +EXTSYM FxOpC7A3,FxOpC8,FxOpC8A1,FxOpC8A2,FxOpC8A3,FxOpC9,FxOpC9A1,FxOpC9A2 +EXTSYM FxOpC9A3,FxOpCA,FxOpCAA1,FxOpCAA2,FxOpCAA3,FxOpCB,FxOpCBA1,FxOpCBA2 +EXTSYM FxOpCBA3,FxOpCC,FxOpCCA1,FxOpCCA2,FxOpCCA3,FxOpCD,FxOpCDA1,FxOpCDA2 +EXTSYM FxOpCDA3,FxOpCE,FxOpCEA1,FxOpCEA2,FxOpCEA3,FxOpCF,FxOpCFA1,FxOpCFA2 +EXTSYM FxOpCFA3,FxOpD0,FxOpD1,FxOpD2,FxOpD3,FxOpD4,FxOpD5,FxOpD6,FxOpD7 +EXTSYM FxOpD8,FxOpD9,FxOpDA,FxOpDB,FxOpDC,FxOpDD,FxOpDE,FxOpDF,FxOpDFA2 +EXTSYM FxOpDFA3,FxOpE0,FxOpE1,FxOpE2,FxOpE3,FxOpE4,FxOpE5,FxOpE6,FxOpE7 +EXTSYM FxOpE8,FxOpE9,FxOpEA,FxOpEB,FxOpEC,FxOpED,FxOpEE,FxOpEF,FxOpEFA1 +EXTSYM FxOpEFA2,FxOpEFA3,FxOpF0,FxOpF0A1,FxOpF0A2,FxOpF1,FxOpF1A1,FxOpF1A2 +EXTSYM FxOpF2,FxOpF2A1,FxOpF2A2,FxOpF3,FxOpF3A1,FxOpF3A2,FxOpF4,FxOpF4A1 +EXTSYM FxOpF4A2,FxOpF5,FxOpF5A1,FxOpF5A2,FxOpF6,FxOpF6A1,FxOpF6A2,FxOpF7 +EXTSYM FxOpF7A1,FxOpF7A2,FxOpF8,FxOpF8A1,FxOpF8A2,FxOpF9,FxOpF9A1,FxOpF9A2 +EXTSYM FxOpFA,FxOpFAA1,FxOpFAA2,FxOpFB,FxOpFBA1,FxOpFBA2,FxOpFC,FxOpFCA1 +EXTSYM FxOpFCA2,FxOpFD,FxOpFDA1,FxOpFDA2,FxOpFE,FxOpFEA1,FxOpFEA2,FxOpFF +EXTSYM FxOpFFA1,FxOpFFA2,FxOpb05,FxOpb06,FxOpb07,FxOpb08,FxOpb09,FxOpb0A +EXTSYM FxOpb0B,FxOpb0C,FxOpb0D,FxOpb0E,FxOpb0F,FxOpb10,FxOpb11,FxOpb12 +EXTSYM FxOpb13,FxOpb14,FxOpb15,FxOpb16,FxOpb17,FxOpb18,FxOpb19,FxOpb1A,FxOpb1B +EXTSYM FxOpb1C,FxOpb1D,FxOpb1E,FxOpb1F,FxOpb3D,FxOpb3E,FxOpb3F,FxOpbB0,FxOpbB1 +EXTSYM FxOpbB2,FxOpbB3,FxOpbB4,FxOpbB5,FxOpbB6,FxOpbB7,FxOpbB8,FxOpbB9,FxOpbBA +EXTSYM FxOpbBB,FxOpbBC,FxOpbBD,FxOpbBE,FxOpbBF,FxOpc05,FxOpc06,FxOpc07,FxOpc08 +EXTSYM FxOpc09,FxOpc0A,FxOpc0B,FxOpc0C,FxOpc0D,FxOpc0E,FxOpc0F,FxOpc10,FxOpc11 +EXTSYM FxOpc12,FxOpc13,FxOpc14,FxOpc15,FxOpc16,FxOpc17,FxOpc18,FxOpc19,FxOpc1A +EXTSYM FxOpc1B,FxOpc1C,FxOpc1D,FxOpc1E,FxOpc1F,FxOpc3D,FxOpc3E,FxOpc3F,FxOpcB0 +EXTSYM FxOpcB1,FxOpcB2,FxOpcB3,FxOpcB4,FxOpcB5,FxOpcB6,FxOpcB7,FxOpcB8,FxOpcB9 +EXTSYM FxOpcBA,FxOpcBB,FxOpcBC,FxOpcBD,FxOpcBE,FxOpcBF,FxOpd00,FxOpd01,FxOpd02 +EXTSYM FxOpd03,FxOpd04,FxOpd05,FxOpd06,FxOpd07,FxOpd08,FxOpd09,FxOpd0A,FxOpd0B +EXTSYM FxOpd0C,FxOpd0D,FxOpd0E,FxOpd0F,FxOpd10,FxOpd11,FxOpd12,FxOpd13,FxOpd14 +EXTSYM FxOpd15,FxOpd16,FxOpd17,FxOpd18,FxOpd19,FxOpd1A,FxOpd1B,FxOpd1C,FxOpd1D +EXTSYM FxOpd1E,FxOpd1F,FxOpd20,FxOpd21,FxOpd22,FxOpd23,FxOpd24,FxOpd25,FxOpd26 +EXTSYM FxOpd27,FxOpd28,FxOpd29,FxOpd2A,FxOpd2B,FxOpd2C,FxOpd2D,FxOpd2E,FxOpd2F +EXTSYM FxOpd30,FxOpd30A1,FxOpd31,FxOpd31A1,FxOpd32,FxOpd32A1,FxOpd33,FxOpd33A1 +EXTSYM FxOpd34,FxOpd34A1,FxOpd35,FxOpd35A1,FxOpd36,FxOpd36A1,FxOpd37,FxOpd37A1 +EXTSYM FxOpd38,FxOpd38A1,FxOpd39,FxOpd39A1,FxOpd3A,FxOpd3AA1,FxOpd3B,FxOpd3BA1 +EXTSYM FxOpd3C,FxOpd3D,FxOpd3E,FxOpd3F,FxOpd40,FxOpd40A1,FxOpd41,FxOpd41A1 +EXTSYM FxOpd42,FxOpd42A1,FxOpd43,FxOpd43A1,FxOpd44,FxOpd44A1,FxOpd45,FxOpd45A1 +EXTSYM FxOpd46,FxOpd46A1,FxOpd47,FxOpd47A1,FxOpd48,FxOpd48A1,FxOpd49,FxOpd49A1 +EXTSYM FxOpd4A,FxOpd4AA1,FxOpd4B,FxOpd4BA1,FxOpd4C,FxOpd4CA1,FxOpd4D,FxOpd4E +EXTSYM FxOpd4EA1,FxOpd4F,FxOpd50,FxOpd50A1,FxOpd50A2,FxOpd50A3,FxOpd51,FxOpd51A1 +EXTSYM FxOpd51A2,FxOpd51A3,FxOpd52,FxOpd52A1,FxOpd52A2,FxOpd52A3,FxOpd53 +EXTSYM FxOpd53A1,FxOpd53A2,FxOpd53A3,FxOpd54,FxOpd54A1,FxOpd54A2,FxOpd54A3 +EXTSYM FxOpd55,FxOpd55A1,FxOpd55A2,FxOpd55A3,FxOpd56,FxOpd56A1,FxOpd56A2 +EXTSYM FxOpd56A3,FxOpd57,FxOpd57A1,FxOpd57A2,FxOpd57A3,FxOpd58,FxOpd58A1 +EXTSYM FxOpd58A2,FxOpd58A3,FxOpd59,FxOpd59A1,FxOpd59A2,FxOpd59A3,FxOpd5A +EXTSYM FxOpd5AA1,FxOpd5AA2,FxOpd5AA3,FxOpd5B,FxOpd5BA1,FxOpd5BA2,FxOpd5BA3 +EXTSYM FxOpd5C,FxOpd5CA1,FxOpd5CA2,FxOpd5CA3,FxOpd5D,FxOpd5DA1,FxOpd5DA2 +EXTSYM FxOpd5DA3,FxOpd5E,FxOpd5EA1,FxOpd5EA2,FxOpd5EA3,FxOpd5F,FxOpd5FA1 +EXTSYM FxOpd5FA2,FxOpd5FA3,FxOpd60,FxOpd60A1,FxOpd60A2,FxOpd60A3,FxOpd61 +EXTSYM FxOpd61A1,FxOpd61A2,FxOpd61A3,FxOpd62,FxOpd62A1,FxOpd62A2,FxOpd62A3 +EXTSYM FxOpd63,FxOpd63A1,FxOpd63A2,FxOpd63A3,FxOpd64,FxOpd64A1,FxOpd64A2 +EXTSYM FxOpd64A3,FxOpd65,FxOpd65A1,FxOpd65A2,FxOpd65A3,FxOpd66,FxOpd66A1 +EXTSYM FxOpd66A2,FxOpd66A3,FxOpd67,FxOpd67A1,FxOpd67A2,FxOpd67A3,FxOpd68 +EXTSYM FxOpd68A1,FxOpd68A2,FxOpd68A3,FxOpd69,FxOpd69A1,FxOpd69A2,FxOpd69A3 +EXTSYM FxOpd6A,FxOpd6AA1,FxOpd6AA2,FxOpd6AA3,FxOpd6B,FxOpd6BA1,FxOpd6BA2 +EXTSYM FxOpd6BA3,FxOpd6C,FxOpd6CA1,FxOpd6CA2,FxOpd6CA3,FxOpd6D,FxOpd6DA1 +EXTSYM FxOpd6DA2,FxOpd6DA3,FxOpd6E,FxOpd6EA1,FxOpd6EA2,FxOpd6EA3,FxOpd6F +EXTSYM FxOpd6FA1,FxOpd6FA2,FxOpd6FA3,FxOpd70,FxOpd71,FxOpd71A1,FxOpd71A2 +EXTSYM FxOpd71A3,FxOpd72,FxOpd72A1,FxOpd72A2,FxOpd72A3,FxOpd73,FxOpd73A1 +EXTSYM FxOpd73A2,FxOpd73A3,FxOpd74,FxOpd74A1,FxOpd74A2,FxOpd74A3,FxOpd75 +EXTSYM FxOpd75A1,FxOpd75A2,FxOpd75A3,FxOpd76,FxOpd76A1,FxOpd76A2,FxOpd76A3 +EXTSYM FxOpd77,FxOpd77A1,FxOpd77A2,FxOpd77A3,FxOpd78,FxOpd78A1,FxOpd78A2 +EXTSYM FxOpd78A3,FxOpd79,FxOpd79A1,FxOpd79A2,FxOpd79A3,FxOpd7A,FxOpd7AA1 +EXTSYM FxOpd7AA2,FxOpd7AA3,FxOpd7B,FxOpd7BA1,FxOpd7BA2,FxOpd7BA3,FxOpd7C +EXTSYM FxOpd7CA1,FxOpd7CA2,FxOpd7CA3,FxOpd7D,FxOpd7DA1,FxOpd7DA2,FxOpd7DA3 +EXTSYM FxOpd7E,FxOpd7EA1,FxOpd7EA2,FxOpd7EA3,FxOpd7F,FxOpd7FA1,FxOpd7FA2 +EXTSYM FxOpd7FA3,FxOpd80,FxOpd80A1,FxOpd80A2,FxOpd80A3,FxOpd81,FxOpd81A1 +EXTSYM FxOpd81A2,FxOpd81A3,FxOpd82,FxOpd82A1,FxOpd82A2,FxOpd82A3,FxOpd83 +EXTSYM FxOpd83A1,FxOpd83A2,FxOpd83A3,FxOpd84,FxOpd84A1,FxOpd84A2,FxOpd84A3 +EXTSYM FxOpd85,FxOpd85A1,FxOpd85A2,FxOpd85A3,FxOpd86,FxOpd86A1,FxOpd86A2 +EXTSYM FxOpd86A3,FxOpd87,FxOpd87A1,FxOpd87A2,FxOpd87A3,FxOpd88,FxOpd88A1 +EXTSYM FxOpd88A2,FxOpd88A3,FxOpd89,FxOpd89A1,FxOpd89A2,FxOpd89A3,FxOpd8A +EXTSYM FxOpd8AA1,FxOpd8AA2,FxOpd8AA3,FxOpd8B,FxOpd8BA1,FxOpd8BA2,FxOpd8BA3 +EXTSYM FxOpd8C,FxOpd8CA1,FxOpd8CA2,FxOpd8CA3,FxOpd8D,FxOpd8DA1,FxOpd8DA2 +EXTSYM FxOpd8DA3,FxOpd8E,FxOpd8EA1,FxOpd8EA2,FxOpd8EA3,FxOpd8F,FxOpd8FA1 +EXTSYM FxOpd8FA2,FxOpd8FA3,FxOpd90,FxOpd91,FxOpd92,FxOpd93,FxOpd94,FxOpd95 +EXTSYM FxOpd96,FxOpd96A1,FxOpd97,FxOpd98,FxOpd98A1,FxOpd99,FxOpd99A1,FxOpd9A +EXTSYM FxOpd9AA1,FxOpd9B,FxOpd9BA1,FxOpd9C,FxOpd9CA1,FxOpd9D,FxOpd9DA1,FxOpd9E +EXTSYM FxOpd9F,FxOpd9FA1,FxOpdA0,FxOpdA0A1,FxOpdA0A2,FxOpdA1,FxOpdA1A1,FxOpdA1A2 +EXTSYM FxOpdA2,FxOpdA2A1,FxOpdA2A2,FxOpdA3,FxOpdA3A1,FxOpdA3A2,FxOpdA4,FxOpdA4A1 +EXTSYM FxOpdA4A2,FxOpdA5,FxOpdA5A1,FxOpdA5A2,FxOpdA6,FxOpdA6A1,FxOpdA6A2,FxOpdA7 +EXTSYM FxOpdA7A1,FxOpdA7A2,FxOpdA8,FxOpdA8A1,FxOpdA8A2,FxOpdA9,FxOpdA9A1 +EXTSYM FxOpdA9A2,FxOpdAA,FxOpdAAA1,FxOpdAAA2,FxOpdAB,FxOpdABA1,FxOpdABA2 +EXTSYM FxOpdAC,FxOpdACA1,FxOpdACA2,FxOpdAD,FxOpdADA1,FxOpdADA2,FxOpdAE +EXTSYM FxOpdAEA1,FxOpdAEA2,FxOpdAF,FxOpdAFA1,FxOpdAFA2,FxOpdB0,FxOpdB1,FxOpdB2 +EXTSYM FxOpdB3,FxOpdB4,FxOpdB5,FxOpdB6,FxOpdB7,FxOpdB8,FxOpdB9,FxOpdBA,FxOpdBB +EXTSYM FxOpdBC,FxOpdBD,FxOpdBE,FxOpdBF,FxOpdC0,FxOpdC1,FxOpdC1A1,FxOpdC1A2 +EXTSYM FxOpdC1A3,FxOpdC2,FxOpdC2A1,FxOpdC2A2,FxOpdC2A3,FxOpdC3,FxOpdC3A1 +EXTSYM FxOpdC3A2,FxOpdC3A3,FxOpdC4,FxOpdC4A1,FxOpdC4A2,FxOpdC4A3,FxOpdC5 +EXTSYM FxOpdC5A1,FxOpdC5A2,FxOpdC5A3,FxOpdC6,FxOpdC6A1,FxOpdC6A2,FxOpdC6A3 +EXTSYM FxOpdC7,FxOpdC7A1,FxOpdC7A2,FxOpdC7A3,FxOpdC8,FxOpdC8A1,FxOpdC8A2 +EXTSYM FxOpdC8A3,FxOpdC9,FxOpdC9A1,FxOpdC9A2,FxOpdC9A3,FxOpdCA,FxOpdCAA1 +EXTSYM FxOpdCAA2,FxOpdCAA3,FxOpdCB,FxOpdCBA1,FxOpdCBA2,FxOpdCBA3,FxOpdCC +EXTSYM FxOpdCCA1,FxOpdCCA2,FxOpdCCA3,FxOpdCD,FxOpdCDA1,FxOpdCDA2,FxOpdCDA3 +EXTSYM FxOpdCE,FxOpdCEA1,FxOpdCEA2,FxOpdCEA3,FxOpdCF,FxOpdCFA1,FxOpdCFA2 +EXTSYM FxOpdCFA3,FxOpdD0,FxOpdD1,FxOpdD2,FxOpdD3,FxOpdD4,FxOpdD5,FxOpdD6 +EXTSYM FxOpdD7,FxOpdD8,FxOpdD9,FxOpdDA,FxOpdDB,FxOpdDC,FxOpdDD,FxOpdDE,FxOpdDF +EXTSYM FxOpdDFA2,FxOpdDFA3,FxOpdE0,FxOpdE1,FxOpdE2,FxOpdE3,FxOpdE4,FxOpdE5 +EXTSYM FxOpdE6,FxOpdE7,FxOpdE8,FxOpdE9,FxOpdEA,FxOpdEB,FxOpdEC,FxOpdED,FxOpdEE +EXTSYM FxOpdEF,FxOpdEFA1,FxOpdEFA2,FxOpdEFA3,FxOpdF0,FxOpdF0A1,FxOpdF0A2,FxOpdF1 +EXTSYM FxOpdF1A1,FxOpdF1A2,FxOpdF2,FxOpdF2A1,FxOpdF2A2,FxOpdF3,FxOpdF3A1,FxOpdF3A2 +EXTSYM FxOpdF4,FxOpdF4A1,FxOpdF4A2,FxOpdF5,FxOpdF5A1,FxOpdF5A2,FxOpdF6,FxOpdF6A1 +EXTSYM FxOpdF6A2,FxOpdF7,FxOpdF7A1,FxOpdF7A2,FxOpdF8,FxOpdF8A1,FxOpdF8A2,FxOpdF9 +EXTSYM FxOpdF9A1,FxOpdF9A2,FxOpdFA,FxOpdFAA1,FxOpdFAA2,FxOpdFB,FxOpdFBA1,FxOpdFBA2 +EXTSYM FxOpdFC,FxOpdFCA1,FxOpdFCA2,FxOpdFD,FxOpdFDA1,FxOpdFDA2,FxOpdFE,FxOpdFEA1 +EXTSYM FxOpdFEA2,FxOpdFF,FxOpdFFA1,FxOpdFFA2,PLOTJmpa,PLOTJmpb + +EXTSYM FxOp4C1284b,FxOp4C1284bz,FxOp4C1284bd,FxOp4C1284bzd +EXTSYM FxOp4C1282b,FxOp4C1282bz,FxOp4C1282bd,FxOp4C1282bzd +EXTSYM FxOp4C1288b,FxOp4C1288bz,FxOp4C1288bd,FxOp4C1288bzd +EXTSYM FxOp4C1288bl,FxOp4C1288bzl,FxOp4C1288bdl,FxOp4C1288bzdl +EXTSYM FxOpd4C1284b,FxOpd4C1284bz,FxOpd4C1284bd,FxOpd4C1284bzd +EXTSYM FxOpd4C1282b,FxOpd4C1282bz,FxOpd4C1282bd,FxOpd4C1282bzd +EXTSYM FxOpd4C1288b,FxOpd4C1288bz,FxOpd4C1288bd,FxOpd4C1288bzd +EXTSYM FxOpd4C1288bl,FxOpd4C1288bzl,FxOpd4C1288bdl,FxOpd4C1288bzdl + + +EXTSYM fxxand,fxbit01,fxbit23,fxbit45,fxbit67 + +NEWSYM FxTableAsmStart + +SECTION .bss ;ALIGN=32 +NEWSYM sfx128lineloc, resd 1 +NEWSYM sfx160lineloc, resd 1 +NEWSYM sfx192lineloc, resd 1 +NEWSYM sfxobjlineloc, resd 1 + +SECTION .text + +NEWSYM InitFxTables + +; cmp al,0 +; je near .colors4 +; cmp al,3 +; je near .colors256 +; test byte[SfxPOR],01h +; jz .zerocheck +; test byte[SfxPOR],02h +; jz .nodither4b + ; Initiate PLOT jump tables + xor ebx,ebx + mov ecx,64 + mov eax,PLOTJmpa +.ploop + mov edx,ebx + push ebx + and edx,03h + test bl,04h + jz near .zerocheck + test bl,08h + jnz .dither + cmp dl,0 + je .colors4 + cmp dl,3 + je .colors256 + mov ebx,FxOp4C1284b + jmp .end +.colors4 + mov ebx,FxOp4C1282b + jmp .end +.colors256 + test bl,20h + jnz .lowercheck + mov ebx,FxOp4C1288b + jmp .end +.lowercheck + mov ebx,FxOp4C1288bl + jmp .end +.dither + cmp dl,0 + je .colors4d + cmp dl,3 + je .colors256d + mov ebx,FxOp4C1284bd + jmp .end +.colors4d + mov ebx,FxOp4C1282bd + jmp .end +.colors256d + test bl,20h + jnz .lowercheckd + mov ebx,FxOp4C1288bd + jmp .end +.lowercheckd + mov ebx,FxOp4C1288bdl + jmp .end +.zerocheck + test bl,08h + jnz .ditherz + cmp dl,0 + je .colors4z + cmp dl,3 + je .colors256z + mov ebx,FxOp4C1284bz + jmp .end +.colors4z + mov ebx,FxOp4C1282bz + jmp .end +.colors256z + test bl,20h + jnz .lowercheckz + mov ebx,FxOp4C1288bz + jmp .end +.lowercheckz + mov ebx,FxOp4C1288bzl + jmp .end +.ditherz + cmp dl,0 + je .colors4dz + cmp dl,3 + je .colors256dz + mov ebx,FxOp4C1284bzd + jmp .end +.colors4dz + mov ebx,FxOp4C1282bzd + jmp .end +.colors256dz + test bl,20h + jnz .lowercheckdz + mov ebx,FxOp4C1288bzd + jmp .end +.lowercheckdz + mov ebx,FxOp4C1288bzdl +.end + mov [eax],ebx + pop ebx + inc ebx + add eax,4 + dec ecx + jnz near .ploop + + xor ebx,ebx + mov ecx,64 + mov eax,PLOTJmpb +.ploop2 + mov edx,ebx + push ebx + and edx,03h + test bl,04h + jz near .zerocheck2 + test bl,08h + jnz .dither2 + cmp dl,0 + je .colors42 + cmp dl,3 + je .colors2562 + mov ebx,FxOpd4C1284b + jmp .end2 +.colors42 + mov ebx,FxOpd4C1282b + jmp .end2 +.colors2562 + test bl,20h + jnz .lowercheck2 + mov ebx,FxOpd4C1288b + jmp .end2 +.lowercheck2 + mov ebx,FxOpd4C1288bl + jmp .end2 +.dither2 + cmp dl,0 + je .colors4d2 + cmp dl,3 + je .colors256d2 + mov ebx,FxOpd4C1284bd + jmp .end2 +.colors4d2 + mov ebx,FxOpd4C1282bd + jmp .end2 +.colors256d2 + test bl,20h + jnz .lowercheckd2 + mov ebx,FxOpd4C1288bd + jmp .end2 +.lowercheckd2 + mov ebx,FxOpd4C1288bdl + jmp .end2 +.zerocheck2 + test bl,08h + jnz .ditherz2 + cmp dl,0 + je .colors4z2 + cmp dl,3 + je .colors256z2 + mov ebx,FxOpd4C1284bz + jmp .end2 +.colors4z2 + mov ebx,FxOpd4C1282bz + jmp .end2 +.colors256z2 + test bl,20h + jnz .lowercheckz2 + mov ebx,FxOpd4C1288bz + jmp .end2 +.lowercheckz2 + mov ebx,FxOpd4C1288bzl + jmp .end2 +.ditherz2 + cmp dl,0 + je .colors4dz2 + cmp dl,3 + je .colors256dz2 + mov ebx,FxOpd4C1284bzd + jmp .end2 +.colors4dz2 + mov ebx,FxOpd4C1282bzd + jmp .end2 +.colors256dz2 + test bl,20h + jnz .lowercheckdz2 + mov ebx,FxOpd4C1288bzd + jmp .end2 +.lowercheckdz2 + mov ebx,FxOpd4C1288bzdl +.end2 + mov [eax],ebx + pop ebx + inc ebx + add eax,4 + dec ecx + jnz near .ploop2 + + ; Initiate AND and bit tables + mov eax,fxxand + mov ecx,256 + xor ebx,ebx +.loopat + push ecx + mov ecx,ebx + and ecx,07h + xor ecx,07h + mov edx,0101h + shl edx,cl + xor edx,0FFFFFFFFh + pop ecx + mov [eax],edx + inc ebx + add eax,4 + dec ecx + jnz .loopat + ; bit tables + mov eax,fxbit01 + mov ecx,256 + xor ebx,ebx +.loopb01 + xor edx,edx + test ebx,01h + jz .nob0 + or edx,0FFh +.nob0 + test ebx,02h + jz .nob1 + or edx,0FF00h +.nob1 + mov [eax],edx + xor edx,edx + test ebx,04h + jz .nob2 + or edx,0FFh +.nob2 + test ebx,08h + jz .nob3 + or edx,0FF00h +.nob3 + mov [eax+256*4],edx + xor edx,edx + test ebx,10h + jz .nob4 + or edx,0FFh +.nob4 + test ebx,20h + jz .nob5 + or edx,0FF00h +.nob5 + mov [eax+256*8],edx + xor edx,edx + test ebx,40h + jz .nob6 + or edx,0FFh +.nob6 + test ebx,80h + jz .nob7 + or edx,0FF00h +.nob7 + mov [eax+256*12],edx + add eax,4 + inc ebx + dec ecx + jnz near .loopb01 + + ; Initialize PLOT tables +; mov esi,[sfxramdata] + mov esi,[sfxplottable] +; add esi,1024*1024 + ; Create 4 * 256k plot tables + ; 128 line mode + mov [sfx128lineloc],esi + xor eax,eax + xor ebx,ebx +.nexty +.nextx + cmp eax,128 + jae .over + push eax + push ebx + shr eax,3 + shr ebx,3 + shl ebx,4 + add ebx,eax + mov [esi],ebx + add esi,4 + pop ebx + pop eax + jmp .notover +.over + mov dword[esi],0FFFFFFFFh + add esi,4 +.notover + inc al + jnz .nextx + inc bl + jnz .nexty + ; 160 line mode + mov [sfx160lineloc],esi +.nexty2 +.nextx2 + cmp eax,160 + jae .over2 + push eax + push ebx + shr eax,3 + shr ebx,3 + mov edx,ebx + shl ebx,4 + shl edx,2 + add ebx,eax + add ebx,edx + mov [esi],ebx + add esi,4 + pop ebx + pop eax + jmp .notover2 +.over2 + mov dword[esi],0FFFFFFFFh + add esi,4 +.notover2 + inc al + jnz .nextx2 + inc bl + jnz .nexty2 + ; 192 line mode + mov [sfx192lineloc],esi +.nexty3 +.nextx3 + cmp eax,192 + jae .over3 + push eax + push ebx + shr eax,3 + shr ebx,3 + mov edx,ebx + shl ebx,4 + shl edx,3 + add ebx,eax + add ebx,edx + mov [esi],ebx + add esi,4 + pop ebx + pop eax + jmp .notover3 +.over3 + mov dword[esi],0FFFFFFFFh + add esi,4 +.notover3 + inc al + jnz .nextx3 + inc bl + jnz .nexty3 + ; obj mode + mov [sfxobjlineloc],esi +.nexty4 +.nextx4 + push eax + push ebx + and ebx,80h + and eax,80h + shl ebx,1 + shl eax,2 + add ebx,eax + mov edx,ebx + pop ebx + pop eax + push eax + push ebx + and ebx,78h + and eax,78h + shr ebx,3 + shl eax,1 + add ebx,eax + add edx,ebx + pop ebx + pop eax + mov [esi],edx + add esi,4 + inc al + jnz .nextx4 + inc bl + jnz .nexty4 + + mov eax,[romdata] + xor ebx,ebx + mov ecx,256 +.loopc + mov [SfxMemTable+ebx*4],eax + inc ebx + dec ecx + jnz .loopc + + mov eax,[romdata] + add eax,200000h + xor ebx,ebx + mov ecx,64 +.loop + mov [SfxMemTable+ebx*4],eax + add eax,65536 + inc ebx + dec ecx + jnz .loop + + mov eax,[romdata] + mov ecx,64 +.loop2 + mov [SfxMemTable+ebx*4],eax + add eax,65536 + inc ebx + dec ecx + jnz .loop2 + + mov eax,[sfxramdata] + mov [SfxMemTable+70h*4],eax + add eax,65536 + mov [SfxMemTable+71h*4],eax + add eax,65536 + mov [SfxMemTable+72h*4],eax + add eax,65536 + mov [SfxMemTable+73h*4],eax + + mov eax,[romdata] + add eax,200000h + + xor ebx,ebx + mov ebx,80h + mov ecx,64 +.loops + mov [SfxMemTable+ebx*4],eax + add eax,65536 + inc ebx + dec ecx + jnz .loops + + mov eax,[romdata] + mov ecx,64 +.loop2s + mov [SfxMemTable+ebx*4],eax + add eax,65536 + inc ebx + dec ecx + jnz .loop2s + mov eax,[sfxramdata] + mov [SfxMemTable+0F0h*4],eax + add eax,65536 + mov [SfxMemTable+0F1h*4],eax + add eax,65536 + mov [SfxMemTable+0F2h*4],eax + add eax,65536 + mov [SfxMemTable+0F3h*4],eax + + mov dword [FxTable+00h*4],FxOp00 + mov dword [FxTable+01h*4],FxOp01 + mov dword [FxTable+02h*4],FxOp02 + mov dword [FxTable+03h*4],FxOp03 + mov dword [FxTable+04h*4],FxOp04 + mov dword [FxTable+05h*4],FxOp05 + mov dword [FxTable+06h*4],FxOp06 + mov dword [FxTable+07h*4],FxOp07 + mov dword [FxTable+08h*4],FxOp08 + mov dword [FxTable+09h*4],FxOp09 + mov dword [FxTable+0Ah*4],FxOp0A + mov dword [FxTable+0Bh*4],FxOp0B + mov dword [FxTable+0Ch*4],FxOp0C + mov dword [FxTable+0Dh*4],FxOp0D + mov dword [FxTable+0Eh*4],FxOp0E + mov dword [FxTable+0Fh*4],FxOp0F + + mov dword [FxTable+10h*4],FxOp10 + mov dword [FxTable+11h*4],FxOp11 + mov dword [FxTable+12h*4],FxOp12 + mov dword [FxTable+13h*4],FxOp13 + mov dword [FxTable+14h*4],FxOp14 + mov dword [FxTable+15h*4],FxOp15 + mov dword [FxTable+16h*4],FxOp16 + mov dword [FxTable+17h*4],FxOp17 + mov dword [FxTable+18h*4],FxOp18 + mov dword [FxTable+19h*4],FxOp19 + mov dword [FxTable+1Ah*4],FxOp1A + mov dword [FxTable+1Bh*4],FxOp1B + mov dword [FxTable+1Ch*4],FxOp1C + mov dword [FxTable+1Dh*4],FxOp1D + mov dword [FxTable+1Eh*4],FxOp1E + mov dword [FxTable+1Fh*4],FxOp1F + + mov dword [FxTable+20h*4],FxOp20 + mov dword [FxTable+21h*4],FxOp21 + mov dword [FxTable+22h*4],FxOp22 + mov dword [FxTable+23h*4],FxOp23 + mov dword [FxTable+24h*4],FxOp24 + mov dword [FxTable+25h*4],FxOp25 + mov dword [FxTable+26h*4],FxOp26 + mov dword [FxTable+27h*4],FxOp27 + mov dword [FxTable+28h*4],FxOp28 + mov dword [FxTable+29h*4],FxOp29 + mov dword [FxTable+2Ah*4],FxOp2A + mov dword [FxTable+2Bh*4],FxOp2B + mov dword [FxTable+2Ch*4],FxOp2C + mov dword [FxTable+2Dh*4],FxOp2D + mov dword [FxTable+2Eh*4],FxOp2E + mov dword [FxTable+2Fh*4],FxOp2F + + mov dword [FxTable+30h*4],FxOp30 + mov dword [FxTable+31h*4],FxOp31 + mov dword [FxTable+32h*4],FxOp32 + mov dword [FxTable+33h*4],FxOp33 + mov dword [FxTable+34h*4],FxOp34 + mov dword [FxTable+35h*4],FxOp35 + mov dword [FxTable+36h*4],FxOp36 + mov dword [FxTable+37h*4],FxOp37 + mov dword [FxTable+38h*4],FxOp38 + mov dword [FxTable+39h*4],FxOp39 + mov dword [FxTable+3Ah*4],FxOp3A + mov dword [FxTable+3Bh*4],FxOp3B + mov dword [FxTable+3Ch*4],FxOp3C + mov dword [FxTable+3Dh*4],FxOp3D + mov dword [FxTable+3Eh*4],FxOp3E + mov dword [FxTable+3Fh*4],FxOp3F + + mov dword [FxTable+40h*4],FxOp40 + mov dword [FxTable+41h*4],FxOp41 + mov dword [FxTable+42h*4],FxOp42 + mov dword [FxTable+43h*4],FxOp43 + mov dword [FxTable+44h*4],FxOp44 + mov dword [FxTable+45h*4],FxOp45 + mov dword [FxTable+46h*4],FxOp46 + mov dword [FxTable+47h*4],FxOp47 + mov dword [FxTable+48h*4],FxOp48 + mov dword [FxTable+49h*4],FxOp49 + mov dword [FxTable+4Ah*4],FxOp4A + mov dword [FxTable+4Bh*4],FxOp4B + mov dword [FxTable+4Ch*4],FxOp4C + mov dword [FxTable+4Dh*4],FxOp4D + mov dword [FxTable+4Eh*4],FxOp4E + mov dword [FxTable+4Fh*4],FxOp4F + + mov dword [FxTable+50h*4],FxOp50 + mov dword [FxTable+51h*4],FxOp51 + mov dword [FxTable+52h*4],FxOp52 + mov dword [FxTable+53h*4],FxOp53 + mov dword [FxTable+54h*4],FxOp54 + mov dword [FxTable+55h*4],FxOp55 + mov dword [FxTable+56h*4],FxOp56 + mov dword [FxTable+57h*4],FxOp57 + mov dword [FxTable+58h*4],FxOp58 + mov dword [FxTable+59h*4],FxOp59 + mov dword [FxTable+5Ah*4],FxOp5A + mov dword [FxTable+5Bh*4],FxOp5B + mov dword [FxTable+5Ch*4],FxOp5C + mov dword [FxTable+5Dh*4],FxOp5D + mov dword [FxTable+5Eh*4],FxOp5E + mov dword [FxTable+5Fh*4],FxOp5F + + mov dword [FxTable+60h*4],FxOp60 + mov dword [FxTable+61h*4],FxOp61 + mov dword [FxTable+62h*4],FxOp62 + mov dword [FxTable+63h*4],FxOp63 + mov dword [FxTable+64h*4],FxOp64 + mov dword [FxTable+65h*4],FxOp65 + mov dword [FxTable+66h*4],FxOp66 + mov dword [FxTable+67h*4],FxOp67 + mov dword [FxTable+68h*4],FxOp68 + mov dword [FxTable+69h*4],FxOp69 + mov dword [FxTable+6Ah*4],FxOp6A + mov dword [FxTable+6Bh*4],FxOp6B + mov dword [FxTable+6Ch*4],FxOp6C + mov dword [FxTable+6Dh*4],FxOp6D + mov dword [FxTable+6Eh*4],FxOp6E + mov dword [FxTable+6Fh*4],FxOp6F + + mov dword [FxTable+70h*4],FxOp70 + mov dword [FxTable+71h*4],FxOp71 + mov dword [FxTable+72h*4],FxOp72 + mov dword [FxTable+73h*4],FxOp73 + mov dword [FxTable+74h*4],FxOp74 + mov dword [FxTable+75h*4],FxOp75 + mov dword [FxTable+76h*4],FxOp76 + mov dword [FxTable+77h*4],FxOp77 + mov dword [FxTable+78h*4],FxOp78 + mov dword [FxTable+79h*4],FxOp79 + mov dword [FxTable+7Ah*4],FxOp7A + mov dword [FxTable+7Bh*4],FxOp7B + mov dword [FxTable+7Ch*4],FxOp7C + mov dword [FxTable+7Dh*4],FxOp7D + mov dword [FxTable+7Eh*4],FxOp7E + mov dword [FxTable+7Fh*4],FxOp7F + + mov dword [FxTable+80h*4],FxOp80 + mov dword [FxTable+81h*4],FxOp81 + mov dword [FxTable+82h*4],FxOp82 + mov dword [FxTable+83h*4],FxOp83 + mov dword [FxTable+84h*4],FxOp84 + mov dword [FxTable+85h*4],FxOp85 + mov dword [FxTable+86h*4],FxOp86 + mov dword [FxTable+87h*4],FxOp87 + mov dword [FxTable+88h*4],FxOp88 + mov dword [FxTable+89h*4],FxOp89 + mov dword [FxTable+8Ah*4],FxOp8A + mov dword [FxTable+8Bh*4],FxOp8B + mov dword [FxTable+8Ch*4],FxOp8C + mov dword [FxTable+8Dh*4],FxOp8D + mov dword [FxTable+8Eh*4],FxOp8E + mov dword [FxTable+8Fh*4],FxOp8F + + mov dword [FxTable+90h*4],FxOp90 + mov dword [FxTable+91h*4],FxOp91 + mov dword [FxTable+92h*4],FxOp92 + mov dword [FxTable+93h*4],FxOp93 + mov dword [FxTable+94h*4],FxOp94 + mov dword [FxTable+95h*4],FxOp95 + mov dword [FxTable+96h*4],FxOp96 + mov dword [FxTable+97h*4],FxOp97 + mov dword [FxTable+98h*4],FxOp98 + mov dword [FxTable+99h*4],FxOp99 + mov dword [FxTable+9Ah*4],FxOp9A + mov dword [FxTable+9Bh*4],FxOp9B + mov dword [FxTable+9Ch*4],FxOp9C + mov dword [FxTable+9Dh*4],FxOp9D + mov dword [FxTable+9Eh*4],FxOp9E + mov dword [FxTable+9Fh*4],FxOp9F + + mov dword [FxTable+0A0h*4],FxOpA0 + mov dword [FxTable+0A1h*4],FxOpA1 + mov dword [FxTable+0A2h*4],FxOpA2 + mov dword [FxTable+0A3h*4],FxOpA3 + mov dword [FxTable+0A4h*4],FxOpA4 + mov dword [FxTable+0A5h*4],FxOpA5 + mov dword [FxTable+0A6h*4],FxOpA6 + mov dword [FxTable+0A7h*4],FxOpA7 + mov dword [FxTable+0A8h*4],FxOpA8 + mov dword [FxTable+0A9h*4],FxOpA9 + mov dword [FxTable+0AAh*4],FxOpAA + mov dword [FxTable+0ABh*4],FxOpAB + mov dword [FxTable+0ACh*4],FxOpAC + mov dword [FxTable+0ADh*4],FxOpAD + mov dword [FxTable+0AEh*4],FxOpAE + mov dword [FxTable+0AFh*4],FxOpAF + + mov dword [FxTable+0B0h*4],FxOpB0 + mov dword [FxTable+0B1h*4],FxOpB1 + mov dword [FxTable+0B2h*4],FxOpB2 + mov dword [FxTable+0B3h*4],FxOpB3 + mov dword [FxTable+0B4h*4],FxOpB4 + mov dword [FxTable+0B5h*4],FxOpB5 + mov dword [FxTable+0B6h*4],FxOpB6 + mov dword [FxTable+0B7h*4],FxOpB7 + mov dword [FxTable+0B8h*4],FxOpB8 + mov dword [FxTable+0B9h*4],FxOpB9 + mov dword [FxTable+0BAh*4],FxOpBA + mov dword [FxTable+0BBh*4],FxOpBB + mov dword [FxTable+0BCh*4],FxOpBC + mov dword [FxTable+0BDh*4],FxOpBD + mov dword [FxTable+0BEh*4],FxOpBE + mov dword [FxTable+0BFh*4],FxOpBF + + mov dword [FxTable+0C0h*4],FxOpC0 + mov dword [FxTable+0C1h*4],FxOpC1 + mov dword [FxTable+0C2h*4],FxOpC2 + mov dword [FxTable+0C3h*4],FxOpC3 + mov dword [FxTable+0C4h*4],FxOpC4 + mov dword [FxTable+0C5h*4],FxOpC5 + mov dword [FxTable+0C6h*4],FxOpC6 + mov dword [FxTable+0C7h*4],FxOpC7 + mov dword [FxTable+0C8h*4],FxOpC8 + mov dword [FxTable+0C9h*4],FxOpC9 + mov dword [FxTable+0CAh*4],FxOpCA + mov dword [FxTable+0CBh*4],FxOpCB + mov dword [FxTable+0CCh*4],FxOpCC + mov dword [FxTable+0CDh*4],FxOpCD + mov dword [FxTable+0CEh*4],FxOpCE + mov dword [FxTable+0CFh*4],FxOpCF + + mov dword [FxTable+0D0h*4],FxOpD0 + mov dword [FxTable+0D1h*4],FxOpD1 + mov dword [FxTable+0D2h*4],FxOpD2 + mov dword [FxTable+0D3h*4],FxOpD3 + mov dword [FxTable+0D4h*4],FxOpD4 + mov dword [FxTable+0D5h*4],FxOpD5 + mov dword [FxTable+0D6h*4],FxOpD6 + mov dword [FxTable+0D7h*4],FxOpD7 + mov dword [FxTable+0D8h*4],FxOpD8 + mov dword [FxTable+0D9h*4],FxOpD9 + mov dword [FxTable+0DAh*4],FxOpDA + mov dword [FxTable+0DBh*4],FxOpDB + mov dword [FxTable+0DCh*4],FxOpDC + mov dword [FxTable+0DDh*4],FxOpDD + mov dword [FxTable+0DEh*4],FxOpDE + mov dword [FxTable+0DFh*4],FxOpDF + + mov dword [FxTable+0E0h*4],FxOpE0 + mov dword [FxTable+0E1h*4],FxOpE1 + mov dword [FxTable+0E2h*4],FxOpE2 + mov dword [FxTable+0E3h*4],FxOpE3 + mov dword [FxTable+0E4h*4],FxOpE4 + mov dword [FxTable+0E5h*4],FxOpE5 + mov dword [FxTable+0E6h*4],FxOpE6 + mov dword [FxTable+0E7h*4],FxOpE7 + mov dword [FxTable+0E8h*4],FxOpE8 + mov dword [FxTable+0E9h*4],FxOpE9 + mov dword [FxTable+0EAh*4],FxOpEA + mov dword [FxTable+0EBh*4],FxOpEB + mov dword [FxTable+0ECh*4],FxOpEC + mov dword [FxTable+0EDh*4],FxOpED + mov dword [FxTable+0EEh*4],FxOpEE + mov dword [FxTable+0EFh*4],FxOpEF + + mov dword [FxTable+0F0h*4],FxOpF0 + mov dword [FxTable+0F1h*4],FxOpF1 + mov dword [FxTable+0F2h*4],FxOpF2 + mov dword [FxTable+0F3h*4],FxOpF3 + mov dword [FxTable+0F4h*4],FxOpF4 + mov dword [FxTable+0F5h*4],FxOpF5 + mov dword [FxTable+0F6h*4],FxOpF6 + mov dword [FxTable+0F7h*4],FxOpF7 + mov dword [FxTable+0F8h*4],FxOpF8 + mov dword [FxTable+0F9h*4],FxOpF9 + mov dword [FxTable+0FAh*4],FxOpFA + mov dword [FxTable+0FBh*4],FxOpFB + mov dword [FxTable+0FCh*4],FxOpFC + mov dword [FxTable+0FDh*4],FxOpFD + mov dword [FxTable+0FEh*4],FxOpFE + mov dword [FxTable+0FFh*4],FxOpFF + + + mov dword [FxTableA1+00h*4],FxOp00 + mov dword [FxTableA1+01h*4],FxOp01 + mov dword [FxTableA1+02h*4],FxOp02 + mov dword [FxTableA1+03h*4],FxOp03 + mov dword [FxTableA1+04h*4],FxOp04 + mov dword [FxTableA1+05h*4],FxOp05 + mov dword [FxTableA1+06h*4],FxOp06 + mov dword [FxTableA1+07h*4],FxOp07 + mov dword [FxTableA1+08h*4],FxOp08 + mov dword [FxTableA1+09h*4],FxOp09 + mov dword [FxTableA1+0Ah*4],FxOp0A + mov dword [FxTableA1+0Bh*4],FxOp0B + mov dword [FxTableA1+0Ch*4],FxOp0C + mov dword [FxTableA1+0Dh*4],FxOp0D + mov dword [FxTableA1+0Eh*4],FxOp0E + mov dword [FxTableA1+0Fh*4],FxOp0F + + mov dword [FxTableA1+10h*4],FxOp10 + mov dword [FxTableA1+11h*4],FxOp11 + mov dword [FxTableA1+12h*4],FxOp12 + mov dword [FxTableA1+13h*4],FxOp13 + mov dword [FxTableA1+14h*4],FxOp14 + mov dword [FxTableA1+15h*4],FxOp15 + mov dword [FxTableA1+16h*4],FxOp16 + mov dword [FxTableA1+17h*4],FxOp17 + mov dword [FxTableA1+18h*4],FxOp18 + mov dword [FxTableA1+19h*4],FxOp19 + mov dword [FxTableA1+1Ah*4],FxOp1A + mov dword [FxTableA1+1Bh*4],FxOp1B + mov dword [FxTableA1+1Ch*4],FxOp1C + mov dword [FxTableA1+1Dh*4],FxOp1D + mov dword [FxTableA1+1Eh*4],FxOp1E + mov dword [FxTableA1+1Fh*4],FxOp1F + + mov dword [FxTableA1+20h*4],FxOp20 + mov dword [FxTableA1+21h*4],FxOp21 + mov dword [FxTableA1+22h*4],FxOp22 + mov dword [FxTableA1+23h*4],FxOp23 + mov dword [FxTableA1+24h*4],FxOp24 + mov dword [FxTableA1+25h*4],FxOp25 + mov dword [FxTableA1+26h*4],FxOp26 + mov dword [FxTableA1+27h*4],FxOp27 + mov dword [FxTableA1+28h*4],FxOp28 + mov dword [FxTableA1+29h*4],FxOp29 + mov dword [FxTableA1+2Ah*4],FxOp2A + mov dword [FxTableA1+2Bh*4],FxOp2B + mov dword [FxTableA1+2Ch*4],FxOp2C + mov dword [FxTableA1+2Dh*4],FxOp2D + mov dword [FxTableA1+2Eh*4],FxOp2E + mov dword [FxTableA1+2Fh*4],FxOp2F + + mov dword [FxTableA1+30h*4],FxOp30A1 + mov dword [FxTableA1+31h*4],FxOp31A1 + mov dword [FxTableA1+32h*4],FxOp32A1 + mov dword [FxTableA1+33h*4],FxOp33A1 + mov dword [FxTableA1+34h*4],FxOp34A1 + mov dword [FxTableA1+35h*4],FxOp35A1 + mov dword [FxTableA1+36h*4],FxOp36A1 + mov dword [FxTableA1+37h*4],FxOp37A1 + mov dword [FxTableA1+38h*4],FxOp38A1 + mov dword [FxTableA1+39h*4],FxOp39A1 + mov dword [FxTableA1+3Ah*4],FxOp3AA1 + mov dword [FxTableA1+3Bh*4],FxOp3BA1 + mov dword [FxTableA1+3Ch*4],FxOp3C + mov dword [FxTableA1+3Dh*4],FxOp3D + mov dword [FxTableA1+3Eh*4],FxOp3E + mov dword [FxTableA1+3Fh*4],FxOp3F + + mov dword [FxTableA1+40h*4],FxOp40A1 + mov dword [FxTableA1+41h*4],FxOp41A1 + mov dword [FxTableA1+42h*4],FxOp42A1 + mov dword [FxTableA1+43h*4],FxOp43A1 + mov dword [FxTableA1+44h*4],FxOp44A1 + mov dword [FxTableA1+45h*4],FxOp45A1 + mov dword [FxTableA1+46h*4],FxOp46A1 + mov dword [FxTableA1+47h*4],FxOp47A1 + mov dword [FxTableA1+48h*4],FxOp48A1 + mov dword [FxTableA1+49h*4],FxOp49A1 + mov dword [FxTableA1+4Ah*4],FxOp4AA1 + mov dword [FxTableA1+4Bh*4],FxOp4BA1 + mov dword [FxTableA1+4Ch*4],FxOp4CA1 + mov dword [FxTableA1+4Dh*4],FxOp4D + mov dword [FxTableA1+4Eh*4],FxOp4EA1 + mov dword [FxTableA1+4Fh*4],FxOp4F + + mov dword [FxTableA1+50h*4],FxOp50A1 + mov dword [FxTableA1+51h*4],FxOp51A1 + mov dword [FxTableA1+52h*4],FxOp52A1 + mov dword [FxTableA1+53h*4],FxOp53A1 + mov dword [FxTableA1+54h*4],FxOp54A1 + mov dword [FxTableA1+55h*4],FxOp55A1 + mov dword [FxTableA1+56h*4],FxOp56A1 + mov dword [FxTableA1+57h*4],FxOp57A1 + mov dword [FxTableA1+58h*4],FxOp58A1 + mov dword [FxTableA1+59h*4],FxOp59A1 + mov dword [FxTableA1+5Ah*4],FxOp5AA1 + mov dword [FxTableA1+5Bh*4],FxOp5BA1 + mov dword [FxTableA1+5Ch*4],FxOp5CA1 + mov dword [FxTableA1+5Dh*4],FxOp5DA1 + mov dword [FxTableA1+5Eh*4],FxOp5EA1 + mov dword [FxTableA1+5Fh*4],FxOp5FA1 + + mov dword [FxTableA1+60h*4],FxOp60A1 + mov dword [FxTableA1+61h*4],FxOp61A1 + mov dword [FxTableA1+62h*4],FxOp62A1 + mov dword [FxTableA1+63h*4],FxOp63A1 + mov dword [FxTableA1+64h*4],FxOp64A1 + mov dword [FxTableA1+65h*4],FxOp65A1 + mov dword [FxTableA1+66h*4],FxOp66A1 + mov dword [FxTableA1+67h*4],FxOp67A1 + mov dword [FxTableA1+68h*4],FxOp68A1 + mov dword [FxTableA1+69h*4],FxOp69A1 + mov dword [FxTableA1+6Ah*4],FxOp6AA1 + mov dword [FxTableA1+6Bh*4],FxOp6BA1 + mov dword [FxTableA1+6Ch*4],FxOp6CA1 + mov dword [FxTableA1+6Dh*4],FxOp6DA1 + mov dword [FxTableA1+6Eh*4],FxOp6EA1 + mov dword [FxTableA1+6Fh*4],FxOp6FA1 + + mov dword [FxTableA1+70h*4],FxOp70 + mov dword [FxTableA1+71h*4],FxOp71A1 + mov dword [FxTableA1+72h*4],FxOp72A1 + mov dword [FxTableA1+73h*4],FxOp73A1 + mov dword [FxTableA1+74h*4],FxOp74A1 + mov dword [FxTableA1+75h*4],FxOp75A1 + mov dword [FxTableA1+76h*4],FxOp76A1 + mov dword [FxTableA1+77h*4],FxOp77A1 + mov dword [FxTableA1+78h*4],FxOp78A1 + mov dword [FxTableA1+79h*4],FxOp79A1 + mov dword [FxTableA1+7Ah*4],FxOp7AA1 + mov dword [FxTableA1+7Bh*4],FxOp7BA1 + mov dword [FxTableA1+7Ch*4],FxOp7CA1 + mov dword [FxTableA1+7Dh*4],FxOp7DA1 + mov dword [FxTableA1+7Eh*4],FxOp7EA1 + mov dword [FxTableA1+7Fh*4],FxOp7FA1 + + mov dword [FxTableA1+80h*4],FxOp80A1 + mov dword [FxTableA1+81h*4],FxOp81A1 + mov dword [FxTableA1+82h*4],FxOp82A1 + mov dword [FxTableA1+83h*4],FxOp83A1 + mov dword [FxTableA1+84h*4],FxOp84A1 + mov dword [FxTableA1+85h*4],FxOp85A1 + mov dword [FxTableA1+86h*4],FxOp86A1 + mov dword [FxTableA1+87h*4],FxOp87A1 + mov dword [FxTableA1+88h*4],FxOp88A1 + mov dword [FxTableA1+89h*4],FxOp89A1 + mov dword [FxTableA1+8Ah*4],FxOp8AA1 + mov dword [FxTableA1+8Bh*4],FxOp8BA1 + mov dword [FxTableA1+8Ch*4],FxOp8CA1 + mov dword [FxTableA1+8Dh*4],FxOp8DA1 + mov dword [FxTableA1+8Eh*4],FxOp8EA1 + mov dword [FxTableA1+8Fh*4],FxOp8FA1 + + mov dword [FxTableA1+90h*4],FxOp90 + mov dword [FxTableA1+91h*4],FxOp91 + mov dword [FxTableA1+92h*4],FxOp92 + mov dword [FxTableA1+93h*4],FxOp93 + mov dword [FxTableA1+94h*4],FxOp94 + mov dword [FxTableA1+95h*4],FxOp95 + mov dword [FxTableA1+96h*4],FxOp96A1 + mov dword [FxTableA1+97h*4],FxOp97 + mov dword [FxTableA1+98h*4],FxOp98A1 + mov dword [FxTableA1+99h*4],FxOp99A1 + mov dword [FxTableA1+9Ah*4],FxOp9AA1 + mov dword [FxTableA1+9Bh*4],FxOp9BA1 + mov dword [FxTableA1+9Ch*4],FxOp9CA1 + mov dword [FxTableA1+9Dh*4],FxOp9DA1 + mov dword [FxTableA1+9Eh*4],FxOp9E + mov dword [FxTableA1+9Fh*4],FxOp9FA1 + + mov dword [FxTableA1+0A0h*4],FxOpA0A1 + mov dword [FxTableA1+0A1h*4],FxOpA1A1 + mov dword [FxTableA1+0A2h*4],FxOpA2A1 + mov dword [FxTableA1+0A3h*4],FxOpA3A1 + mov dword [FxTableA1+0A4h*4],FxOpA4A1 + mov dword [FxTableA1+0A5h*4],FxOpA5A1 + mov dword [FxTableA1+0A6h*4],FxOpA6A1 + mov dword [FxTableA1+0A7h*4],FxOpA7A1 + mov dword [FxTableA1+0A8h*4],FxOpA8A1 + mov dword [FxTableA1+0A9h*4],FxOpA9A1 + mov dword [FxTableA1+0AAh*4],FxOpAAA1 + mov dword [FxTableA1+0ABh*4],FxOpABA1 + mov dword [FxTableA1+0ACh*4],FxOpACA1 + mov dword [FxTableA1+0ADh*4],FxOpADA1 + mov dword [FxTableA1+0AEh*4],FxOpAEA1 + mov dword [FxTableA1+0AFh*4],FxOpAFA1 + + mov dword [FxTableA1+0B0h*4],FxOpB0 + mov dword [FxTableA1+0B1h*4],FxOpB1 + mov dword [FxTableA1+0B2h*4],FxOpB2 + mov dword [FxTableA1+0B3h*4],FxOpB3 + mov dword [FxTableA1+0B4h*4],FxOpB4 + mov dword [FxTableA1+0B5h*4],FxOpB5 + mov dword [FxTableA1+0B6h*4],FxOpB6 + mov dword [FxTableA1+0B7h*4],FxOpB7 + mov dword [FxTableA1+0B8h*4],FxOpB8 + mov dword [FxTableA1+0B9h*4],FxOpB9 + mov dword [FxTableA1+0BAh*4],FxOpBA + mov dword [FxTableA1+0BBh*4],FxOpBB + mov dword [FxTableA1+0BCh*4],FxOpBC + mov dword [FxTableA1+0BDh*4],FxOpBD + mov dword [FxTableA1+0BEh*4],FxOpBE + mov dword [FxTableA1+0BFh*4],FxOpBF + + mov dword [FxTableA1+0C0h*4],FxOpC0 + mov dword [FxTableA1+0C1h*4],FxOpC1A1 + mov dword [FxTableA1+0C2h*4],FxOpC2A1 + mov dword [FxTableA1+0C3h*4],FxOpC3A1 + mov dword [FxTableA1+0C4h*4],FxOpC4A1 + mov dword [FxTableA1+0C5h*4],FxOpC5A1 + mov dword [FxTableA1+0C6h*4],FxOpC6A1 + mov dword [FxTableA1+0C7h*4],FxOpC7A1 + mov dword [FxTableA1+0C8h*4],FxOpC8A1 + mov dword [FxTableA1+0C9h*4],FxOpC9A1 + mov dword [FxTableA1+0CAh*4],FxOpCAA1 + mov dword [FxTableA1+0CBh*4],FxOpCBA1 + mov dword [FxTableA1+0CCh*4],FxOpCCA1 + mov dword [FxTableA1+0CDh*4],FxOpCDA1 + mov dword [FxTableA1+0CEh*4],FxOpCEA1 + mov dword [FxTableA1+0CFh*4],FxOpCFA1 + + mov dword [FxTableA1+0D0h*4],FxOpD0 + mov dword [FxTableA1+0D1h*4],FxOpD1 + mov dword [FxTableA1+0D2h*4],FxOpD2 + mov dword [FxTableA1+0D3h*4],FxOpD3 + mov dword [FxTableA1+0D4h*4],FxOpD4 + mov dword [FxTableA1+0D5h*4],FxOpD5 + mov dword [FxTableA1+0D6h*4],FxOpD6 + mov dword [FxTableA1+0D7h*4],FxOpD7 + mov dword [FxTableA1+0D8h*4],FxOpD8 + mov dword [FxTableA1+0D9h*4],FxOpD9 + mov dword [FxTableA1+0DAh*4],FxOpDA + mov dword [FxTableA1+0DBh*4],FxOpDB + mov dword [FxTableA1+0DCh*4],FxOpDC + mov dword [FxTableA1+0DDh*4],FxOpDD + mov dword [FxTableA1+0DEh*4],FxOpDE + mov dword [FxTableA1+0DFh*4],FxOpDF + + mov dword [FxTableA1+0E0h*4],FxOpE0 + mov dword [FxTableA1+0E1h*4],FxOpE1 + mov dword [FxTableA1+0E2h*4],FxOpE2 + mov dword [FxTableA1+0E3h*4],FxOpE3 + mov dword [FxTableA1+0E4h*4],FxOpE4 + mov dword [FxTableA1+0E5h*4],FxOpE5 + mov dword [FxTableA1+0E6h*4],FxOpE6 + mov dword [FxTableA1+0E7h*4],FxOpE7 + mov dword [FxTableA1+0E8h*4],FxOpE8 + mov dword [FxTableA1+0E9h*4],FxOpE9 + mov dword [FxTableA1+0EAh*4],FxOpEA + mov dword [FxTableA1+0EBh*4],FxOpEB + mov dword [FxTableA1+0ECh*4],FxOpEC + mov dword [FxTableA1+0EDh*4],FxOpED + mov dword [FxTableA1+0EEh*4],FxOpEE + mov dword [FxTableA1+0EFh*4],FxOpEFA1 + + mov dword [FxTableA1+0F0h*4],FxOpF0A1 + mov dword [FxTableA1+0F1h*4],FxOpF1A1 + mov dword [FxTableA1+0F2h*4],FxOpF2A1 + mov dword [FxTableA1+0F3h*4],FxOpF3A1 + mov dword [FxTableA1+0F4h*4],FxOpF4A1 + mov dword [FxTableA1+0F5h*4],FxOpF5A1 + mov dword [FxTableA1+0F6h*4],FxOpF6A1 + mov dword [FxTableA1+0F7h*4],FxOpF7A1 + mov dword [FxTableA1+0F8h*4],FxOpF8A1 + mov dword [FxTableA1+0F9h*4],FxOpF9A1 + mov dword [FxTableA1+0FAh*4],FxOpFAA1 + mov dword [FxTableA1+0FBh*4],FxOpFBA1 + mov dword [FxTableA1+0FCh*4],FxOpFCA1 + mov dword [FxTableA1+0FDh*4],FxOpFDA1 + mov dword [FxTableA1+0FEh*4],FxOpFEA1 + mov dword [FxTableA1+0FFh*4],FxOpFFA1 + + + mov dword [FxTableA2+00h*4],FxOp00 + mov dword [FxTableA2+01h*4],FxOp01 + mov dword [FxTableA2+02h*4],FxOp02 + mov dword [FxTableA2+03h*4],FxOp03 + mov dword [FxTableA2+04h*4],FxOp04 + mov dword [FxTableA2+05h*4],FxOp05 + mov dword [FxTableA2+06h*4],FxOp06 + mov dword [FxTableA2+07h*4],FxOp07 + mov dword [FxTableA2+08h*4],FxOp08 + mov dword [FxTableA2+09h*4],FxOp09 + mov dword [FxTableA2+0Ah*4],FxOp0A + mov dword [FxTableA2+0Bh*4],FxOp0B + mov dword [FxTableA2+0Ch*4],FxOp0C + mov dword [FxTableA2+0Dh*4],FxOp0D + mov dword [FxTableA2+0Eh*4],FxOp0E + mov dword [FxTableA2+0Fh*4],FxOp0F + + mov dword [FxTableA2+10h*4],FxOp10 + mov dword [FxTableA2+11h*4],FxOp11 + mov dword [FxTableA2+12h*4],FxOp12 + mov dword [FxTableA2+13h*4],FxOp13 + mov dword [FxTableA2+14h*4],FxOp14 + mov dword [FxTableA2+15h*4],FxOp15 + mov dword [FxTableA2+16h*4],FxOp16 + mov dword [FxTableA2+17h*4],FxOp17 + mov dword [FxTableA2+18h*4],FxOp18 + mov dword [FxTableA2+19h*4],FxOp19 + mov dword [FxTableA2+1Ah*4],FxOp1A + mov dword [FxTableA2+1Bh*4],FxOp1B + mov dword [FxTableA2+1Ch*4],FxOp1C + mov dword [FxTableA2+1Dh*4],FxOp1D + mov dword [FxTableA2+1Eh*4],FxOp1E + mov dword [FxTableA2+1Fh*4],FxOp1F + + mov dword [FxTableA2+20h*4],FxOp20 + mov dword [FxTableA2+21h*4],FxOp21 + mov dword [FxTableA2+22h*4],FxOp22 + mov dword [FxTableA2+23h*4],FxOp23 + mov dword [FxTableA2+24h*4],FxOp24 + mov dword [FxTableA2+25h*4],FxOp25 + mov dword [FxTableA2+26h*4],FxOp26 + mov dword [FxTableA2+27h*4],FxOp27 + mov dword [FxTableA2+28h*4],FxOp28 + mov dword [FxTableA2+29h*4],FxOp29 + mov dword [FxTableA2+2Ah*4],FxOp2A + mov dword [FxTableA2+2Bh*4],FxOp2B + mov dword [FxTableA2+2Ch*4],FxOp2C + mov dword [FxTableA2+2Dh*4],FxOp2D + mov dword [FxTableA2+2Eh*4],FxOp2E + mov dword [FxTableA2+2Fh*4],FxOp2F + + mov dword [FxTableA2+30h*4],FxOp30 + mov dword [FxTableA2+31h*4],FxOp31 + mov dword [FxTableA2+32h*4],FxOp32 + mov dword [FxTableA2+33h*4],FxOp33 + mov dword [FxTableA2+34h*4],FxOp34 + mov dword [FxTableA2+35h*4],FxOp35 + mov dword [FxTableA2+36h*4],FxOp36 + mov dword [FxTableA2+37h*4],FxOp37 + mov dword [FxTableA2+38h*4],FxOp38 + mov dword [FxTableA2+39h*4],FxOp39 + mov dword [FxTableA2+3Ah*4],FxOp3A + mov dword [FxTableA2+3Bh*4],FxOp3B + mov dword [FxTableA2+3Ch*4],FxOp3C + mov dword [FxTableA2+3Dh*4],FxOp3D + mov dword [FxTableA2+3Eh*4],FxOp3E + mov dword [FxTableA2+3Fh*4],FxOp3F + + mov dword [FxTableA2+40h*4],FxOp40 + mov dword [FxTableA2+41h*4],FxOp41 + mov dword [FxTableA2+42h*4],FxOp42 + mov dword [FxTableA2+43h*4],FxOp43 + mov dword [FxTableA2+44h*4],FxOp44 + mov dword [FxTableA2+45h*4],FxOp45 + mov dword [FxTableA2+46h*4],FxOp46 + mov dword [FxTableA2+47h*4],FxOp47 + mov dword [FxTableA2+48h*4],FxOp48 + mov dword [FxTableA2+49h*4],FxOp49 + mov dword [FxTableA2+4Ah*4],FxOp4A + mov dword [FxTableA2+4Bh*4],FxOp4B + mov dword [FxTableA2+4Ch*4],FxOp4C + mov dword [FxTableA2+4Dh*4],FxOp4D + mov dword [FxTableA2+4Eh*4],FxOp4E + mov dword [FxTableA2+4Fh*4],FxOp4F + + mov dword [FxTableA2+50h*4],FxOp50A2 + mov dword [FxTableA2+51h*4],FxOp51A2 + mov dword [FxTableA2+52h*4],FxOp52A2 + mov dword [FxTableA2+53h*4],FxOp53A2 + mov dword [FxTableA2+54h*4],FxOp54A2 + mov dword [FxTableA2+55h*4],FxOp55A2 + mov dword [FxTableA2+56h*4],FxOp56A2 + mov dword [FxTableA2+57h*4],FxOp57A2 + mov dword [FxTableA2+58h*4],FxOp58A2 + mov dword [FxTableA2+59h*4],FxOp59A2 + mov dword [FxTableA2+5Ah*4],FxOp5AA2 + mov dword [FxTableA2+5Bh*4],FxOp5BA2 + mov dword [FxTableA2+5Ch*4],FxOp5CA2 + mov dword [FxTableA2+5Dh*4],FxOp5DA2 + mov dword [FxTableA2+5Eh*4],FxOp5EA2 + mov dword [FxTableA2+5Fh*4],FxOp5FA2 + + mov dword [FxTableA2+60h*4],FxOp60A2 + mov dword [FxTableA2+61h*4],FxOp61A2 + mov dword [FxTableA2+62h*4],FxOp62A2 + mov dword [FxTableA2+63h*4],FxOp63A2 + mov dword [FxTableA2+64h*4],FxOp64A2 + mov dword [FxTableA2+65h*4],FxOp65A2 + mov dword [FxTableA2+66h*4],FxOp66A2 + mov dword [FxTableA2+67h*4],FxOp67A2 + mov dword [FxTableA2+68h*4],FxOp68A2 + mov dword [FxTableA2+69h*4],FxOp69A2 + mov dword [FxTableA2+6Ah*4],FxOp6AA2 + mov dword [FxTableA2+6Bh*4],FxOp6BA2 + mov dword [FxTableA2+6Ch*4],FxOp6CA2 + mov dword [FxTableA2+6Dh*4],FxOp6DA2 + mov dword [FxTableA2+6Eh*4],FxOp6EA2 + mov dword [FxTableA2+6Fh*4],FxOp6FA2 + + mov dword [FxTableA2+70h*4],FxOp70 + mov dword [FxTableA2+71h*4],FxOp71A2 + mov dword [FxTableA2+72h*4],FxOp72A2 + mov dword [FxTableA2+73h*4],FxOp73A2 + mov dword [FxTableA2+74h*4],FxOp74A2 + mov dword [FxTableA2+75h*4],FxOp75A2 + mov dword [FxTableA2+76h*4],FxOp76A2 + mov dword [FxTableA2+77h*4],FxOp77A2 + mov dword [FxTableA2+78h*4],FxOp78A2 + mov dword [FxTableA2+79h*4],FxOp79A2 + mov dword [FxTableA2+7Ah*4],FxOp7AA2 + mov dword [FxTableA2+7Bh*4],FxOp7BA2 + mov dword [FxTableA2+7Ch*4],FxOp7CA2 + mov dword [FxTableA2+7Dh*4],FxOp7DA2 + mov dword [FxTableA2+7Eh*4],FxOp7EA2 + mov dword [FxTableA2+7Fh*4],FxOp7FA2 + + mov dword [FxTableA2+80h*4],FxOp80A2 + mov dword [FxTableA2+81h*4],FxOp81A2 + mov dword [FxTableA2+82h*4],FxOp82A2 + mov dword [FxTableA2+83h*4],FxOp83A2 + mov dword [FxTableA2+84h*4],FxOp84A2 + mov dword [FxTableA2+85h*4],FxOp85A2 + mov dword [FxTableA2+86h*4],FxOp86A2 + mov dword [FxTableA2+87h*4],FxOp87A2 + mov dword [FxTableA2+88h*4],FxOp88A2 + mov dword [FxTableA2+89h*4],FxOp89A2 + mov dword [FxTableA2+8Ah*4],FxOp8AA2 + mov dword [FxTableA2+8Bh*4],FxOp8BA2 + mov dword [FxTableA2+8Ch*4],FxOp8CA2 + mov dword [FxTableA2+8Dh*4],FxOp8DA2 + mov dword [FxTableA2+8Eh*4],FxOp8EA2 + mov dword [FxTableA2+8Fh*4],FxOp8FA2 + + mov dword [FxTableA2+90h*4],FxOp90 + mov dword [FxTableA2+91h*4],FxOp91 + mov dword [FxTableA2+92h*4],FxOp92 + mov dword [FxTableA2+93h*4],FxOp93 + mov dword [FxTableA2+94h*4],FxOp94 + mov dword [FxTableA2+95h*4],FxOp95 + mov dword [FxTableA2+96h*4],FxOp96 + mov dword [FxTableA2+97h*4],FxOp97 + mov dword [FxTableA2+98h*4],FxOp98 + mov dword [FxTableA2+99h*4],FxOp99 + mov dword [FxTableA2+9Ah*4],FxOp9A + mov dword [FxTableA2+9Bh*4],FxOp9B + mov dword [FxTableA2+9Ch*4],FxOp9C + mov dword [FxTableA2+9Dh*4],FxOp9D + mov dword [FxTableA2+9Eh*4],FxOp9E + mov dword [FxTableA2+9Fh*4],FxOp9F + + mov dword [FxTableA2+0A0h*4],FxOpA0A2 + mov dword [FxTableA2+0A1h*4],FxOpA1A2 + mov dword [FxTableA2+0A2h*4],FxOpA2A2 + mov dword [FxTableA2+0A3h*4],FxOpA3A2 + mov dword [FxTableA2+0A4h*4],FxOpA4A2 + mov dword [FxTableA2+0A5h*4],FxOpA5A2 + mov dword [FxTableA2+0A6h*4],FxOpA6A2 + mov dword [FxTableA2+0A7h*4],FxOpA7A2 + mov dword [FxTableA2+0A8h*4],FxOpA8A2 + mov dword [FxTableA2+0A9h*4],FxOpA9A2 + mov dword [FxTableA2+0AAh*4],FxOpAAA2 + mov dword [FxTableA2+0ABh*4],FxOpABA2 + mov dword [FxTableA2+0ACh*4],FxOpACA2 + mov dword [FxTableA2+0ADh*4],FxOpADA2 + mov dword [FxTableA2+0AEh*4],FxOpAEA2 + mov dword [FxTableA2+0AFh*4],FxOpAFA2 + + mov dword [FxTableA2+0B0h*4],FxOpB0 + mov dword [FxTableA2+0B1h*4],FxOpB1 + mov dword [FxTableA2+0B2h*4],FxOpB2 + mov dword [FxTableA2+0B3h*4],FxOpB3 + mov dword [FxTableA2+0B4h*4],FxOpB4 + mov dword [FxTableA2+0B5h*4],FxOpB5 + mov dword [FxTableA2+0B6h*4],FxOpB6 + mov dword [FxTableA2+0B7h*4],FxOpB7 + mov dword [FxTableA2+0B8h*4],FxOpB8 + mov dword [FxTableA2+0B9h*4],FxOpB9 + mov dword [FxTableA2+0BAh*4],FxOpBA + mov dword [FxTableA2+0BBh*4],FxOpBB + mov dword [FxTableA2+0BCh*4],FxOpBC + mov dword [FxTableA2+0BDh*4],FxOpBD + mov dword [FxTableA2+0BEh*4],FxOpBE + mov dword [FxTableA2+0BFh*4],FxOpBF + + mov dword [FxTableA2+0C0h*4],FxOpC0 + mov dword [FxTableA2+0C1h*4],FxOpC1A2 + mov dword [FxTableA2+0C2h*4],FxOpC2A2 + mov dword [FxTableA2+0C3h*4],FxOpC3A2 + mov dword [FxTableA2+0C4h*4],FxOpC4A2 + mov dword [FxTableA2+0C5h*4],FxOpC5A2 + mov dword [FxTableA2+0C6h*4],FxOpC6A2 + mov dword [FxTableA2+0C7h*4],FxOpC7A2 + mov dword [FxTableA2+0C8h*4],FxOpC8A2 + mov dword [FxTableA2+0C9h*4],FxOpC9A2 + mov dword [FxTableA2+0CAh*4],FxOpCAA2 + mov dword [FxTableA2+0CBh*4],FxOpCBA2 + mov dword [FxTableA2+0CCh*4],FxOpCCA2 + mov dword [FxTableA2+0CDh*4],FxOpCDA2 + mov dword [FxTableA2+0CEh*4],FxOpCEA2 + mov dword [FxTableA2+0CFh*4],FxOpCFA2 + + mov dword [FxTableA2+0D0h*4],FxOpD0 + mov dword [FxTableA2+0D1h*4],FxOpD1 + mov dword [FxTableA2+0D2h*4],FxOpD2 + mov dword [FxTableA2+0D3h*4],FxOpD3 + mov dword [FxTableA2+0D4h*4],FxOpD4 + mov dword [FxTableA2+0D5h*4],FxOpD5 + mov dword [FxTableA2+0D6h*4],FxOpD6 + mov dword [FxTableA2+0D7h*4],FxOpD7 + mov dword [FxTableA2+0D8h*4],FxOpD8 + mov dword [FxTableA2+0D9h*4],FxOpD9 + mov dword [FxTableA2+0DAh*4],FxOpDA + mov dword [FxTableA2+0DBh*4],FxOpDB + mov dword [FxTableA2+0DCh*4],FxOpDC + mov dword [FxTableA2+0DDh*4],FxOpDD + mov dword [FxTableA2+0DEh*4],FxOpDE + mov dword [FxTableA2+0DFh*4],FxOpDFA2 + + mov dword [FxTableA2+0E0h*4],FxOpE0 + mov dword [FxTableA2+0E1h*4],FxOpE1 + mov dword [FxTableA2+0E2h*4],FxOpE2 + mov dword [FxTableA2+0E3h*4],FxOpE3 + mov dword [FxTableA2+0E4h*4],FxOpE4 + mov dword [FxTableA2+0E5h*4],FxOpE5 + mov dword [FxTableA2+0E6h*4],FxOpE6 + mov dword [FxTableA2+0E7h*4],FxOpE7 + mov dword [FxTableA2+0E8h*4],FxOpE8 + mov dword [FxTableA2+0E9h*4],FxOpE9 + mov dword [FxTableA2+0EAh*4],FxOpEA + mov dword [FxTableA2+0EBh*4],FxOpEB + mov dword [FxTableA2+0ECh*4],FxOpEC + mov dword [FxTableA2+0EDh*4],FxOpED + mov dword [FxTableA2+0EEh*4],FxOpEE + mov dword [FxTableA2+0EFh*4],FxOpEFA2 + + mov dword [FxTableA2+0F0h*4],FxOpF0A2 + mov dword [FxTableA2+0F1h*4],FxOpF1A2 + mov dword [FxTableA2+0F2h*4],FxOpF2A2 + mov dword [FxTableA2+0F3h*4],FxOpF3A2 + mov dword [FxTableA2+0F4h*4],FxOpF4A2 + mov dword [FxTableA2+0F5h*4],FxOpF5A2 + mov dword [FxTableA2+0F6h*4],FxOpF6A2 + mov dword [FxTableA2+0F7h*4],FxOpF7A2 + mov dword [FxTableA2+0F8h*4],FxOpF8A2 + mov dword [FxTableA2+0F9h*4],FxOpF9A2 + mov dword [FxTableA2+0FAh*4],FxOpFAA2 + mov dword [FxTableA2+0FBh*4],FxOpFBA2 + mov dword [FxTableA2+0FCh*4],FxOpFCA2 + mov dword [FxTableA2+0FDh*4],FxOpFDA2 + mov dword [FxTableA2+0FEh*4],FxOpFEA2 + mov dword [FxTableA2+0FFh*4],FxOpFFA2 + + mov dword [FxTableA3+00h*4],FxOp00 + mov dword [FxTableA3+01h*4],FxOp01 + mov dword [FxTableA3+02h*4],FxOp02 + mov dword [FxTableA3+03h*4],FxOp03 + mov dword [FxTableA3+04h*4],FxOp04 + mov dword [FxTableA3+05h*4],FxOp05 + mov dword [FxTableA3+06h*4],FxOp06 + mov dword [FxTableA3+07h*4],FxOp07 + mov dword [FxTableA3+08h*4],FxOp08 + mov dword [FxTableA3+09h*4],FxOp09 + mov dword [FxTableA3+0Ah*4],FxOp0A + mov dword [FxTableA3+0Bh*4],FxOp0B + mov dword [FxTableA3+0Ch*4],FxOp0C + mov dword [FxTableA3+0Dh*4],FxOp0D + mov dword [FxTableA3+0Eh*4],FxOp0E + mov dword [FxTableA3+0Fh*4],FxOp0F + + mov dword [FxTableA3+10h*4],FxOp10 + mov dword [FxTableA3+11h*4],FxOp11 + mov dword [FxTableA3+12h*4],FxOp12 + mov dword [FxTableA3+13h*4],FxOp13 + mov dword [FxTableA3+14h*4],FxOp14 + mov dword [FxTableA3+15h*4],FxOp15 + mov dword [FxTableA3+16h*4],FxOp16 + mov dword [FxTableA3+17h*4],FxOp17 + mov dword [FxTableA3+18h*4],FxOp18 + mov dword [FxTableA3+19h*4],FxOp19 + mov dword [FxTableA3+1Ah*4],FxOp1A + mov dword [FxTableA3+1Bh*4],FxOp1B + mov dword [FxTableA3+1Ch*4],FxOp1C + mov dword [FxTableA3+1Dh*4],FxOp1D + mov dword [FxTableA3+1Eh*4],FxOp1E + mov dword [FxTableA3+1Fh*4],FxOp1F + + mov dword [FxTableA3+20h*4],FxOp20 + mov dword [FxTableA3+21h*4],FxOp21 + mov dword [FxTableA3+22h*4],FxOp22 + mov dword [FxTableA3+23h*4],FxOp23 + mov dword [FxTableA3+24h*4],FxOp24 + mov dword [FxTableA3+25h*4],FxOp25 + mov dword [FxTableA3+26h*4],FxOp26 + mov dword [FxTableA3+27h*4],FxOp27 + mov dword [FxTableA3+28h*4],FxOp28 + mov dword [FxTableA3+29h*4],FxOp29 + mov dword [FxTableA3+2Ah*4],FxOp2A + mov dword [FxTableA3+2Bh*4],FxOp2B + mov dword [FxTableA3+2Ch*4],FxOp2C + mov dword [FxTableA3+2Dh*4],FxOp2D + mov dword [FxTableA3+2Eh*4],FxOp2E + mov dword [FxTableA3+2Fh*4],FxOp2F + + mov dword [FxTableA3+30h*4],FxOp30 + mov dword [FxTableA3+31h*4],FxOp31 + mov dword [FxTableA3+32h*4],FxOp32 + mov dword [FxTableA3+33h*4],FxOp33 + mov dword [FxTableA3+34h*4],FxOp34 + mov dword [FxTableA3+35h*4],FxOp35 + mov dword [FxTableA3+36h*4],FxOp36 + mov dword [FxTableA3+37h*4],FxOp37 + mov dword [FxTableA3+38h*4],FxOp38 + mov dword [FxTableA3+39h*4],FxOp39 + mov dword [FxTableA3+3Ah*4],FxOp3A + mov dword [FxTableA3+3Bh*4],FxOp3B + mov dword [FxTableA3+3Ch*4],FxOp3C + mov dword [FxTableA3+3Dh*4],FxOp3D + mov dword [FxTableA3+3Eh*4],FxOp3E + mov dword [FxTableA3+3Fh*4],FxOp3F + + mov dword [FxTableA3+40h*4],FxOp40 + mov dword [FxTableA3+41h*4],FxOp41 + mov dword [FxTableA3+42h*4],FxOp42 + mov dword [FxTableA3+43h*4],FxOp43 + mov dword [FxTableA3+44h*4],FxOp44 + mov dword [FxTableA3+45h*4],FxOp45 + mov dword [FxTableA3+46h*4],FxOp46 + mov dword [FxTableA3+47h*4],FxOp47 + mov dword [FxTableA3+48h*4],FxOp48 + mov dword [FxTableA3+49h*4],FxOp49 + mov dword [FxTableA3+4Ah*4],FxOp4A + mov dword [FxTableA3+4Bh*4],FxOp4B + mov dword [FxTableA3+4Ch*4],FxOp4C + mov dword [FxTableA3+4Dh*4],FxOp4D + mov dword [FxTableA3+4Eh*4],FxOp4E + mov dword [FxTableA3+4Fh*4],FxOp4F + + mov dword [FxTableA3+50h*4],FxOp50A3 + mov dword [FxTableA3+51h*4],FxOp51A3 + mov dword [FxTableA3+52h*4],FxOp52A3 + mov dword [FxTableA3+53h*4],FxOp53A3 + mov dword [FxTableA3+54h*4],FxOp54A3 + mov dword [FxTableA3+55h*4],FxOp55A3 + mov dword [FxTableA3+56h*4],FxOp56A3 + mov dword [FxTableA3+57h*4],FxOp57A3 + mov dword [FxTableA3+58h*4],FxOp58A3 + mov dword [FxTableA3+59h*4],FxOp59A3 + mov dword [FxTableA3+5Ah*4],FxOp5AA3 + mov dword [FxTableA3+5Bh*4],FxOp5BA3 + mov dword [FxTableA3+5Ch*4],FxOp5CA3 + mov dword [FxTableA3+5Dh*4],FxOp5DA3 + mov dword [FxTableA3+5Eh*4],FxOp5EA3 + mov dword [FxTableA3+5Fh*4],FxOp5FA3 + + mov dword [FxTableA3+60h*4],FxOp60A3 + mov dword [FxTableA3+61h*4],FxOp61A3 + mov dword [FxTableA3+62h*4],FxOp62A3 + mov dword [FxTableA3+63h*4],FxOp63A3 + mov dword [FxTableA3+64h*4],FxOp64A3 + mov dword [FxTableA3+65h*4],FxOp65A3 + mov dword [FxTableA3+66h*4],FxOp66A3 + mov dword [FxTableA3+67h*4],FxOp67A3 + mov dword [FxTableA3+68h*4],FxOp68A3 + mov dword [FxTableA3+69h*4],FxOp69A3 + mov dword [FxTableA3+6Ah*4],FxOp6AA3 + mov dword [FxTableA3+6Bh*4],FxOp6BA3 + mov dword [FxTableA3+6Ch*4],FxOp6CA3 + mov dword [FxTableA3+6Dh*4],FxOp6DA3 + mov dword [FxTableA3+6Eh*4],FxOp6EA3 + mov dword [FxTableA3+6Fh*4],FxOp6FA3 + + mov dword [FxTableA3+70h*4],FxOp70 + mov dword [FxTableA3+71h*4],FxOp71A3 + mov dword [FxTableA3+72h*4],FxOp72A3 + mov dword [FxTableA3+73h*4],FxOp73A3 + mov dword [FxTableA3+74h*4],FxOp74A3 + mov dword [FxTableA3+75h*4],FxOp75A3 + mov dword [FxTableA3+76h*4],FxOp76A3 + mov dword [FxTableA3+77h*4],FxOp77A3 + mov dword [FxTableA3+78h*4],FxOp78A3 + mov dword [FxTableA3+79h*4],FxOp79A3 + mov dword [FxTableA3+7Ah*4],FxOp7AA3 + mov dword [FxTableA3+7Bh*4],FxOp7BA3 + mov dword [FxTableA3+7Ch*4],FxOp7CA3 + mov dword [FxTableA3+7Dh*4],FxOp7DA3 + mov dword [FxTableA3+7Eh*4],FxOp7EA3 + mov dword [FxTableA3+7Fh*4],FxOp7FA3 + + mov dword [FxTableA3+80h*4],FxOp80A3 + mov dword [FxTableA3+81h*4],FxOp81A3 + mov dword [FxTableA3+82h*4],FxOp82A3 + mov dword [FxTableA3+83h*4],FxOp83A3 + mov dword [FxTableA3+84h*4],FxOp84A3 + mov dword [FxTableA3+85h*4],FxOp85A3 + mov dword [FxTableA3+86h*4],FxOp86A3 + mov dword [FxTableA3+87h*4],FxOp87A3 + mov dword [FxTableA3+88h*4],FxOp88A3 + mov dword [FxTableA3+89h*4],FxOp89A3 + mov dword [FxTableA3+8Ah*4],FxOp8AA3 + mov dword [FxTableA3+8Bh*4],FxOp8BA3 + mov dword [FxTableA3+8Ch*4],FxOp8CA3 + mov dword [FxTableA3+8Dh*4],FxOp8DA3 + mov dword [FxTableA3+8Eh*4],FxOp8EA3 + mov dword [FxTableA3+8Fh*4],FxOp8FA3 + + mov dword [FxTableA3+90h*4],FxOp90 + mov dword [FxTableA3+91h*4],FxOp91 + mov dword [FxTableA3+92h*4],FxOp92 + mov dword [FxTableA3+93h*4],FxOp93 + mov dword [FxTableA3+94h*4],FxOp94 + mov dword [FxTableA3+95h*4],FxOp95 + mov dword [FxTableA3+96h*4],FxOp96 + mov dword [FxTableA3+97h*4],FxOp97 + mov dword [FxTableA3+98h*4],FxOp98 + mov dword [FxTableA3+99h*4],FxOp99 + mov dword [FxTableA3+9Ah*4],FxOp9A + mov dword [FxTableA3+9Bh*4],FxOp9B + mov dword [FxTableA3+9Ch*4],FxOp9C + mov dword [FxTableA3+9Dh*4],FxOp9D + mov dword [FxTableA3+9Eh*4],FxOp9E + mov dword [FxTableA3+9Fh*4],FxOp9F + + mov dword [FxTableA3+0A0h*4],FxOpA0 + mov dword [FxTableA3+0A1h*4],FxOpA1 + mov dword [FxTableA3+0A2h*4],FxOpA2 + mov dword [FxTableA3+0A3h*4],FxOpA3 + mov dword [FxTableA3+0A4h*4],FxOpA4 + mov dword [FxTableA3+0A5h*4],FxOpA5 + mov dword [FxTableA3+0A6h*4],FxOpA6 + mov dword [FxTableA3+0A7h*4],FxOpA7 + mov dword [FxTableA3+0A8h*4],FxOpA8 + mov dword [FxTableA3+0A9h*4],FxOpA9 + mov dword [FxTableA3+0AAh*4],FxOpAA + mov dword [FxTableA3+0ABh*4],FxOpAB + mov dword [FxTableA3+0ACh*4],FxOpAC + mov dword [FxTableA3+0ADh*4],FxOpAD + mov dword [FxTableA3+0AEh*4],FxOpAE + mov dword [FxTableA3+0AFh*4],FxOpAF + + mov dword [FxTableA3+0B0h*4],FxOpB0 + mov dword [FxTableA3+0B1h*4],FxOpB1 + mov dword [FxTableA3+0B2h*4],FxOpB2 + mov dword [FxTableA3+0B3h*4],FxOpB3 + mov dword [FxTableA3+0B4h*4],FxOpB4 + mov dword [FxTableA3+0B5h*4],FxOpB5 + mov dword [FxTableA3+0B6h*4],FxOpB6 + mov dword [FxTableA3+0B7h*4],FxOpB7 + mov dword [FxTableA3+0B8h*4],FxOpB8 + mov dword [FxTableA3+0B9h*4],FxOpB9 + mov dword [FxTableA3+0BAh*4],FxOpBA + mov dword [FxTableA3+0BBh*4],FxOpBB + mov dword [FxTableA3+0BCh*4],FxOpBC + mov dword [FxTableA3+0BDh*4],FxOpBD + mov dword [FxTableA3+0BEh*4],FxOpBE + mov dword [FxTableA3+0BFh*4],FxOpBF + + mov dword [FxTableA3+0C0h*4],FxOpC0 + mov dword [FxTableA3+0C1h*4],FxOpC1A3 + mov dword [FxTableA3+0C2h*4],FxOpC2A3 + mov dword [FxTableA3+0C3h*4],FxOpC3A3 + mov dword [FxTableA3+0C4h*4],FxOpC4A3 + mov dword [FxTableA3+0C5h*4],FxOpC5A3 + mov dword [FxTableA3+0C6h*4],FxOpC6A3 + mov dword [FxTableA3+0C7h*4],FxOpC7A3 + mov dword [FxTableA3+0C8h*4],FxOpC8A3 + mov dword [FxTableA3+0C9h*4],FxOpC9A3 + mov dword [FxTableA3+0CAh*4],FxOpCAA3 + mov dword [FxTableA3+0CBh*4],FxOpCBA3 + mov dword [FxTableA3+0CCh*4],FxOpCCA3 + mov dword [FxTableA3+0CDh*4],FxOpCDA3 + mov dword [FxTableA3+0CEh*4],FxOpCEA3 + mov dword [FxTableA3+0CFh*4],FxOpCFA3 + + mov dword [FxTableA3+0D0h*4],FxOpD0 + mov dword [FxTableA3+0D1h*4],FxOpD1 + mov dword [FxTableA3+0D2h*4],FxOpD2 + mov dword [FxTableA3+0D3h*4],FxOpD3 + mov dword [FxTableA3+0D4h*4],FxOpD4 + mov dword [FxTableA3+0D5h*4],FxOpD5 + mov dword [FxTableA3+0D6h*4],FxOpD6 + mov dword [FxTableA3+0D7h*4],FxOpD7 + mov dword [FxTableA3+0D8h*4],FxOpD8 + mov dword [FxTableA3+0D9h*4],FxOpD9 + mov dword [FxTableA3+0DAh*4],FxOpDA + mov dword [FxTableA3+0DBh*4],FxOpDB + mov dword [FxTableA3+0DCh*4],FxOpDC + mov dword [FxTableA3+0DDh*4],FxOpDD + mov dword [FxTableA3+0DEh*4],FxOpDE + mov dword [FxTableA3+0DFh*4],FxOpDFA3 + + mov dword [FxTableA3+0E0h*4],FxOpE0 + mov dword [FxTableA3+0E1h*4],FxOpE1 + mov dword [FxTableA3+0E2h*4],FxOpE2 + mov dword [FxTableA3+0E3h*4],FxOpE3 + mov dword [FxTableA3+0E4h*4],FxOpE4 + mov dword [FxTableA3+0E5h*4],FxOpE5 + mov dword [FxTableA3+0E6h*4],FxOpE6 + mov dword [FxTableA3+0E7h*4],FxOpE7 + mov dword [FxTableA3+0E8h*4],FxOpE8 + mov dword [FxTableA3+0E9h*4],FxOpE9 + mov dword [FxTableA3+0EAh*4],FxOpEA + mov dword [FxTableA3+0EBh*4],FxOpEB + mov dword [FxTableA3+0ECh*4],FxOpEC + mov dword [FxTableA3+0EDh*4],FxOpED + mov dword [FxTableA3+0EEh*4],FxOpEE + mov dword [FxTableA3+0EFh*4],FxOpEFA3 + + mov dword [FxTableA3+0F0h*4],FxOpF0 + mov dword [FxTableA3+0F1h*4],FxOpF1 + mov dword [FxTableA3+0F2h*4],FxOpF2 + mov dword [FxTableA3+0F3h*4],FxOpF3 + mov dword [FxTableA3+0F4h*4],FxOpF4 + mov dword [FxTableA3+0F5h*4],FxOpF5 + mov dword [FxTableA3+0F6h*4],FxOpF6 + mov dword [FxTableA3+0F7h*4],FxOpF7 + mov dword [FxTableA3+0F8h*4],FxOpF8 + mov dword [FxTableA3+0F9h*4],FxOpF9 + mov dword [FxTableA3+0FAh*4],FxOpFA + mov dword [FxTableA3+0FBh*4],FxOpFB + mov dword [FxTableA3+0FCh*4],FxOpFC + mov dword [FxTableA3+0FDh*4],FxOpFD + mov dword [FxTableA3+0FEh*4],FxOpFE + mov dword [FxTableA3+0FFh*4],FxOpFF + + ; Transfer FxTable to FxTableb and FxTablec + mov esi,FxTable + mov edi,FxTableb + mov ecx,256*4 + rep movsd + mov esi,FxTable + mov edi,FxTablec + mov ecx,256*4 + rep movsd + + mov dword [FxTableb+05h*4],FxOpb05 + mov dword [FxTableb+06h*4],FxOpb06 + mov dword [FxTableb+07h*4],FxOpb07 + mov dword [FxTableb+08h*4],FxOpb08 + mov dword [FxTableb+09h*4],FxOpb09 + mov dword [FxTableb+0Ah*4],FxOpb0A + mov dword [FxTableb+0Bh*4],FxOpb0B + mov dword [FxTableb+0Ch*4],FxOpb0C + mov dword [FxTableb+0Dh*4],FxOpb0D + mov dword [FxTableb+0Eh*4],FxOpb0E + mov dword [FxTableb+0Fh*4],FxOpb0F + mov dword [FxTableb+10h*4],FxOpb10 + mov dword [FxTableb+11h*4],FxOpb11 + mov dword [FxTableb+12h*4],FxOpb12 + mov dword [FxTableb+13h*4],FxOpb13 + mov dword [FxTableb+14h*4],FxOpb14 + mov dword [FxTableb+15h*4],FxOpb15 + mov dword [FxTableb+16h*4],FxOpb16 + mov dword [FxTableb+17h*4],FxOpb17 + mov dword [FxTableb+18h*4],FxOpb18 + mov dword [FxTableb+19h*4],FxOpb19 + mov dword [FxTableb+1Ah*4],FxOpb1A + mov dword [FxTableb+1Bh*4],FxOpb1B + mov dword [FxTableb+1Ch*4],FxOpb1C + mov dword [FxTableb+1Dh*4],FxOpb1D + mov dword [FxTableb+1Eh*4],FxOpb1E + mov dword [FxTableb+1Fh*4],FxOpb1F + mov dword [FxTableb+3Dh*4],FxOpb3D + mov dword [FxTableb+3Eh*4],FxOpb3E + mov dword [FxTableb+3Fh*4],FxOpb3F + mov dword [FxTableb+0B0h*4],FxOpbB0 + mov dword [FxTableb+0B1h*4],FxOpbB1 + mov dword [FxTableb+0B2h*4],FxOpbB2 + mov dword [FxTableb+0B3h*4],FxOpbB3 + mov dword [FxTableb+0B4h*4],FxOpbB4 + mov dword [FxTableb+0B5h*4],FxOpbB5 + mov dword [FxTableb+0B6h*4],FxOpbB6 + mov dword [FxTableb+0B7h*4],FxOpbB7 + mov dword [FxTableb+0B8h*4],FxOpbB8 + mov dword [FxTableb+0B9h*4],FxOpbB9 + mov dword [FxTableb+0BAh*4],FxOpbBA + mov dword [FxTableb+0BBh*4],FxOpbBB + mov dword [FxTableb+0BCh*4],FxOpbBC + mov dword [FxTableb+0BDh*4],FxOpbBD + mov dword [FxTableb+0BEh*4],FxOpbBE + mov dword [FxTableb+0BFh*4],FxOpbBF + + mov dword [FxTablebA1+05h*4],FxOpb05 + mov dword [FxTablebA1+06h*4],FxOpb06 + mov dword [FxTablebA1+07h*4],FxOpb07 + mov dword [FxTablebA1+08h*4],FxOpb08 + mov dword [FxTablebA1+09h*4],FxOpb09 + mov dword [FxTablebA1+0Ah*4],FxOpb0A + mov dword [FxTablebA1+0Bh*4],FxOpb0B + mov dword [FxTablebA1+0Ch*4],FxOpb0C + mov dword [FxTablebA1+0Dh*4],FxOpb0D + mov dword [FxTablebA1+0Eh*4],FxOpb0E + mov dword [FxTablebA1+0Fh*4],FxOpb0F + mov dword [FxTablebA1+10h*4],FxOpb10 + mov dword [FxTablebA1+11h*4],FxOpb11 + mov dword [FxTablebA1+12h*4],FxOpb12 + mov dword [FxTablebA1+13h*4],FxOpb13 + mov dword [FxTablebA1+14h*4],FxOpb14 + mov dword [FxTablebA1+15h*4],FxOpb15 + mov dword [FxTablebA1+16h*4],FxOpb16 + mov dword [FxTablebA1+17h*4],FxOpb17 + mov dword [FxTablebA1+18h*4],FxOpb18 + mov dword [FxTablebA1+19h*4],FxOpb19 + mov dword [FxTablebA1+1Ah*4],FxOpb1A + mov dword [FxTablebA1+1Bh*4],FxOpb1B + mov dword [FxTablebA1+1Ch*4],FxOpb1C + mov dword [FxTablebA1+1Dh*4],FxOpb1D + mov dword [FxTablebA1+1Eh*4],FxOpb1E + mov dword [FxTablebA1+1Fh*4],FxOpb1F + mov dword [FxTablebA1+3Dh*4],FxOpb3D + mov dword [FxTablebA1+3Eh*4],FxOpb3E + mov dword [FxTablebA1+3Fh*4],FxOpb3F + mov dword [FxTablebA1+0B0h*4],FxOpbB0 + mov dword [FxTablebA1+0B1h*4],FxOpbB1 + mov dword [FxTablebA1+0B2h*4],FxOpbB2 + mov dword [FxTablebA1+0B3h*4],FxOpbB3 + mov dword [FxTablebA1+0B4h*4],FxOpbB4 + mov dword [FxTablebA1+0B5h*4],FxOpbB5 + mov dword [FxTablebA1+0B6h*4],FxOpbB6 + mov dword [FxTablebA1+0B7h*4],FxOpbB7 + mov dword [FxTablebA1+0B8h*4],FxOpbB8 + mov dword [FxTablebA1+0B9h*4],FxOpbB9 + mov dword [FxTablebA1+0BAh*4],FxOpbBA + mov dword [FxTablebA1+0BBh*4],FxOpbBB + mov dword [FxTablebA1+0BCh*4],FxOpbBC + mov dword [FxTablebA1+0BDh*4],FxOpbBD + mov dword [FxTablebA1+0BEh*4],FxOpbBE + mov dword [FxTablebA1+0BFh*4],FxOpbBF + + mov dword [FxTablebA2+05h*4],FxOpb05 + mov dword [FxTablebA2+06h*4],FxOpb06 + mov dword [FxTablebA2+07h*4],FxOpb07 + mov dword [FxTablebA2+08h*4],FxOpb08 + mov dword [FxTablebA2+09h*4],FxOpb09 + mov dword [FxTablebA2+0Ah*4],FxOpb0A + mov dword [FxTablebA2+0Bh*4],FxOpb0B + mov dword [FxTablebA2+0Ch*4],FxOpb0C + mov dword [FxTablebA2+0Dh*4],FxOpb0D + mov dword [FxTablebA2+0Eh*4],FxOpb0E + mov dword [FxTablebA2+0Fh*4],FxOpb0F + mov dword [FxTablebA2+10h*4],FxOpb10 + mov dword [FxTablebA2+11h*4],FxOpb11 + mov dword [FxTablebA2+12h*4],FxOpb12 + mov dword [FxTablebA2+13h*4],FxOpb13 + mov dword [FxTablebA2+14h*4],FxOpb14 + mov dword [FxTablebA2+15h*4],FxOpb15 + mov dword [FxTablebA2+16h*4],FxOpb16 + mov dword [FxTablebA2+17h*4],FxOpb17 + mov dword [FxTablebA2+18h*4],FxOpb18 + mov dword [FxTablebA2+19h*4],FxOpb19 + mov dword [FxTablebA2+1Ah*4],FxOpb1A + mov dword [FxTablebA2+1Bh*4],FxOpb1B + mov dword [FxTablebA2+1Ch*4],FxOpb1C + mov dword [FxTablebA2+1Dh*4],FxOpb1D + mov dword [FxTablebA2+1Eh*4],FxOpb1E + mov dword [FxTablebA2+1Fh*4],FxOpb1F + mov dword [FxTablebA2+3Dh*4],FxOpb3D + mov dword [FxTablebA2+3Eh*4],FxOpb3E + mov dword [FxTablebA2+3Fh*4],FxOpb3F + mov dword [FxTablebA2+0B0h*4],FxOpbB0 + mov dword [FxTablebA2+0B1h*4],FxOpbB1 + mov dword [FxTablebA2+0B2h*4],FxOpbB2 + mov dword [FxTablebA2+0B3h*4],FxOpbB3 + mov dword [FxTablebA2+0B4h*4],FxOpbB4 + mov dword [FxTablebA2+0B5h*4],FxOpbB5 + mov dword [FxTablebA2+0B6h*4],FxOpbB6 + mov dword [FxTablebA2+0B7h*4],FxOpbB7 + mov dword [FxTablebA2+0B8h*4],FxOpbB8 + mov dword [FxTablebA2+0B9h*4],FxOpbB9 + mov dword [FxTablebA2+0BAh*4],FxOpbBA + mov dword [FxTablebA2+0BBh*4],FxOpbBB + mov dword [FxTablebA2+0BCh*4],FxOpbBC + mov dword [FxTablebA2+0BDh*4],FxOpbBD + mov dword [FxTablebA2+0BEh*4],FxOpbBE + mov dword [FxTablebA2+0BFh*4],FxOpbBF + + mov dword [FxTablebA3+05h*4],FxOpb05 + mov dword [FxTablebA3+06h*4],FxOpb06 + mov dword [FxTablebA3+07h*4],FxOpb07 + mov dword [FxTablebA3+08h*4],FxOpb08 + mov dword [FxTablebA3+09h*4],FxOpb09 + mov dword [FxTablebA3+0Ah*4],FxOpb0A + mov dword [FxTablebA3+0Bh*4],FxOpb0B + mov dword [FxTablebA3+0Ch*4],FxOpb0C + mov dword [FxTablebA3+0Dh*4],FxOpb0D + mov dword [FxTablebA3+0Eh*4],FxOpb0E + mov dword [FxTablebA3+0Fh*4],FxOpb0F + mov dword [FxTablebA3+10h*4],FxOpb10 + mov dword [FxTablebA3+11h*4],FxOpb11 + mov dword [FxTablebA3+12h*4],FxOpb12 + mov dword [FxTablebA3+13h*4],FxOpb13 + mov dword [FxTablebA3+14h*4],FxOpb14 + mov dword [FxTablebA3+15h*4],FxOpb15 + mov dword [FxTablebA3+16h*4],FxOpb16 + mov dword [FxTablebA3+17h*4],FxOpb17 + mov dword [FxTablebA3+18h*4],FxOpb18 + mov dword [FxTablebA3+19h*4],FxOpb19 + mov dword [FxTablebA3+1Ah*4],FxOpb1A + mov dword [FxTablebA3+1Bh*4],FxOpb1B + mov dword [FxTablebA3+1Ch*4],FxOpb1C + mov dword [FxTablebA3+1Dh*4],FxOpb1D + mov dword [FxTablebA3+1Eh*4],FxOpb1E + mov dword [FxTablebA3+1Fh*4],FxOpb1F + mov dword [FxTablebA3+3Dh*4],FxOpb3D + mov dword [FxTablebA3+3Eh*4],FxOpb3E + mov dword [FxTablebA3+3Fh*4],FxOpb3F + mov dword [FxTablebA3+0B0h*4],FxOpbB0 + mov dword [FxTablebA3+0B1h*4],FxOpbB1 + mov dword [FxTablebA3+0B2h*4],FxOpbB2 + mov dword [FxTablebA3+0B3h*4],FxOpbB3 + mov dword [FxTablebA3+0B4h*4],FxOpbB4 + mov dword [FxTablebA3+0B5h*4],FxOpbB5 + mov dword [FxTablebA3+0B6h*4],FxOpbB6 + mov dword [FxTablebA3+0B7h*4],FxOpbB7 + mov dword [FxTablebA3+0B8h*4],FxOpbB8 + mov dword [FxTablebA3+0B9h*4],FxOpbB9 + mov dword [FxTablebA3+0BAh*4],FxOpbBA + mov dword [FxTablebA3+0BBh*4],FxOpbBB + mov dword [FxTablebA3+0BCh*4],FxOpbBC + mov dword [FxTablebA3+0BDh*4],FxOpbBD + mov dword [FxTablebA3+0BEh*4],FxOpbBE + mov dword [FxTablebA3+0BFh*4],FxOpbBF + + mov dword [FxTablec+05h*4],FxOpc05 + mov dword [FxTablec+06h*4],FxOpc06 + mov dword [FxTablec+07h*4],FxOpc07 + mov dword [FxTablec+08h*4],FxOpc08 + mov dword [FxTablec+09h*4],FxOpc09 + mov dword [FxTablec+0Ah*4],FxOpc0A + mov dword [FxTablec+0Bh*4],FxOpc0B + mov dword [FxTablec+0Ch*4],FxOpc0C + mov dword [FxTablec+0Dh*4],FxOpc0D + mov dword [FxTablec+0Eh*4],FxOpc0E + mov dword [FxTablec+0Fh*4],FxOpc0F + mov dword [FxTablec+10h*4],FxOpc10 + mov dword [FxTablec+11h*4],FxOpc11 + mov dword [FxTablec+12h*4],FxOpc12 + mov dword [FxTablec+13h*4],FxOpc13 + mov dword [FxTablec+14h*4],FxOpc14 + mov dword [FxTablec+15h*4],FxOpc15 + mov dword [FxTablec+16h*4],FxOpc16 + mov dword [FxTablec+17h*4],FxOpc17 + mov dword [FxTablec+18h*4],FxOpc18 + mov dword [FxTablec+19h*4],FxOpc19 + mov dword [FxTablec+1Ah*4],FxOpc1A + mov dword [FxTablec+1Bh*4],FxOpc1B + mov dword [FxTablec+1Ch*4],FxOpc1C + mov dword [FxTablec+1Dh*4],FxOpc1D + mov dword [FxTablec+1Eh*4],FxOpc1E + mov dword [FxTablec+1Fh*4],FxOpc1F + mov dword [FxTablec+3Dh*4],FxOpc3D + mov dword [FxTablec+3Eh*4],FxOpc3E + mov dword [FxTablec+3Fh*4],FxOpc3F + mov dword [FxTablec+0B0h*4],FxOpcB0 + mov dword [FxTablec+0B1h*4],FxOpcB1 + mov dword [FxTablec+0B2h*4],FxOpcB2 + mov dword [FxTablec+0B3h*4],FxOpcB3 + mov dword [FxTablec+0B4h*4],FxOpcB4 + mov dword [FxTablec+0B5h*4],FxOpcB5 + mov dword [FxTablec+0B6h*4],FxOpcB6 + mov dword [FxTablec+0B7h*4],FxOpcB7 + mov dword [FxTablec+0B8h*4],FxOpcB8 + mov dword [FxTablec+0B9h*4],FxOpcB9 + mov dword [FxTablec+0BAh*4],FxOpcBA + mov dword [FxTablec+0BBh*4],FxOpcBB + mov dword [FxTablec+0BCh*4],FxOpcBC + mov dword [FxTablec+0BDh*4],FxOpcBD + mov dword [FxTablec+0BEh*4],FxOpcBE + mov dword [FxTablec+0BFh*4],FxOpcBF + + mov dword [FxTablecA1+05h*4],FxOpc05 + mov dword [FxTablecA1+06h*4],FxOpc06 + mov dword [FxTablecA1+07h*4],FxOpc07 + mov dword [FxTablecA1+08h*4],FxOpc08 + mov dword [FxTablecA1+09h*4],FxOpc09 + mov dword [FxTablecA1+0Ah*4],FxOpc0A + mov dword [FxTablecA1+0Bh*4],FxOpc0B + mov dword [FxTablecA1+0Ch*4],FxOpc0C + mov dword [FxTablecA1+0Dh*4],FxOpc0D + mov dword [FxTablecA1+0Eh*4],FxOpc0E + mov dword [FxTablecA1+0Fh*4],FxOpc0F + mov dword [FxTablecA1+10h*4],FxOpc10 + mov dword [FxTablecA1+11h*4],FxOpc11 + mov dword [FxTablecA1+12h*4],FxOpc12 + mov dword [FxTablecA1+13h*4],FxOpc13 + mov dword [FxTablecA1+14h*4],FxOpc14 + mov dword [FxTablecA1+15h*4],FxOpc15 + mov dword [FxTablecA1+16h*4],FxOpc16 + mov dword [FxTablecA1+17h*4],FxOpc17 + mov dword [FxTablecA1+18h*4],FxOpc18 + mov dword [FxTablecA1+19h*4],FxOpc19 + mov dword [FxTablecA1+1Ah*4],FxOpc1A + mov dword [FxTablecA1+1Bh*4],FxOpc1B + mov dword [FxTablecA1+1Ch*4],FxOpc1C + mov dword [FxTablecA1+1Dh*4],FxOpc1D + mov dword [FxTablecA1+1Eh*4],FxOpc1E + mov dword [FxTablecA1+1Fh*4],FxOpc1F + mov dword [FxTablecA1+3Dh*4],FxOpc3D + mov dword [FxTablecA1+3Eh*4],FxOpc3E + mov dword [FxTablecA1+3Fh*4],FxOpc3F + mov dword [FxTablecA1+0B0h*4],FxOpcB0 + mov dword [FxTablecA1+0B1h*4],FxOpcB1 + mov dword [FxTablecA1+0B2h*4],FxOpcB2 + mov dword [FxTablecA1+0B3h*4],FxOpcB3 + mov dword [FxTablecA1+0B4h*4],FxOpcB4 + mov dword [FxTablecA1+0B5h*4],FxOpcB5 + mov dword [FxTablecA1+0B6h*4],FxOpcB6 + mov dword [FxTablecA1+0B7h*4],FxOpcB7 + mov dword [FxTablecA1+0B8h*4],FxOpcB8 + mov dword [FxTablecA1+0B9h*4],FxOpcB9 + mov dword [FxTablecA1+0BAh*4],FxOpcBA + mov dword [FxTablecA1+0BBh*4],FxOpcBB + mov dword [FxTablecA1+0BCh*4],FxOpcBC + mov dword [FxTablecA1+0BDh*4],FxOpcBD + mov dword [FxTablecA1+0BEh*4],FxOpcBE + mov dword [FxTablecA1+0BFh*4],FxOpcBF + + mov dword [FxTablecA2+05h*4],FxOpc05 + mov dword [FxTablecA2+06h*4],FxOpc06 + mov dword [FxTablecA2+07h*4],FxOpc07 + mov dword [FxTablecA2+08h*4],FxOpc08 + mov dword [FxTablecA2+09h*4],FxOpc09 + mov dword [FxTablecA2+0Ah*4],FxOpc0A + mov dword [FxTablecA2+0Bh*4],FxOpc0B + mov dword [FxTablecA2+0Ch*4],FxOpc0C + mov dword [FxTablecA2+0Dh*4],FxOpc0D + mov dword [FxTablecA2+0Eh*4],FxOpc0E + mov dword [FxTablecA2+0Fh*4],FxOpc0F + mov dword [FxTablecA2+10h*4],FxOpc10 + mov dword [FxTablecA2+11h*4],FxOpc11 + mov dword [FxTablecA2+12h*4],FxOpc12 + mov dword [FxTablecA2+13h*4],FxOpc13 + mov dword [FxTablecA2+14h*4],FxOpc14 + mov dword [FxTablecA2+15h*4],FxOpc15 + mov dword [FxTablecA2+16h*4],FxOpc16 + mov dword [FxTablecA2+17h*4],FxOpc17 + mov dword [FxTablecA2+18h*4],FxOpc18 + mov dword [FxTablecA2+19h*4],FxOpc19 + mov dword [FxTablecA2+1Ah*4],FxOpc1A + mov dword [FxTablecA2+1Bh*4],FxOpc1B + mov dword [FxTablecA2+1Ch*4],FxOpc1C + mov dword [FxTablecA2+1Dh*4],FxOpc1D + mov dword [FxTablecA2+1Eh*4],FxOpc1E + mov dword [FxTablecA2+1Fh*4],FxOpc1F + mov dword [FxTablecA2+3Dh*4],FxOpc3D + mov dword [FxTablecA2+3Eh*4],FxOpc3E + mov dword [FxTablecA2+3Fh*4],FxOpc3F + mov dword [FxTablecA2+0B0h*4],FxOpcB0 + mov dword [FxTablecA2+0B1h*4],FxOpcB1 + mov dword [FxTablecA2+0B2h*4],FxOpcB2 + mov dword [FxTablecA2+0B3h*4],FxOpcB3 + mov dword [FxTablecA2+0B4h*4],FxOpcB4 + mov dword [FxTablecA2+0B5h*4],FxOpcB5 + mov dword [FxTablecA2+0B6h*4],FxOpcB6 + mov dword [FxTablecA2+0B7h*4],FxOpcB7 + mov dword [FxTablecA2+0B8h*4],FxOpcB8 + mov dword [FxTablecA2+0B9h*4],FxOpcB9 + mov dword [FxTablecA2+0BAh*4],FxOpcBA + mov dword [FxTablecA2+0BBh*4],FxOpcBB + mov dword [FxTablecA2+0BCh*4],FxOpcBC + mov dword [FxTablecA2+0BDh*4],FxOpcBD + mov dword [FxTablecA2+0BEh*4],FxOpcBE + mov dword [FxTablecA2+0BFh*4],FxOpcBF + + mov dword [FxTablecA3+05h*4],FxOpc05 + mov dword [FxTablecA3+06h*4],FxOpc06 + mov dword [FxTablecA3+07h*4],FxOpc07 + mov dword [FxTablecA3+08h*4],FxOpc08 + mov dword [FxTablecA3+09h*4],FxOpc09 + mov dword [FxTablecA3+0Ah*4],FxOpc0A + mov dword [FxTablecA3+0Bh*4],FxOpc0B + mov dword [FxTablecA3+0Ch*4],FxOpc0C + mov dword [FxTablecA3+0Dh*4],FxOpc0D + mov dword [FxTablecA3+0Eh*4],FxOpc0E + mov dword [FxTablecA3+0Fh*4],FxOpc0F + mov dword [FxTablecA3+10h*4],FxOpc10 + mov dword [FxTablecA3+11h*4],FxOpc11 + mov dword [FxTablecA3+12h*4],FxOpc12 + mov dword [FxTablecA3+13h*4],FxOpc13 + mov dword [FxTablecA3+14h*4],FxOpc14 + mov dword [FxTablecA3+15h*4],FxOpc15 + mov dword [FxTablecA3+16h*4],FxOpc16 + mov dword [FxTablecA3+17h*4],FxOpc17 + mov dword [FxTablecA3+18h*4],FxOpc18 + mov dword [FxTablecA3+19h*4],FxOpc19 + mov dword [FxTablecA3+1Ah*4],FxOpc1A + mov dword [FxTablecA3+1Bh*4],FxOpc1B + mov dword [FxTablecA3+1Ch*4],FxOpc1C + mov dword [FxTablecA3+1Dh*4],FxOpc1D + mov dword [FxTablecA3+1Eh*4],FxOpc1E + mov dword [FxTablecA3+1Fh*4],FxOpc1F + mov dword [FxTablecA3+3Dh*4],FxOpc3D + mov dword [FxTablecA3+3Eh*4],FxOpc3E + mov dword [FxTablecA3+3Fh*4],FxOpc3F + mov dword [FxTablecA3+0B0h*4],FxOpcB0 + mov dword [FxTablecA3+0B1h*4],FxOpcB1 + mov dword [FxTablecA3+0B2h*4],FxOpcB2 + mov dword [FxTablecA3+0B3h*4],FxOpcB3 + mov dword [FxTablecA3+0B4h*4],FxOpcB4 + mov dword [FxTablecA3+0B5h*4],FxOpcB5 + mov dword [FxTablecA3+0B6h*4],FxOpcB6 + mov dword [FxTablecA3+0B7h*4],FxOpcB7 + mov dword [FxTablecA3+0B8h*4],FxOpcB8 + mov dword [FxTablecA3+0B9h*4],FxOpcB9 + mov dword [FxTablecA3+0BAh*4],FxOpcBA + mov dword [FxTablecA3+0BBh*4],FxOpcBB + mov dword [FxTablecA3+0BCh*4],FxOpcBC + mov dword [FxTablecA3+0BDh*4],FxOpcBD + mov dword [FxTablecA3+0BEh*4],FxOpcBE + mov dword [FxTablecA3+0BFh*4],FxOpcBF + + mov dword [FxTabled+00h*4],FxOpd00 + mov dword [FxTabled+01h*4],FxOpd01 + mov dword [FxTabled+02h*4],FxOpd02 + mov dword [FxTabled+03h*4],FxOpd03 + mov dword [FxTabled+04h*4],FxOpd04 + mov dword [FxTabled+05h*4],FxOpd05 + mov dword [FxTabled+06h*4],FxOpd06 + mov dword [FxTabled+07h*4],FxOpd07 + mov dword [FxTabled+08h*4],FxOpd08 + mov dword [FxTabled+09h*4],FxOpd09 + mov dword [FxTabled+0Ah*4],FxOpd0A + mov dword [FxTabled+0Bh*4],FxOpd0B + mov dword [FxTabled+0Ch*4],FxOpd0C + mov dword [FxTabled+0Dh*4],FxOpd0D + mov dword [FxTabled+0Eh*4],FxOpd0E + mov dword [FxTabled+0Fh*4],FxOpd0F + + mov dword [FxTabled+10h*4],FxOpd10 + mov dword [FxTabled+11h*4],FxOpd11 + mov dword [FxTabled+12h*4],FxOpd12 + mov dword [FxTabled+13h*4],FxOpd13 + mov dword [FxTabled+14h*4],FxOpd14 + mov dword [FxTabled+15h*4],FxOpd15 + mov dword [FxTabled+16h*4],FxOpd16 + mov dword [FxTabled+17h*4],FxOpd17 + mov dword [FxTabled+18h*4],FxOpd18 + mov dword [FxTabled+19h*4],FxOpd19 + mov dword [FxTabled+1Ah*4],FxOpd1A + mov dword [FxTabled+1Bh*4],FxOpd1B + mov dword [FxTabled+1Ch*4],FxOpd1C + mov dword [FxTabled+1Dh*4],FxOpd1D + mov dword [FxTabled+1Eh*4],FxOpd1E + mov dword [FxTabled+1Fh*4],FxOpd1F + + mov dword [FxTabled+20h*4],FxOpd20 + mov dword [FxTabled+21h*4],FxOpd21 + mov dword [FxTabled+22h*4],FxOpd22 + mov dword [FxTabled+23h*4],FxOpd23 + mov dword [FxTabled+24h*4],FxOpd24 + mov dword [FxTabled+25h*4],FxOpd25 + mov dword [FxTabled+26h*4],FxOpd26 + mov dword [FxTabled+27h*4],FxOpd27 + mov dword [FxTabled+28h*4],FxOpd28 + mov dword [FxTabled+29h*4],FxOpd29 + mov dword [FxTabled+2Ah*4],FxOpd2A + mov dword [FxTabled+2Bh*4],FxOpd2B + mov dword [FxTabled+2Ch*4],FxOpd2C + mov dword [FxTabled+2Dh*4],FxOpd2D + mov dword [FxTabled+2Eh*4],FxOpd2E + mov dword [FxTabled+2Fh*4],FxOpd2F + + mov dword [FxTabled+30h*4],FxOpd30 + mov dword [FxTabled+31h*4],FxOpd31 + mov dword [FxTabled+32h*4],FxOpd32 + mov dword [FxTabled+33h*4],FxOpd33 + mov dword [FxTabled+34h*4],FxOpd34 + mov dword [FxTabled+35h*4],FxOpd35 + mov dword [FxTabled+36h*4],FxOpd36 + mov dword [FxTabled+37h*4],FxOpd37 + mov dword [FxTabled+38h*4],FxOpd38 + mov dword [FxTabled+39h*4],FxOpd39 + mov dword [FxTabled+3Ah*4],FxOpd3A + mov dword [FxTabled+3Bh*4],FxOpd3B + mov dword [FxTabled+3Ch*4],FxOpd3C + mov dword [FxTabled+3Dh*4],FxOpd3D + mov dword [FxTabled+3Eh*4],FxOpd3E + mov dword [FxTabled+3Fh*4],FxOpd3F + + mov dword [FxTabled+40h*4],FxOpd40 + mov dword [FxTabled+41h*4],FxOpd41 + mov dword [FxTabled+42h*4],FxOpd42 + mov dword [FxTabled+43h*4],FxOpd43 + mov dword [FxTabled+44h*4],FxOpd44 + mov dword [FxTabled+45h*4],FxOpd45 + mov dword [FxTabled+46h*4],FxOpd46 + mov dword [FxTabled+47h*4],FxOpd47 + mov dword [FxTabled+48h*4],FxOpd48 + mov dword [FxTabled+49h*4],FxOpd49 + mov dword [FxTabled+4Ah*4],FxOpd4A + mov dword [FxTabled+4Bh*4],FxOpd4B + mov dword [FxTabled+4Ch*4],FxOpd4C + mov dword [FxTabled+4Dh*4],FxOpd4D + mov dword [FxTabled+4Eh*4],FxOpd4E + mov dword [FxTabled+4Fh*4],FxOpd4F + + mov dword [FxTabled+50h*4],FxOpd50 + mov dword [FxTabled+51h*4],FxOpd51 + mov dword [FxTabled+52h*4],FxOpd52 + mov dword [FxTabled+53h*4],FxOpd53 + mov dword [FxTabled+54h*4],FxOpd54 + mov dword [FxTabled+55h*4],FxOpd55 + mov dword [FxTabled+56h*4],FxOpd56 + mov dword [FxTabled+57h*4],FxOpd57 + mov dword [FxTabled+58h*4],FxOpd58 + mov dword [FxTabled+59h*4],FxOpd59 + mov dword [FxTabled+5Ah*4],FxOpd5A + mov dword [FxTabled+5Bh*4],FxOpd5B + mov dword [FxTabled+5Ch*4],FxOpd5C + mov dword [FxTabled+5Dh*4],FxOpd5D + mov dword [FxTabled+5Eh*4],FxOpd5E + mov dword [FxTabled+5Fh*4],FxOpd5F + + mov dword [FxTabled+60h*4],FxOpd60 + mov dword [FxTabled+61h*4],FxOpd61 + mov dword [FxTabled+62h*4],FxOpd62 + mov dword [FxTabled+63h*4],FxOpd63 + mov dword [FxTabled+64h*4],FxOpd64 + mov dword [FxTabled+65h*4],FxOpd65 + mov dword [FxTabled+66h*4],FxOpd66 + mov dword [FxTabled+67h*4],FxOpd67 + mov dword [FxTabled+68h*4],FxOpd68 + mov dword [FxTabled+69h*4],FxOpd69 + mov dword [FxTabled+6Ah*4],FxOpd6A + mov dword [FxTabled+6Bh*4],FxOpd6B + mov dword [FxTabled+6Ch*4],FxOpd6C + mov dword [FxTabled+6Dh*4],FxOpd6D + mov dword [FxTabled+6Eh*4],FxOpd6E + mov dword [FxTabled+6Fh*4],FxOpd6F + + mov dword [FxTabled+70h*4],FxOpd70 + mov dword [FxTabled+71h*4],FxOpd71 + mov dword [FxTabled+72h*4],FxOpd72 + mov dword [FxTabled+73h*4],FxOpd73 + mov dword [FxTabled+74h*4],FxOpd74 + mov dword [FxTabled+75h*4],FxOpd75 + mov dword [FxTabled+76h*4],FxOpd76 + mov dword [FxTabled+77h*4],FxOpd77 + mov dword [FxTabled+78h*4],FxOpd78 + mov dword [FxTabled+79h*4],FxOpd79 + mov dword [FxTabled+7Ah*4],FxOpd7A + mov dword [FxTabled+7Bh*4],FxOpd7B + mov dword [FxTabled+7Ch*4],FxOpd7C + mov dword [FxTabled+7Dh*4],FxOpd7D + mov dword [FxTabled+7Eh*4],FxOpd7E + mov dword [FxTabled+7Fh*4],FxOpd7F + + mov dword [FxTabled+80h*4],FxOpd80 + mov dword [FxTabled+81h*4],FxOpd81 + mov dword [FxTabled+82h*4],FxOpd82 + mov dword [FxTabled+83h*4],FxOpd83 + mov dword [FxTabled+84h*4],FxOpd84 + mov dword [FxTabled+85h*4],FxOpd85 + mov dword [FxTabled+86h*4],FxOpd86 + mov dword [FxTabled+87h*4],FxOpd87 + mov dword [FxTabled+88h*4],FxOpd88 + mov dword [FxTabled+89h*4],FxOpd89 + mov dword [FxTabled+8Ah*4],FxOpd8A + mov dword [FxTabled+8Bh*4],FxOpd8B + mov dword [FxTabled+8Ch*4],FxOpd8C + mov dword [FxTabled+8Dh*4],FxOpd8D + mov dword [FxTabled+8Eh*4],FxOpd8E + mov dword [FxTabled+8Fh*4],FxOpd8F + + mov dword [FxTabled+90h*4],FxOpd90 + mov dword [FxTabled+91h*4],FxOpd91 + mov dword [FxTabled+92h*4],FxOpd92 + mov dword [FxTabled+93h*4],FxOpd93 + mov dword [FxTabled+94h*4],FxOpd94 + mov dword [FxTabled+95h*4],FxOpd95 + mov dword [FxTabled+96h*4],FxOpd96 + mov dword [FxTabled+97h*4],FxOpd97 + mov dword [FxTabled+98h*4],FxOpd98 + mov dword [FxTabled+99h*4],FxOpd99 + mov dword [FxTabled+9Ah*4],FxOpd9A + mov dword [FxTabled+9Bh*4],FxOpd9B + mov dword [FxTabled+9Ch*4],FxOpd9C + mov dword [FxTabled+9Dh*4],FxOpd9D + mov dword [FxTabled+9Eh*4],FxOpd9E + mov dword [FxTabled+9Fh*4],FxOpd9F + + mov dword [FxTabled+0A0h*4],FxOpdA0 + mov dword [FxTabled+0A1h*4],FxOpdA1 + mov dword [FxTabled+0A2h*4],FxOpdA2 + mov dword [FxTabled+0A3h*4],FxOpdA3 + mov dword [FxTabled+0A4h*4],FxOpdA4 + mov dword [FxTabled+0A5h*4],FxOpdA5 + mov dword [FxTabled+0A6h*4],FxOpdA6 + mov dword [FxTabled+0A7h*4],FxOpdA7 + mov dword [FxTabled+0A8h*4],FxOpdA8 + mov dword [FxTabled+0A9h*4],FxOpdA9 + mov dword [FxTabled+0AAh*4],FxOpdAA + mov dword [FxTabled+0ABh*4],FxOpdAB + mov dword [FxTabled+0ACh*4],FxOpdAC + mov dword [FxTabled+0ADh*4],FxOpdAD + mov dword [FxTabled+0AEh*4],FxOpdAE + mov dword [FxTabled+0AFh*4],FxOpdAF + + mov dword [FxTabled+0B0h*4],FxOpdB0 + mov dword [FxTabled+0B1h*4],FxOpdB1 + mov dword [FxTabled+0B2h*4],FxOpdB2 + mov dword [FxTabled+0B3h*4],FxOpdB3 + mov dword [FxTabled+0B4h*4],FxOpdB4 + mov dword [FxTabled+0B5h*4],FxOpdB5 + mov dword [FxTabled+0B6h*4],FxOpdB6 + mov dword [FxTabled+0B7h*4],FxOpdB7 + mov dword [FxTabled+0B8h*4],FxOpdB8 + mov dword [FxTabled+0B9h*4],FxOpdB9 + mov dword [FxTabled+0BAh*4],FxOpdBA + mov dword [FxTabled+0BBh*4],FxOpdBB + mov dword [FxTabled+0BCh*4],FxOpdBC + mov dword [FxTabled+0BDh*4],FxOpdBD + mov dword [FxTabled+0BEh*4],FxOpdBE + mov dword [FxTabled+0BFh*4],FxOpdBF + + mov dword [FxTabled+0C0h*4],FxOpdC0 + mov dword [FxTabled+0C1h*4],FxOpdC1 + mov dword [FxTabled+0C2h*4],FxOpdC2 + mov dword [FxTabled+0C3h*4],FxOpdC3 + mov dword [FxTabled+0C4h*4],FxOpdC4 + mov dword [FxTabled+0C5h*4],FxOpdC5 + mov dword [FxTabled+0C6h*4],FxOpdC6 + mov dword [FxTabled+0C7h*4],FxOpdC7 + mov dword [FxTabled+0C8h*4],FxOpdC8 + mov dword [FxTabled+0C9h*4],FxOpdC9 + mov dword [FxTabled+0CAh*4],FxOpdCA + mov dword [FxTabled+0CBh*4],FxOpdCB + mov dword [FxTabled+0CCh*4],FxOpdCC + mov dword [FxTabled+0CDh*4],FxOpdCD + mov dword [FxTabled+0CEh*4],FxOpdCE + mov dword [FxTabled+0CFh*4],FxOpdCF + + mov dword [FxTabled+0D0h*4],FxOpdD0 + mov dword [FxTabled+0D1h*4],FxOpdD1 + mov dword [FxTabled+0D2h*4],FxOpdD2 + mov dword [FxTabled+0D3h*4],FxOpdD3 + mov dword [FxTabled+0D4h*4],FxOpdD4 + mov dword [FxTabled+0D5h*4],FxOpdD5 + mov dword [FxTabled+0D6h*4],FxOpdD6 + mov dword [FxTabled+0D7h*4],FxOpdD7 + mov dword [FxTabled+0D8h*4],FxOpdD8 + mov dword [FxTabled+0D9h*4],FxOpdD9 + mov dword [FxTabled+0DAh*4],FxOpdDA + mov dword [FxTabled+0DBh*4],FxOpdDB + mov dword [FxTabled+0DCh*4],FxOpdDC + mov dword [FxTabled+0DDh*4],FxOpdDD + mov dword [FxTabled+0DEh*4],FxOpdDE + mov dword [FxTabled+0DFh*4],FxOpdDF + + mov dword [FxTabled+0E0h*4],FxOpdE0 + mov dword [FxTabled+0E1h*4],FxOpdE1 + mov dword [FxTabled+0E2h*4],FxOpdE2 + mov dword [FxTabled+0E3h*4],FxOpdE3 + mov dword [FxTabled+0E4h*4],FxOpdE4 + mov dword [FxTabled+0E5h*4],FxOpdE5 + mov dword [FxTabled+0E6h*4],FxOpdE6 + mov dword [FxTabled+0E7h*4],FxOpdE7 + mov dword [FxTabled+0E8h*4],FxOpdE8 + mov dword [FxTabled+0E9h*4],FxOpdE9 + mov dword [FxTabled+0EAh*4],FxOpdEA + mov dword [FxTabled+0EBh*4],FxOpdEB + mov dword [FxTabled+0ECh*4],FxOpdEC + mov dword [FxTabled+0EDh*4],FxOpdED + mov dword [FxTabled+0EEh*4],FxOpdEE + mov dword [FxTabled+0EFh*4],FxOpdEF + + mov dword [FxTabled+0F0h*4],FxOpdF0 + mov dword [FxTabled+0F1h*4],FxOpdF1 + mov dword [FxTabled+0F2h*4],FxOpdF2 + mov dword [FxTabled+0F3h*4],FxOpdF3 + mov dword [FxTabled+0F4h*4],FxOpdF4 + mov dword [FxTabled+0F5h*4],FxOpdF5 + mov dword [FxTabled+0F6h*4],FxOpdF6 + mov dword [FxTabled+0F7h*4],FxOpdF7 + mov dword [FxTabled+0F8h*4],FxOpdF8 + mov dword [FxTabled+0F9h*4],FxOpdF9 + mov dword [FxTabled+0FAh*4],FxOpdFA + mov dword [FxTabled+0FBh*4],FxOpdFB + mov dword [FxTabled+0FCh*4],FxOpdFC + mov dword [FxTabled+0FDh*4],FxOpdFD + mov dword [FxTabled+0FEh*4],FxOpdFE + mov dword [FxTabled+0FFh*4],FxOpdFF + + + mov dword [FxTabledA1+00h*4],FxOpd00 + mov dword [FxTabledA1+01h*4],FxOpd01 + mov dword [FxTabledA1+02h*4],FxOpd02 + mov dword [FxTabledA1+03h*4],FxOpd03 + mov dword [FxTabledA1+04h*4],FxOpd04 + mov dword [FxTabledA1+05h*4],FxOpd05 + mov dword [FxTabledA1+06h*4],FxOpd06 + mov dword [FxTabledA1+07h*4],FxOpd07 + mov dword [FxTabledA1+08h*4],FxOpd08 + mov dword [FxTabledA1+09h*4],FxOpd09 + mov dword [FxTabledA1+0Ah*4],FxOpd0A + mov dword [FxTabledA1+0Bh*4],FxOpd0B + mov dword [FxTabledA1+0Ch*4],FxOpd0C + mov dword [FxTabledA1+0Dh*4],FxOpd0D + mov dword [FxTabledA1+0Eh*4],FxOpd0E + mov dword [FxTabledA1+0Fh*4],FxOpd0F + + mov dword [FxTabledA1+10h*4],FxOpd10 + mov dword [FxTabledA1+11h*4],FxOpd11 + mov dword [FxTabledA1+12h*4],FxOpd12 + mov dword [FxTabledA1+13h*4],FxOpd13 + mov dword [FxTabledA1+14h*4],FxOpd14 + mov dword [FxTabledA1+15h*4],FxOpd15 + mov dword [FxTabledA1+16h*4],FxOpd16 + mov dword [FxTabledA1+17h*4],FxOpd17 + mov dword [FxTabledA1+18h*4],FxOpd18 + mov dword [FxTabledA1+19h*4],FxOpd19 + mov dword [FxTabledA1+1Ah*4],FxOpd1A + mov dword [FxTabledA1+1Bh*4],FxOpd1B + mov dword [FxTabledA1+1Ch*4],FxOpd1C + mov dword [FxTabledA1+1Dh*4],FxOpd1D + mov dword [FxTabledA1+1Eh*4],FxOpd1E + mov dword [FxTabledA1+1Fh*4],FxOpd1F + + mov dword [FxTabledA1+20h*4],FxOpd20 + mov dword [FxTabledA1+21h*4],FxOpd21 + mov dword [FxTabledA1+22h*4],FxOpd22 + mov dword [FxTabledA1+23h*4],FxOpd23 + mov dword [FxTabledA1+24h*4],FxOpd24 + mov dword [FxTabledA1+25h*4],FxOpd25 + mov dword [FxTabledA1+26h*4],FxOpd26 + mov dword [FxTabledA1+27h*4],FxOpd27 + mov dword [FxTabledA1+28h*4],FxOpd28 + mov dword [FxTabledA1+29h*4],FxOpd29 + mov dword [FxTabledA1+2Ah*4],FxOpd2A + mov dword [FxTabledA1+2Bh*4],FxOpd2B + mov dword [FxTabledA1+2Ch*4],FxOpd2C + mov dword [FxTabledA1+2Dh*4],FxOpd2D + mov dword [FxTabledA1+2Eh*4],FxOpd2E + mov dword [FxTabledA1+2Fh*4],FxOpd2F + + mov dword [FxTabledA1+30h*4],FxOpd30A1 + mov dword [FxTabledA1+31h*4],FxOpd31A1 + mov dword [FxTabledA1+32h*4],FxOpd32A1 + mov dword [FxTabledA1+33h*4],FxOpd33A1 + mov dword [FxTabledA1+34h*4],FxOpd34A1 + mov dword [FxTabledA1+35h*4],FxOpd35A1 + mov dword [FxTabledA1+36h*4],FxOpd36A1 + mov dword [FxTabledA1+37h*4],FxOpd37A1 + mov dword [FxTabledA1+38h*4],FxOpd38A1 + mov dword [FxTabledA1+39h*4],FxOpd39A1 + mov dword [FxTabledA1+3Ah*4],FxOpd3AA1 + mov dword [FxTabledA1+3Bh*4],FxOpd3BA1 + mov dword [FxTabledA1+3Ch*4],FxOpd3C + mov dword [FxTabledA1+3Dh*4],FxOpd3D + mov dword [FxTabledA1+3Eh*4],FxOpd3E + mov dword [FxTabledA1+3Fh*4],FxOpd3F + + mov dword [FxTabledA1+40h*4],FxOpd40A1 + mov dword [FxTabledA1+41h*4],FxOpd41A1 + mov dword [FxTabledA1+42h*4],FxOpd42A1 + mov dword [FxTabledA1+43h*4],FxOpd43A1 + mov dword [FxTabledA1+44h*4],FxOpd44A1 + mov dword [FxTabledA1+45h*4],FxOpd45A1 + mov dword [FxTabledA1+46h*4],FxOpd46A1 + mov dword [FxTabledA1+47h*4],FxOpd47A1 + mov dword [FxTabledA1+48h*4],FxOpd48A1 + mov dword [FxTabledA1+49h*4],FxOpd49A1 + mov dword [FxTabledA1+4Ah*4],FxOpd4AA1 + mov dword [FxTabledA1+4Bh*4],FxOpd4BA1 + mov dword [FxTabledA1+4Ch*4],FxOpd4CA1 + mov dword [FxTabledA1+4Dh*4],FxOpd4D + mov dword [FxTabledA1+4Eh*4],FxOpd4EA1 + mov dword [FxTabledA1+4Fh*4],FxOpd4F + + mov dword [FxTabledA1+50h*4],FxOpd50A1 + mov dword [FxTabledA1+51h*4],FxOpd51A1 + mov dword [FxTabledA1+52h*4],FxOpd52A1 + mov dword [FxTabledA1+53h*4],FxOpd53A1 + mov dword [FxTabledA1+54h*4],FxOpd54A1 + mov dword [FxTabledA1+55h*4],FxOpd55A1 + mov dword [FxTabledA1+56h*4],FxOpd56A1 + mov dword [FxTabledA1+57h*4],FxOpd57A1 + mov dword [FxTabledA1+58h*4],FxOpd58A1 + mov dword [FxTabledA1+59h*4],FxOpd59A1 + mov dword [FxTabledA1+5Ah*4],FxOpd5AA1 + mov dword [FxTabledA1+5Bh*4],FxOpd5BA1 + mov dword [FxTabledA1+5Ch*4],FxOpd5CA1 + mov dword [FxTabledA1+5Dh*4],FxOpd5DA1 + mov dword [FxTabledA1+5Eh*4],FxOpd5EA1 + mov dword [FxTabledA1+5Fh*4],FxOpd5FA1 + + mov dword [FxTabledA1+60h*4],FxOpd60A1 + mov dword [FxTabledA1+61h*4],FxOpd61A1 + mov dword [FxTabledA1+62h*4],FxOpd62A1 + mov dword [FxTabledA1+63h*4],FxOpd63A1 + mov dword [FxTabledA1+64h*4],FxOpd64A1 + mov dword [FxTabledA1+65h*4],FxOpd65A1 + mov dword [FxTabledA1+66h*4],FxOpd66A1 + mov dword [FxTabledA1+67h*4],FxOpd67A1 + mov dword [FxTabledA1+68h*4],FxOpd68A1 + mov dword [FxTabledA1+69h*4],FxOpd69A1 + mov dword [FxTabledA1+6Ah*4],FxOpd6AA1 + mov dword [FxTabledA1+6Bh*4],FxOpd6BA1 + mov dword [FxTabledA1+6Ch*4],FxOpd6CA1 + mov dword [FxTabledA1+6Dh*4],FxOpd6DA1 + mov dword [FxTabledA1+6Eh*4],FxOpd6EA1 + mov dword [FxTabledA1+6Fh*4],FxOpd6FA1 + + mov dword [FxTabledA1+70h*4],FxOpd70 + mov dword [FxTabledA1+71h*4],FxOpd71A1 + mov dword [FxTabledA1+72h*4],FxOpd72A1 + mov dword [FxTabledA1+73h*4],FxOpd73A1 + mov dword [FxTabledA1+74h*4],FxOpd74A1 + mov dword [FxTabledA1+75h*4],FxOpd75A1 + mov dword [FxTabledA1+76h*4],FxOpd76A1 + mov dword [FxTabledA1+77h*4],FxOpd77A1 + mov dword [FxTabledA1+78h*4],FxOpd78A1 + mov dword [FxTabledA1+79h*4],FxOpd79A1 + mov dword [FxTabledA1+7Ah*4],FxOpd7AA1 + mov dword [FxTabledA1+7Bh*4],FxOpd7BA1 + mov dword [FxTabledA1+7Ch*4],FxOpd7CA1 + mov dword [FxTabledA1+7Dh*4],FxOpd7DA1 + mov dword [FxTabledA1+7Eh*4],FxOpd7EA1 + mov dword [FxTabledA1+7Fh*4],FxOpd7FA1 + + mov dword [FxTabledA1+80h*4],FxOpd80A1 + mov dword [FxTabledA1+81h*4],FxOpd81A1 + mov dword [FxTabledA1+82h*4],FxOpd82A1 + mov dword [FxTabledA1+83h*4],FxOpd83A1 + mov dword [FxTabledA1+84h*4],FxOpd84A1 + mov dword [FxTabledA1+85h*4],FxOpd85A1 + mov dword [FxTabledA1+86h*4],FxOpd86A1 + mov dword [FxTabledA1+87h*4],FxOpd87A1 + mov dword [FxTabledA1+88h*4],FxOpd88A1 + mov dword [FxTabledA1+89h*4],FxOpd89A1 + mov dword [FxTabledA1+8Ah*4],FxOpd8AA1 + mov dword [FxTabledA1+8Bh*4],FxOpd8BA1 + mov dword [FxTabledA1+8Ch*4],FxOpd8CA1 + mov dword [FxTabledA1+8Dh*4],FxOpd8DA1 + mov dword [FxTabledA1+8Eh*4],FxOpd8EA1 + mov dword [FxTabledA1+8Fh*4],FxOpd8FA1 + + mov dword [FxTabledA1+90h*4],FxOpd90 + mov dword [FxTabledA1+91h*4],FxOpd91 + mov dword [FxTabledA1+92h*4],FxOpd92 + mov dword [FxTabledA1+93h*4],FxOpd93 + mov dword [FxTabledA1+94h*4],FxOpd94 + mov dword [FxTabledA1+95h*4],FxOpd95 + mov dword [FxTabledA1+96h*4],FxOpd96A1 + mov dword [FxTabledA1+97h*4],FxOpd97 + mov dword [FxTabledA1+98h*4],FxOpd98A1 + mov dword [FxTabledA1+99h*4],FxOpd99A1 + mov dword [FxTabledA1+9Ah*4],FxOpd9AA1 + mov dword [FxTabledA1+9Bh*4],FxOpd9BA1 + mov dword [FxTabledA1+9Ch*4],FxOpd9CA1 + mov dword [FxTabledA1+9Dh*4],FxOpd9DA1 + mov dword [FxTabledA1+9Eh*4],FxOpd9E + mov dword [FxTabledA1+9Fh*4],FxOpd9FA1 + + mov dword [FxTabledA1+0A0h*4],FxOpdA0A1 + mov dword [FxTabledA1+0A1h*4],FxOpdA1A1 + mov dword [FxTabledA1+0A2h*4],FxOpdA2A1 + mov dword [FxTabledA1+0A3h*4],FxOpdA3A1 + mov dword [FxTabledA1+0A4h*4],FxOpdA4A1 + mov dword [FxTabledA1+0A5h*4],FxOpdA5A1 + mov dword [FxTabledA1+0A6h*4],FxOpdA6A1 + mov dword [FxTabledA1+0A7h*4],FxOpdA7A1 + mov dword [FxTabledA1+0A8h*4],FxOpdA8A1 + mov dword [FxTabledA1+0A9h*4],FxOpdA9A1 + mov dword [FxTabledA1+0AAh*4],FxOpdAAA1 + mov dword [FxTabledA1+0ABh*4],FxOpdABA1 + mov dword [FxTabledA1+0ACh*4],FxOpdACA1 + mov dword [FxTabledA1+0ADh*4],FxOpdADA1 + mov dword [FxTabledA1+0AEh*4],FxOpdAEA1 + mov dword [FxTabledA1+0AFh*4],FxOpdAFA1 + + mov dword [FxTabledA1+0B0h*4],FxOpdB0 + mov dword [FxTabledA1+0B1h*4],FxOpdB1 + mov dword [FxTabledA1+0B2h*4],FxOpdB2 + mov dword [FxTabledA1+0B3h*4],FxOpdB3 + mov dword [FxTabledA1+0B4h*4],FxOpdB4 + mov dword [FxTabledA1+0B5h*4],FxOpdB5 + mov dword [FxTabledA1+0B6h*4],FxOpdB6 + mov dword [FxTabledA1+0B7h*4],FxOpdB7 + mov dword [FxTabledA1+0B8h*4],FxOpdB8 + mov dword [FxTabledA1+0B9h*4],FxOpdB9 + mov dword [FxTabledA1+0BAh*4],FxOpdBA + mov dword [FxTabledA1+0BBh*4],FxOpdBB + mov dword [FxTabledA1+0BCh*4],FxOpdBC + mov dword [FxTabledA1+0BDh*4],FxOpdBD + mov dword [FxTabledA1+0BEh*4],FxOpdBE + mov dword [FxTabledA1+0BFh*4],FxOpdBF + + mov dword [FxTabledA1+0C0h*4],FxOpdC0 + mov dword [FxTabledA1+0C1h*4],FxOpdC1A1 + mov dword [FxTabledA1+0C2h*4],FxOpdC2A1 + mov dword [FxTabledA1+0C3h*4],FxOpdC3A1 + mov dword [FxTabledA1+0C4h*4],FxOpdC4A1 + mov dword [FxTabledA1+0C5h*4],FxOpdC5A1 + mov dword [FxTabledA1+0C6h*4],FxOpdC6A1 + mov dword [FxTabledA1+0C7h*4],FxOpdC7A1 + mov dword [FxTabledA1+0C8h*4],FxOpdC8A1 + mov dword [FxTabledA1+0C9h*4],FxOpdC9A1 + mov dword [FxTabledA1+0CAh*4],FxOpdCAA1 + mov dword [FxTabledA1+0CBh*4],FxOpdCBA1 + mov dword [FxTabledA1+0CCh*4],FxOpdCCA1 + mov dword [FxTabledA1+0CDh*4],FxOpdCDA1 + mov dword [FxTabledA1+0CEh*4],FxOpdCEA1 + mov dword [FxTabledA1+0CFh*4],FxOpdCFA1 + + mov dword [FxTabledA1+0D0h*4],FxOpdD0 + mov dword [FxTabledA1+0D1h*4],FxOpdD1 + mov dword [FxTabledA1+0D2h*4],FxOpdD2 + mov dword [FxTabledA1+0D3h*4],FxOpdD3 + mov dword [FxTabledA1+0D4h*4],FxOpdD4 + mov dword [FxTabledA1+0D5h*4],FxOpdD5 + mov dword [FxTabledA1+0D6h*4],FxOpdD6 + mov dword [FxTabledA1+0D7h*4],FxOpdD7 + mov dword [FxTabledA1+0D8h*4],FxOpdD8 + mov dword [FxTabledA1+0D9h*4],FxOpdD9 + mov dword [FxTabledA1+0DAh*4],FxOpdDA + mov dword [FxTabledA1+0DBh*4],FxOpdDB + mov dword [FxTabledA1+0DCh*4],FxOpdDC + mov dword [FxTabledA1+0DDh*4],FxOpdDD + mov dword [FxTabledA1+0DEh*4],FxOpdDE + mov dword [FxTabledA1+0DFh*4],FxOpdDF + + mov dword [FxTabledA1+0E0h*4],FxOpdE0 + mov dword [FxTabledA1+0E1h*4],FxOpdE1 + mov dword [FxTabledA1+0E2h*4],FxOpdE2 + mov dword [FxTabledA1+0E3h*4],FxOpdE3 + mov dword [FxTabledA1+0E4h*4],FxOpdE4 + mov dword [FxTabledA1+0E5h*4],FxOpdE5 + mov dword [FxTabledA1+0E6h*4],FxOpdE6 + mov dword [FxTabledA1+0E7h*4],FxOpdE7 + mov dword [FxTabledA1+0E8h*4],FxOpdE8 + mov dword [FxTabledA1+0E9h*4],FxOpdE9 + mov dword [FxTabledA1+0EAh*4],FxOpdEA + mov dword [FxTabledA1+0EBh*4],FxOpdEB + mov dword [FxTabledA1+0ECh*4],FxOpdEC + mov dword [FxTabledA1+0EDh*4],FxOpdED + mov dword [FxTabledA1+0EEh*4],FxOpdEE + mov dword [FxTabledA1+0EFh*4],FxOpdEFA1 + + mov dword [FxTabledA1+0F0h*4],FxOpdF0A1 + mov dword [FxTabledA1+0F1h*4],FxOpdF1A1 + mov dword [FxTabledA1+0F2h*4],FxOpdF2A1 + mov dword [FxTabledA1+0F3h*4],FxOpdF3A1 + mov dword [FxTabledA1+0F4h*4],FxOpdF4A1 + mov dword [FxTabledA1+0F5h*4],FxOpdF5A1 + mov dword [FxTabledA1+0F6h*4],FxOpdF6A1 + mov dword [FxTabledA1+0F7h*4],FxOpdF7A1 + mov dword [FxTabledA1+0F8h*4],FxOpdF8A1 + mov dword [FxTabledA1+0F9h*4],FxOpdF9A1 + mov dword [FxTabledA1+0FAh*4],FxOpdFAA1 + mov dword [FxTabledA1+0FBh*4],FxOpdFBA1 + mov dword [FxTabledA1+0FCh*4],FxOpdFCA1 + mov dword [FxTabledA1+0FDh*4],FxOpdFDA1 + mov dword [FxTabledA1+0FEh*4],FxOpdFEA1 + mov dword [FxTabledA1+0FFh*4],FxOpdFFA1 + + + mov dword [FxTabledA2+00h*4],FxOpd00 + mov dword [FxTabledA2+01h*4],FxOpd01 + mov dword [FxTabledA2+02h*4],FxOpd02 + mov dword [FxTabledA2+03h*4],FxOpd03 + mov dword [FxTabledA2+04h*4],FxOpd04 + mov dword [FxTabledA2+05h*4],FxOpd05 + mov dword [FxTabledA2+06h*4],FxOpd06 + mov dword [FxTabledA2+07h*4],FxOpd07 + mov dword [FxTabledA2+08h*4],FxOpd08 + mov dword [FxTabledA2+09h*4],FxOpd09 + mov dword [FxTabledA2+0Ah*4],FxOpd0A + mov dword [FxTabledA2+0Bh*4],FxOpd0B + mov dword [FxTabledA2+0Ch*4],FxOpd0C + mov dword [FxTabledA2+0Dh*4],FxOpd0D + mov dword [FxTabledA2+0Eh*4],FxOpd0E + mov dword [FxTabledA2+0Fh*4],FxOpd0F + + mov dword [FxTabledA2+10h*4],FxOpd10 + mov dword [FxTabledA2+11h*4],FxOpd11 + mov dword [FxTabledA2+12h*4],FxOpd12 + mov dword [FxTabledA2+13h*4],FxOpd13 + mov dword [FxTabledA2+14h*4],FxOpd14 + mov dword [FxTabledA2+15h*4],FxOpd15 + mov dword [FxTabledA2+16h*4],FxOpd16 + mov dword [FxTabledA2+17h*4],FxOpd17 + mov dword [FxTabledA2+18h*4],FxOpd18 + mov dword [FxTabledA2+19h*4],FxOpd19 + mov dword [FxTabledA2+1Ah*4],FxOpd1A + mov dword [FxTabledA2+1Bh*4],FxOpd1B + mov dword [FxTabledA2+1Ch*4],FxOpd1C + mov dword [FxTabledA2+1Dh*4],FxOpd1D + mov dword [FxTabledA2+1Eh*4],FxOpd1E + mov dword [FxTabledA2+1Fh*4],FxOpd1F + + mov dword [FxTabledA2+20h*4],FxOpd20 + mov dword [FxTabledA2+21h*4],FxOpd21 + mov dword [FxTabledA2+22h*4],FxOpd22 + mov dword [FxTabledA2+23h*4],FxOpd23 + mov dword [FxTabledA2+24h*4],FxOpd24 + mov dword [FxTabledA2+25h*4],FxOpd25 + mov dword [FxTabledA2+26h*4],FxOpd26 + mov dword [FxTabledA2+27h*4],FxOpd27 + mov dword [FxTabledA2+28h*4],FxOpd28 + mov dword [FxTabledA2+29h*4],FxOpd29 + mov dword [FxTabledA2+2Ah*4],FxOpd2A + mov dword [FxTabledA2+2Bh*4],FxOpd2B + mov dword [FxTabledA2+2Ch*4],FxOpd2C + mov dword [FxTabledA2+2Dh*4],FxOpd2D + mov dword [FxTabledA2+2Eh*4],FxOpd2E + mov dword [FxTabledA2+2Fh*4],FxOpd2F + + mov dword [FxTabledA2+30h*4],FxOpd30 + mov dword [FxTabledA2+31h*4],FxOpd31 + mov dword [FxTabledA2+32h*4],FxOpd32 + mov dword [FxTabledA2+33h*4],FxOpd33 + mov dword [FxTabledA2+34h*4],FxOpd34 + mov dword [FxTabledA2+35h*4],FxOpd35 + mov dword [FxTabledA2+36h*4],FxOpd36 + mov dword [FxTabledA2+37h*4],FxOpd37 + mov dword [FxTabledA2+38h*4],FxOpd38 + mov dword [FxTabledA2+39h*4],FxOpd39 + mov dword [FxTabledA2+3Ah*4],FxOpd3A + mov dword [FxTabledA2+3Bh*4],FxOpd3B + mov dword [FxTabledA2+3Ch*4],FxOpd3C + mov dword [FxTabledA2+3Dh*4],FxOpd3D + mov dword [FxTabledA2+3Eh*4],FxOpd3E + mov dword [FxTabledA2+3Fh*4],FxOpd3F + + mov dword [FxTabledA2+40h*4],FxOpd40 + mov dword [FxTabledA2+41h*4],FxOpd41 + mov dword [FxTabledA2+42h*4],FxOpd42 + mov dword [FxTabledA2+43h*4],FxOpd43 + mov dword [FxTabledA2+44h*4],FxOpd44 + mov dword [FxTabledA2+45h*4],FxOpd45 + mov dword [FxTabledA2+46h*4],FxOpd46 + mov dword [FxTabledA2+47h*4],FxOpd47 + mov dword [FxTabledA2+48h*4],FxOpd48 + mov dword [FxTabledA2+49h*4],FxOpd49 + mov dword [FxTabledA2+4Ah*4],FxOpd4A + mov dword [FxTabledA2+4Bh*4],FxOpd4B + mov dword [FxTabledA2+4Ch*4],FxOpd4C + mov dword [FxTabledA2+4Dh*4],FxOpd4D + mov dword [FxTabledA2+4Eh*4],FxOpd4E + mov dword [FxTabledA2+4Fh*4],FxOpd4F + + mov dword [FxTabledA2+50h*4],FxOpd50A2 + mov dword [FxTabledA2+51h*4],FxOpd51A2 + mov dword [FxTabledA2+52h*4],FxOpd52A2 + mov dword [FxTabledA2+53h*4],FxOpd53A2 + mov dword [FxTabledA2+54h*4],FxOpd54A2 + mov dword [FxTabledA2+55h*4],FxOpd55A2 + mov dword [FxTabledA2+56h*4],FxOpd56A2 + mov dword [FxTabledA2+57h*4],FxOpd57A2 + mov dword [FxTabledA2+58h*4],FxOpd58A2 + mov dword [FxTabledA2+59h*4],FxOpd59A2 + mov dword [FxTabledA2+5Ah*4],FxOpd5AA2 + mov dword [FxTabledA2+5Bh*4],FxOpd5BA2 + mov dword [FxTabledA2+5Ch*4],FxOpd5CA2 + mov dword [FxTabledA2+5Dh*4],FxOpd5DA2 + mov dword [FxTabledA2+5Eh*4],FxOpd5EA2 + mov dword [FxTabledA2+5Fh*4],FxOpd5FA2 + + mov dword [FxTabledA2+60h*4],FxOpd60A2 + mov dword [FxTabledA2+61h*4],FxOpd61A2 + mov dword [FxTabledA2+62h*4],FxOpd62A2 + mov dword [FxTabledA2+63h*4],FxOpd63A2 + mov dword [FxTabledA2+64h*4],FxOpd64A2 + mov dword [FxTabledA2+65h*4],FxOpd65A2 + mov dword [FxTabledA2+66h*4],FxOpd66A2 + mov dword [FxTabledA2+67h*4],FxOpd67A2 + mov dword [FxTabledA2+68h*4],FxOpd68A2 + mov dword [FxTabledA2+69h*4],FxOpd69A2 + mov dword [FxTabledA2+6Ah*4],FxOpd6AA2 + mov dword [FxTabledA2+6Bh*4],FxOpd6BA2 + mov dword [FxTabledA2+6Ch*4],FxOpd6CA2 + mov dword [FxTabledA2+6Dh*4],FxOpd6DA2 + mov dword [FxTabledA2+6Eh*4],FxOpd6EA2 + mov dword [FxTabledA2+6Fh*4],FxOpd6FA2 + + mov dword [FxTabledA2+70h*4],FxOpd70 + mov dword [FxTabledA2+71h*4],FxOpd71A2 + mov dword [FxTabledA2+72h*4],FxOpd72A2 + mov dword [FxTabledA2+73h*4],FxOpd73A2 + mov dword [FxTabledA2+74h*4],FxOpd74A2 + mov dword [FxTabledA2+75h*4],FxOpd75A2 + mov dword [FxTabledA2+76h*4],FxOpd76A2 + mov dword [FxTabledA2+77h*4],FxOpd77A2 + mov dword [FxTabledA2+78h*4],FxOpd78A2 + mov dword [FxTabledA2+79h*4],FxOpd79A2 + mov dword [FxTabledA2+7Ah*4],FxOpd7AA2 + mov dword [FxTabledA2+7Bh*4],FxOpd7BA2 + mov dword [FxTabledA2+7Ch*4],FxOpd7CA2 + mov dword [FxTabledA2+7Dh*4],FxOpd7DA2 + mov dword [FxTabledA2+7Eh*4],FxOpd7EA2 + mov dword [FxTabledA2+7Fh*4],FxOpd7FA2 + + mov dword [FxTabledA2+80h*4],FxOpd80A2 + mov dword [FxTabledA2+81h*4],FxOpd81A2 + mov dword [FxTabledA2+82h*4],FxOpd82A2 + mov dword [FxTabledA2+83h*4],FxOpd83A2 + mov dword [FxTabledA2+84h*4],FxOpd84A2 + mov dword [FxTabledA2+85h*4],FxOpd85A2 + mov dword [FxTabledA2+86h*4],FxOpd86A2 + mov dword [FxTabledA2+87h*4],FxOpd87A2 + mov dword [FxTabledA2+88h*4],FxOpd88A2 + mov dword [FxTabledA2+89h*4],FxOpd89A2 + mov dword [FxTabledA2+8Ah*4],FxOpd8AA2 + mov dword [FxTabledA2+8Bh*4],FxOpd8BA2 + mov dword [FxTabledA2+8Ch*4],FxOpd8CA2 + mov dword [FxTabledA2+8Dh*4],FxOpd8DA2 + mov dword [FxTabledA2+8Eh*4],FxOpd8EA2 + mov dword [FxTabledA2+8Fh*4],FxOpd8FA2 + + mov dword [FxTabledA2+90h*4],FxOpd90 + mov dword [FxTabledA2+91h*4],FxOpd91 + mov dword [FxTabledA2+92h*4],FxOpd92 + mov dword [FxTabledA2+93h*4],FxOpd93 + mov dword [FxTabledA2+94h*4],FxOpd94 + mov dword [FxTabledA2+95h*4],FxOpd95 + mov dword [FxTabledA2+96h*4],FxOpd96 + mov dword [FxTabledA2+97h*4],FxOpd97 + mov dword [FxTabledA2+98h*4],FxOpd98 + mov dword [FxTabledA2+99h*4],FxOpd99 + mov dword [FxTabledA2+9Ah*4],FxOpd9A + mov dword [FxTabledA2+9Bh*4],FxOpd9B + mov dword [FxTabledA2+9Ch*4],FxOpd9C + mov dword [FxTabledA2+9Dh*4],FxOpd9D + mov dword [FxTabledA2+9Eh*4],FxOpd9E + mov dword [FxTabledA2+9Fh*4],FxOpd9F + + mov dword [FxTabledA2+0A0h*4],FxOpdA0A2 + mov dword [FxTabledA2+0A1h*4],FxOpdA1A2 + mov dword [FxTabledA2+0A2h*4],FxOpdA2A2 + mov dword [FxTabledA2+0A3h*4],FxOpdA3A2 + mov dword [FxTabledA2+0A4h*4],FxOpdA4A2 + mov dword [FxTabledA2+0A5h*4],FxOpdA5A2 + mov dword [FxTabledA2+0A6h*4],FxOpdA6A2 + mov dword [FxTabledA2+0A7h*4],FxOpdA7A2 + mov dword [FxTabledA2+0A8h*4],FxOpdA8A2 + mov dword [FxTabledA2+0A9h*4],FxOpdA9A2 + mov dword [FxTabledA2+0AAh*4],FxOpdAAA2 + mov dword [FxTabledA2+0ABh*4],FxOpdABA2 + mov dword [FxTabledA2+0ACh*4],FxOpdACA2 + mov dword [FxTabledA2+0ADh*4],FxOpdADA2 + mov dword [FxTabledA2+0AEh*4],FxOpdAEA2 + mov dword [FxTabledA2+0AFh*4],FxOpdAFA2 + + mov dword [FxTabledA2+0B0h*4],FxOpdB0 + mov dword [FxTabledA2+0B1h*4],FxOpdB1 + mov dword [FxTabledA2+0B2h*4],FxOpdB2 + mov dword [FxTabledA2+0B3h*4],FxOpdB3 + mov dword [FxTabledA2+0B4h*4],FxOpdB4 + mov dword [FxTabledA2+0B5h*4],FxOpdB5 + mov dword [FxTabledA2+0B6h*4],FxOpdB6 + mov dword [FxTabledA2+0B7h*4],FxOpdB7 + mov dword [FxTabledA2+0B8h*4],FxOpdB8 + mov dword [FxTabledA2+0B9h*4],FxOpdB9 + mov dword [FxTabledA2+0BAh*4],FxOpdBA + mov dword [FxTabledA2+0BBh*4],FxOpdBB + mov dword [FxTabledA2+0BCh*4],FxOpdBC + mov dword [FxTabledA2+0BDh*4],FxOpdBD + mov dword [FxTabledA2+0BEh*4],FxOpdBE + mov dword [FxTabledA2+0BFh*4],FxOpdBF + + mov dword [FxTabledA2+0C0h*4],FxOpdC0 + mov dword [FxTabledA2+0C1h*4],FxOpdC1A2 + mov dword [FxTabledA2+0C2h*4],FxOpdC2A2 + mov dword [FxTabledA2+0C3h*4],FxOpdC3A2 + mov dword [FxTabledA2+0C4h*4],FxOpdC4A2 + mov dword [FxTabledA2+0C5h*4],FxOpdC5A2 + mov dword [FxTabledA2+0C6h*4],FxOpdC6A2 + mov dword [FxTabledA2+0C7h*4],FxOpdC7A2 + mov dword [FxTabledA2+0C8h*4],FxOpdC8A2 + mov dword [FxTabledA2+0C9h*4],FxOpdC9A2 + mov dword [FxTabledA2+0CAh*4],FxOpdCAA2 + mov dword [FxTabledA2+0CBh*4],FxOpdCBA2 + mov dword [FxTabledA2+0CCh*4],FxOpdCCA2 + mov dword [FxTabledA2+0CDh*4],FxOpdCDA2 + mov dword [FxTabledA2+0CEh*4],FxOpdCEA2 + mov dword [FxTabledA2+0CFh*4],FxOpdCFA2 + + mov dword [FxTabledA2+0D0h*4],FxOpdD0 + mov dword [FxTabledA2+0D1h*4],FxOpdD1 + mov dword [FxTabledA2+0D2h*4],FxOpdD2 + mov dword [FxTabledA2+0D3h*4],FxOpdD3 + mov dword [FxTabledA2+0D4h*4],FxOpdD4 + mov dword [FxTabledA2+0D5h*4],FxOpdD5 + mov dword [FxTabledA2+0D6h*4],FxOpdD6 + mov dword [FxTabledA2+0D7h*4],FxOpdD7 + mov dword [FxTabledA2+0D8h*4],FxOpdD8 + mov dword [FxTabledA2+0D9h*4],FxOpdD9 + mov dword [FxTabledA2+0DAh*4],FxOpdDA + mov dword [FxTabledA2+0DBh*4],FxOpdDB + mov dword [FxTabledA2+0DCh*4],FxOpdDC + mov dword [FxTabledA2+0DDh*4],FxOpdDD + mov dword [FxTabledA2+0DEh*4],FxOpdDE + mov dword [FxTabledA2+0DFh*4],FxOpdDFA2 + + mov dword [FxTabledA2+0E0h*4],FxOpdE0 + mov dword [FxTabledA2+0E1h*4],FxOpdE1 + mov dword [FxTabledA2+0E2h*4],FxOpdE2 + mov dword [FxTabledA2+0E3h*4],FxOpdE3 + mov dword [FxTabledA2+0E4h*4],FxOpdE4 + mov dword [FxTabledA2+0E5h*4],FxOpdE5 + mov dword [FxTabledA2+0E6h*4],FxOpdE6 + mov dword [FxTabledA2+0E7h*4],FxOpdE7 + mov dword [FxTabledA2+0E8h*4],FxOpdE8 + mov dword [FxTabledA2+0E9h*4],FxOpdE9 + mov dword [FxTabledA2+0EAh*4],FxOpdEA + mov dword [FxTabledA2+0EBh*4],FxOpdEB + mov dword [FxTabledA2+0ECh*4],FxOpdEC + mov dword [FxTabledA2+0EDh*4],FxOpdED + mov dword [FxTabledA2+0EEh*4],FxOpdEE + mov dword [FxTabledA2+0EFh*4],FxOpdEFA2 + + mov dword [FxTabledA2+0F0h*4],FxOpdF0A2 + mov dword [FxTabledA2+0F1h*4],FxOpdF1A2 + mov dword [FxTabledA2+0F2h*4],FxOpdF2A2 + mov dword [FxTabledA2+0F3h*4],FxOpdF3A2 + mov dword [FxTabledA2+0F4h*4],FxOpdF4A2 + mov dword [FxTabledA2+0F5h*4],FxOpdF5A2 + mov dword [FxTabledA2+0F6h*4],FxOpdF6A2 + mov dword [FxTabledA2+0F7h*4],FxOpdF7A2 + mov dword [FxTabledA2+0F8h*4],FxOpdF8A2 + mov dword [FxTabledA2+0F9h*4],FxOpdF9A2 + mov dword [FxTabledA2+0FAh*4],FxOpdFAA2 + mov dword [FxTabledA2+0FBh*4],FxOpdFBA2 + mov dword [FxTabledA2+0FCh*4],FxOpdFCA2 + mov dword [FxTabledA2+0FDh*4],FxOpdFDA2 + mov dword [FxTabledA2+0FEh*4],FxOpdFEA2 + mov dword [FxTabledA2+0FFh*4],FxOpdFFA2 + + mov dword [FxTabledA3+00h*4],FxOpd00 + mov dword [FxTabledA3+01h*4],FxOpd01 + mov dword [FxTabledA3+02h*4],FxOpd02 + mov dword [FxTabledA3+03h*4],FxOpd03 + mov dword [FxTabledA3+04h*4],FxOpd04 + mov dword [FxTabledA3+05h*4],FxOpd05 + mov dword [FxTabledA3+06h*4],FxOpd06 + mov dword [FxTabledA3+07h*4],FxOpd07 + mov dword [FxTabledA3+08h*4],FxOpd08 + mov dword [FxTabledA3+09h*4],FxOpd09 + mov dword [FxTabledA3+0Ah*4],FxOpd0A + mov dword [FxTabledA3+0Bh*4],FxOpd0B + mov dword [FxTabledA3+0Ch*4],FxOpd0C + mov dword [FxTabledA3+0Dh*4],FxOpd0D + mov dword [FxTabledA3+0Eh*4],FxOpd0E + mov dword [FxTabledA3+0Fh*4],FxOpd0F + + mov dword [FxTabledA3+10h*4],FxOpd10 + mov dword [FxTabledA3+11h*4],FxOpd11 + mov dword [FxTabledA3+12h*4],FxOpd12 + mov dword [FxTabledA3+13h*4],FxOpd13 + mov dword [FxTabledA3+14h*4],FxOpd14 + mov dword [FxTabledA3+15h*4],FxOpd15 + mov dword [FxTabledA3+16h*4],FxOpd16 + mov dword [FxTabledA3+17h*4],FxOpd17 + mov dword [FxTabledA3+18h*4],FxOpd18 + mov dword [FxTabledA3+19h*4],FxOpd19 + mov dword [FxTabledA3+1Ah*4],FxOpd1A + mov dword [FxTabledA3+1Bh*4],FxOpd1B + mov dword [FxTabledA3+1Ch*4],FxOpd1C + mov dword [FxTabledA3+1Dh*4],FxOpd1D + mov dword [FxTabledA3+1Eh*4],FxOpd1E + mov dword [FxTabledA3+1Fh*4],FxOpd1F + + mov dword [FxTabledA3+20h*4],FxOpd20 + mov dword [FxTabledA3+21h*4],FxOpd21 + mov dword [FxTabledA3+22h*4],FxOpd22 + mov dword [FxTabledA3+23h*4],FxOpd23 + mov dword [FxTabledA3+24h*4],FxOpd24 + mov dword [FxTabledA3+25h*4],FxOpd25 + mov dword [FxTabledA3+26h*4],FxOpd26 + mov dword [FxTabledA3+27h*4],FxOpd27 + mov dword [FxTabledA3+28h*4],FxOpd28 + mov dword [FxTabledA3+29h*4],FxOpd29 + mov dword [FxTabledA3+2Ah*4],FxOpd2A + mov dword [FxTabledA3+2Bh*4],FxOpd2B + mov dword [FxTabledA3+2Ch*4],FxOpd2C + mov dword [FxTabledA3+2Dh*4],FxOpd2D + mov dword [FxTabledA3+2Eh*4],FxOpd2E + mov dword [FxTabledA3+2Fh*4],FxOpd2F + + mov dword [FxTabledA3+30h*4],FxOpd30 + mov dword [FxTabledA3+31h*4],FxOpd31 + mov dword [FxTabledA3+32h*4],FxOpd32 + mov dword [FxTabledA3+33h*4],FxOpd33 + mov dword [FxTabledA3+34h*4],FxOpd34 + mov dword [FxTabledA3+35h*4],FxOpd35 + mov dword [FxTabledA3+36h*4],FxOpd36 + mov dword [FxTabledA3+37h*4],FxOpd37 + mov dword [FxTabledA3+38h*4],FxOpd38 + mov dword [FxTabledA3+39h*4],FxOpd39 + mov dword [FxTabledA3+3Ah*4],FxOpd3A + mov dword [FxTabledA3+3Bh*4],FxOpd3B + mov dword [FxTabledA3+3Ch*4],FxOpd3C + mov dword [FxTabledA3+3Dh*4],FxOpd3D + mov dword [FxTabledA3+3Eh*4],FxOpd3E + mov dword [FxTabledA3+3Fh*4],FxOpd3F + + mov dword [FxTabledA3+40h*4],FxOpd40 + mov dword [FxTabledA3+41h*4],FxOpd41 + mov dword [FxTabledA3+42h*4],FxOpd42 + mov dword [FxTabledA3+43h*4],FxOpd43 + mov dword [FxTabledA3+44h*4],FxOpd44 + mov dword [FxTabledA3+45h*4],FxOpd45 + mov dword [FxTabledA3+46h*4],FxOpd46 + mov dword [FxTabledA3+47h*4],FxOpd47 + mov dword [FxTabledA3+48h*4],FxOpd48 + mov dword [FxTabledA3+49h*4],FxOpd49 + mov dword [FxTabledA3+4Ah*4],FxOpd4A + mov dword [FxTabledA3+4Bh*4],FxOpd4B + mov dword [FxTabledA3+4Ch*4],FxOpd4C + mov dword [FxTabledA3+4Dh*4],FxOpd4D + mov dword [FxTabledA3+4Eh*4],FxOpd4E + mov dword [FxTabledA3+4Fh*4],FxOpd4F + + mov dword [FxTabledA3+50h*4],FxOpd50A3 + mov dword [FxTabledA3+51h*4],FxOpd51A3 + mov dword [FxTabledA3+52h*4],FxOpd52A3 + mov dword [FxTabledA3+53h*4],FxOpd53A3 + mov dword [FxTabledA3+54h*4],FxOpd54A3 + mov dword [FxTabledA3+55h*4],FxOpd55A3 + mov dword [FxTabledA3+56h*4],FxOpd56A3 + mov dword [FxTabledA3+57h*4],FxOpd57A3 + mov dword [FxTabledA3+58h*4],FxOpd58A3 + mov dword [FxTabledA3+59h*4],FxOpd59A3 + mov dword [FxTabledA3+5Ah*4],FxOpd5AA3 + mov dword [FxTabledA3+5Bh*4],FxOpd5BA3 + mov dword [FxTabledA3+5Ch*4],FxOpd5CA3 + mov dword [FxTabledA3+5Dh*4],FxOpd5DA3 + mov dword [FxTabledA3+5Eh*4],FxOpd5EA3 + mov dword [FxTabledA3+5Fh*4],FxOpd5FA3 + + mov dword [FxTabledA3+60h*4],FxOpd60A3 + mov dword [FxTabledA3+61h*4],FxOpd61A3 + mov dword [FxTabledA3+62h*4],FxOpd62A3 + mov dword [FxTabledA3+63h*4],FxOpd63A3 + mov dword [FxTabledA3+64h*4],FxOpd64A3 + mov dword [FxTabledA3+65h*4],FxOpd65A3 + mov dword [FxTabledA3+66h*4],FxOpd66A3 + mov dword [FxTabledA3+67h*4],FxOpd67A3 + mov dword [FxTabledA3+68h*4],FxOpd68A3 + mov dword [FxTabledA3+69h*4],FxOpd69A3 + mov dword [FxTabledA3+6Ah*4],FxOpd6AA3 + mov dword [FxTabledA3+6Bh*4],FxOpd6BA3 + mov dword [FxTabledA3+6Ch*4],FxOpd6CA3 + mov dword [FxTabledA3+6Dh*4],FxOpd6DA3 + mov dword [FxTabledA3+6Eh*4],FxOpd6EA3 + mov dword [FxTabledA3+6Fh*4],FxOpd6FA3 + + mov dword [FxTabledA3+70h*4],FxOpd70 + mov dword [FxTabledA3+71h*4],FxOpd71A3 + mov dword [FxTabledA3+72h*4],FxOpd72A3 + mov dword [FxTabledA3+73h*4],FxOpd73A3 + mov dword [FxTabledA3+74h*4],FxOpd74A3 + mov dword [FxTabledA3+75h*4],FxOpd75A3 + mov dword [FxTabledA3+76h*4],FxOpd76A3 + mov dword [FxTabledA3+77h*4],FxOpd77A3 + mov dword [FxTabledA3+78h*4],FxOpd78A3 + mov dword [FxTabledA3+79h*4],FxOpd79A3 + mov dword [FxTabledA3+7Ah*4],FxOpd7AA3 + mov dword [FxTabledA3+7Bh*4],FxOpd7BA3 + mov dword [FxTabledA3+7Ch*4],FxOpd7CA3 + mov dword [FxTabledA3+7Dh*4],FxOpd7DA3 + mov dword [FxTabledA3+7Eh*4],FxOpd7EA3 + mov dword [FxTabledA3+7Fh*4],FxOpd7FA3 + + mov dword [FxTabledA3+80h*4],FxOpd80A3 + mov dword [FxTabledA3+81h*4],FxOpd81A3 + mov dword [FxTabledA3+82h*4],FxOpd82A3 + mov dword [FxTabledA3+83h*4],FxOpd83A3 + mov dword [FxTabledA3+84h*4],FxOpd84A3 + mov dword [FxTabledA3+85h*4],FxOpd85A3 + mov dword [FxTabledA3+86h*4],FxOpd86A3 + mov dword [FxTabledA3+87h*4],FxOpd87A3 + mov dword [FxTabledA3+88h*4],FxOpd88A3 + mov dword [FxTabledA3+89h*4],FxOpd89A3 + mov dword [FxTabledA3+8Ah*4],FxOpd8AA3 + mov dword [FxTabledA3+8Bh*4],FxOpd8BA3 + mov dword [FxTabledA3+8Ch*4],FxOpd8CA3 + mov dword [FxTabledA3+8Dh*4],FxOpd8DA3 + mov dword [FxTabledA3+8Eh*4],FxOpd8EA3 + mov dword [FxTabledA3+8Fh*4],FxOpd8FA3 + + mov dword [FxTabledA3+90h*4],FxOpd90 + mov dword [FxTabledA3+91h*4],FxOpd91 + mov dword [FxTabledA3+92h*4],FxOpd92 + mov dword [FxTabledA3+93h*4],FxOpd93 + mov dword [FxTabledA3+94h*4],FxOpd94 + mov dword [FxTabledA3+95h*4],FxOpd95 + mov dword [FxTabledA3+96h*4],FxOpd96 + mov dword [FxTabledA3+97h*4],FxOpd97 + mov dword [FxTabledA3+98h*4],FxOpd98 + mov dword [FxTabledA3+99h*4],FxOpd99 + mov dword [FxTabledA3+9Ah*4],FxOpd9A + mov dword [FxTabledA3+9Bh*4],FxOpd9B + mov dword [FxTabledA3+9Ch*4],FxOpd9C + mov dword [FxTabledA3+9Dh*4],FxOpd9D + mov dword [FxTabledA3+9Eh*4],FxOpd9E + mov dword [FxTabledA3+9Fh*4],FxOpd9F + + mov dword [FxTabledA3+0A0h*4],FxOpdA0 + mov dword [FxTabledA3+0A1h*4],FxOpdA1 + mov dword [FxTabledA3+0A2h*4],FxOpdA2 + mov dword [FxTabledA3+0A3h*4],FxOpdA3 + mov dword [FxTabledA3+0A4h*4],FxOpdA4 + mov dword [FxTabledA3+0A5h*4],FxOpdA5 + mov dword [FxTabledA3+0A6h*4],FxOpdA6 + mov dword [FxTabledA3+0A7h*4],FxOpdA7 + mov dword [FxTabledA3+0A8h*4],FxOpdA8 + mov dword [FxTabledA3+0A9h*4],FxOpdA9 + mov dword [FxTabledA3+0AAh*4],FxOpdAA + mov dword [FxTabledA3+0ABh*4],FxOpdAB + mov dword [FxTabledA3+0ACh*4],FxOpdAC + mov dword [FxTabledA3+0ADh*4],FxOpdAD + mov dword [FxTabledA3+0AEh*4],FxOpdAE + mov dword [FxTabledA3+0AFh*4],FxOpdAF + + mov dword [FxTabledA3+0B0h*4],FxOpdB0 + mov dword [FxTabledA3+0B1h*4],FxOpdB1 + mov dword [FxTabledA3+0B2h*4],FxOpdB2 + mov dword [FxTabledA3+0B3h*4],FxOpdB3 + mov dword [FxTabledA3+0B4h*4],FxOpdB4 + mov dword [FxTabledA3+0B5h*4],FxOpdB5 + mov dword [FxTabledA3+0B6h*4],FxOpdB6 + mov dword [FxTabledA3+0B7h*4],FxOpdB7 + mov dword [FxTabledA3+0B8h*4],FxOpdB8 + mov dword [FxTabledA3+0B9h*4],FxOpdB9 + mov dword [FxTabledA3+0BAh*4],FxOpdBA + mov dword [FxTabledA3+0BBh*4],FxOpdBB + mov dword [FxTabledA3+0BCh*4],FxOpdBC + mov dword [FxTabledA3+0BDh*4],FxOpdBD + mov dword [FxTabledA3+0BEh*4],FxOpdBE + mov dword [FxTabledA3+0BFh*4],FxOpdBF + + mov dword [FxTabledA3+0C0h*4],FxOpdC0 + mov dword [FxTabledA3+0C1h*4],FxOpdC1A3 + mov dword [FxTabledA3+0C2h*4],FxOpdC2A3 + mov dword [FxTabledA3+0C3h*4],FxOpdC3A3 + mov dword [FxTabledA3+0C4h*4],FxOpdC4A3 + mov dword [FxTabledA3+0C5h*4],FxOpdC5A3 + mov dword [FxTabledA3+0C6h*4],FxOpdC6A3 + mov dword [FxTabledA3+0C7h*4],FxOpdC7A3 + mov dword [FxTabledA3+0C8h*4],FxOpdC8A3 + mov dword [FxTabledA3+0C9h*4],FxOpdC9A3 + mov dword [FxTabledA3+0CAh*4],FxOpdCAA3 + mov dword [FxTabledA3+0CBh*4],FxOpdCBA3 + mov dword [FxTabledA3+0CCh*4],FxOpdCCA3 + mov dword [FxTabledA3+0CDh*4],FxOpdCDA3 + mov dword [FxTabledA3+0CEh*4],FxOpdCEA3 + mov dword [FxTabledA3+0CFh*4],FxOpdCFA3 + + mov dword [FxTabledA3+0D0h*4],FxOpdD0 + mov dword [FxTabledA3+0D1h*4],FxOpdD1 + mov dword [FxTabledA3+0D2h*4],FxOpdD2 + mov dword [FxTabledA3+0D3h*4],FxOpdD3 + mov dword [FxTabledA3+0D4h*4],FxOpdD4 + mov dword [FxTabledA3+0D5h*4],FxOpdD5 + mov dword [FxTabledA3+0D6h*4],FxOpdD6 + mov dword [FxTabledA3+0D7h*4],FxOpdD7 + mov dword [FxTabledA3+0D8h*4],FxOpdD8 + mov dword [FxTabledA3+0D9h*4],FxOpdD9 + mov dword [FxTabledA3+0DAh*4],FxOpdDA + mov dword [FxTabledA3+0DBh*4],FxOpdDB + mov dword [FxTabledA3+0DCh*4],FxOpdDC + mov dword [FxTabledA3+0DDh*4],FxOpdDD + mov dword [FxTabledA3+0DEh*4],FxOpdDE + mov dword [FxTabledA3+0DFh*4],FxOpdDFA3 + + mov dword [FxTabledA3+0E0h*4],FxOpdE0 + mov dword [FxTabledA3+0E1h*4],FxOpdE1 + mov dword [FxTabledA3+0E2h*4],FxOpdE2 + mov dword [FxTabledA3+0E3h*4],FxOpdE3 + mov dword [FxTabledA3+0E4h*4],FxOpdE4 + mov dword [FxTabledA3+0E5h*4],FxOpdE5 + mov dword [FxTabledA3+0E6h*4],FxOpdE6 + mov dword [FxTabledA3+0E7h*4],FxOpdE7 + mov dword [FxTabledA3+0E8h*4],FxOpdE8 + mov dword [FxTabledA3+0E9h*4],FxOpdE9 + mov dword [FxTabledA3+0EAh*4],FxOpdEA + mov dword [FxTabledA3+0EBh*4],FxOpdEB + mov dword [FxTabledA3+0ECh*4],FxOpdEC + mov dword [FxTabledA3+0EDh*4],FxOpdED + mov dword [FxTabledA3+0EEh*4],FxOpdEE + mov dword [FxTabledA3+0EFh*4],FxOpdEFA3 + + mov dword [FxTabledA3+0F0h*4],FxOpdF0 + mov dword [FxTabledA3+0F1h*4],FxOpdF1 + mov dword [FxTabledA3+0F2h*4],FxOpdF2 + mov dword [FxTabledA3+0F3h*4],FxOpdF3 + mov dword [FxTabledA3+0F4h*4],FxOpdF4 + mov dword [FxTabledA3+0F5h*4],FxOpdF5 + mov dword [FxTabledA3+0F6h*4],FxOpdF6 + mov dword [FxTabledA3+0F7h*4],FxOpdF7 + mov dword [FxTabledA3+0F8h*4],FxOpdF8 + mov dword [FxTabledA3+0F9h*4],FxOpdF9 + mov dword [FxTabledA3+0FAh*4],FxOpdFA + mov dword [FxTabledA3+0FBh*4],FxOpdFB + mov dword [FxTabledA3+0FCh*4],FxOpdFC + mov dword [FxTabledA3+0FDh*4],FxOpdFD + mov dword [FxTabledA3+0FEh*4],FxOpdFE + mov dword [FxTabledA3+0FFh*4],FxOpdFF + ret + +; normal +SECTION .data +NEWSYM sfxnametab + db 'STOP NOP CACHE LSR ' + db 'ROL BRA BLT BGE ' + db 'BNE BEQ BPL BMI ' + db 'BCC BCS BVC BVS ' + + db 'TO R0 TO R1 TO R2 TO R3 ' ; MOVE when B=1 + db 'TO R4 TO R5 TO R6 TO R7 ' + db 'TO R8 TO R9 TO R10 TO R11 ' + db 'TO R12 TO R13 TO R14 TO R15 ' + + db 'WITH R0 WITH R1 WITH R2 WITH R3 ' + db 'WITH R4 WITH R5 WITH R6 WITH R7 ' + db 'WITH R8 WITH R9 WITH R10WITH R11' + db 'WITH R12WITH R13WITH R14WITH R15' + + db 'STW(R0) STW(R1) STW(R2) STW(R3) ' + db 'STW(R4) STW(R5) STW(R6) STW(R7) ' + db 'STW(R8) STW(R9) STW(R10)STW(R11)' + db 'LOOP ALT1 ALT2 ALT3 ' + + db 'LDW(R0) LDW(R1) LDW(R2) LDW(R3) ' + db 'LDW(R4) LDW(R5) LDW(R6) LDW(R7) ' + db 'LDW(R8) LDW(R9) LDW(R10)LDW(R11)' + db 'PLOT SWAP COLOR NOT ' + + db 'ADD R0 ADD R1 ADD R2 ADD R3 ' + db 'ADD R4 ADD R5 ADD R6 ADD R7 ' + db 'ADD R8 ADD R9 ADD R10 ADD R11 ' + db 'ADD R12 ADD R13 ADD R14 ADD R15 ' + + db 'SUB R0 SUB R1 SUB R2 SUB R3 ' + db 'SUB R4 SUB R5 SUB R6 SUB R7 ' + db 'SUB R8 SUB R9 SUB R10 SUB R11 ' + db 'SUB R12 SUB R13 SUB R14 SUB R15 ' + + db 'MERGE AND R1 AND R2 AND R3 ' + db 'AND R4 AND R5 AND R6 AND R7 ' + db 'AND R8 AND R9 AND R10 AND R11 ' + db 'AND R12 AND R13 AND R14 AND R15 ' + + db 'MULT R0 MULT R1 MULT R2 MULT R3 ' + db 'MULT R4 MULT R5 MULT R6 MULT R7 ' + db 'MULT R8 MULT R9 MULT R10MULT R11' + db 'MULT R12MULT R13MULT R14MULT R15' + + db 'SBK LINK #$1LINK #$2LINK #$3' + db 'LINK #$4SEX ASR ROR ' + db 'JMP R8 JMP R9 JMP R10 JMP R11 ' + db 'JMP R12 JMP R13 LOB FMULT ' + + db 'IBT R0 IBT R1 IBT R2 IBT R3 ' + db 'IBT R4 IBT R5 IBT R6 IBT R7 ' + db 'IBT R8 IBT R9 IBT R10 IBT R11 ' + db 'IBT R12 IBT R13 IBT R14 IBT R15 ' + + db 'FROM R0 FROM R1 FROM R2 FROM R3 ' ; MOVES if B=1 + db 'FROM R4 FROM R5 FROM R6 FROM R7 ' + db 'FROM R8 FROM R9 FROM R10FROM R11' + db 'FROM R12FROM R13FROM R14FROM R15' + + db 'HIB OR R1 OR R2 OR R3 ' + db 'OR R4 OR R5 OR R6 OR R7 ' + db 'OR R8 OR R9 OR R10 OR R11 ' + db 'OR R12 OR R13 OR R14 OR R15 ' + + db 'INC R0 INC R1 INC R2 INC R3 ' + db 'INC R4 INC R5 INC R6 INC R7 ' + db 'INC R8 INC R9 INC R10 INC R11 ' + db 'INC R12 INC R13 INC R14 GETC ' + + db 'DEC R0 DEC R1 DEC R2 DEC R3 ' + db 'DEC R4 DEC R5 DEC R6 DEC R7 ' + db 'DEC R8 DEC R9 DEC R10 DEC R11 ' + db 'DEC R12 DEC R13 DEC R14 GETB ' + + db 'IWT R0 IWT R1 IWT R2 IWT R3 ' + db 'IWT R4 IWT R5 IWT R6 IWT R7 ' + db 'IWT R8 IWT R9 IWT R10 IWT R11 ' + db 'IWT R12 IWT R13 IWT R14 IWT R15 ' + +;A1 + db 'STOP NOP CACHE LSR ' + db 'ROL BRA BLT BGE ' + db 'BNE BEQ BPL BMI ' + db 'BCC BCS BVC BVS ' + + db 'TO R0 TO R1 TO R2 TO R3 ' ; MOVE when B=1 + db 'TO R4 TO R5 TO R6 TO R7 ' + db 'TO R8 TO R9 TO R10 TO R11 ' + db 'TO R12 TO R13 TO R14 TO R15 ' + + db 'WITH R0 WITH R1 WITH R2 WITH R3 ' + db 'WITH R4 WITH R5 WITH R6 WITH R7 ' + db 'WITH R8 WITH R9 WITH R10WITH R11' + db 'WITH R12WITH R13WITH R14WITH R15' + + db 'STB(R0) STB(R1) STB(R2) STB(R3) ' + db 'STB(R4) STB(R5) STB(R6) STB(R7) ' + db 'STB(R8) STB(R9) STB(R10)STB(R11)' + db 'LOOP ALT1 ALT2 ALT3 ' + + db 'LDB(R0) LDB(R1) LDB(R2) LDB(R3) ' + db 'LDB(R4) LDB(R5) LDB(R6) LDB(R7) ' + db 'LDB(R8) LDB(R9) LDB(R10)LDB(R11)' + db 'PLOT SWAP CMODE NOT ' + + db 'ADC R0 ADC R1 ADC R2 ADC R3 ' + db 'ADC R4 ADC R5 ADC R6 ADC R7 ' + db 'ADC R8 ADC R9 ADC R10 ADC R11 ' + db 'ADC R12 ADC R13 ADC R14 ADC R15 ' + + db 'SBC R0 SBC R1 SBC R2 SBC R3 ' + db 'SBC R4 SBC R5 SBC R6 SBC R7 ' + db 'SBC R8 SBC R9 SBC R10 SBC R11 ' + db 'SBC R12 SBC R13 SBC R14 SBC R15 ' + + db 'MERGE BIC R1 BIC R2 BIC R3 ' + db 'BIC R4 BIC R5 BIC R6 BIC R7 ' + db 'BIC R8 BIC R9 BIC R10 BIC R11 ' + db 'BIC R12 BIC R13 BIC R14 BIC R15 ' + + db 'UMULTR0 UMULTR1 UMULTR2 UMULTR3 ' + db 'UMULTR4 UMULTR5 UMULTR6 UMULTR7 ' + db 'UMULTR8 UMULTR9 UMULTR10UMULTR11' + db 'UMULTR12UMULTR13UMULTR14UMULTR15' + + db 'SBK LINK #$1LINK #$2LINK #$3' + db 'LINK #$4SEX DIV2 ROR ' + db 'LJMP R8 LJMP R9 LJMP R10LJMP R11' + db 'LJMP R12LJMP R13LOB LMULT ' + + db 'LMS R0 LMS R1 LMS R2 LMS R3 ' + db 'LMS R4 LMS R5 LMS R6 LMS R7 ' + db 'LMS R8 LMS R9 LMS R10 LMS R11 ' + db 'LMS R12 LMS R13 LMS R14 LMS R15 ' + + db 'FROM R0 FROM R1 FROM R2 FROM R3 ' ; MOVES if B=1 + db 'FROM R4 FROM R5 FROM R6 FROM R7 ' + db 'FROM R8 FROM R9 FROM R10FROM R11' + db 'FROM R12FROM R13FROM R14FROM R15' + + db 'HIB XOR R1 XOR R2 XOR R3 ' + db 'XOR R4 XOR R5 XOR R6 XOR R7 ' + db 'XOR R8 XOR R9 XOR R10 XOR R11 ' + db 'XOR R12 XOR R13 XOR R14 XOR R15 ' + + db 'INC R0 INC R1 INC R2 INC R3 ' + db 'INC R4 INC R5 INC R6 INC R7 ' + db 'INC R8 INC R9 INC R10 INC R11 ' + db 'INC R12 INC R13 INC R14 GETC ' + + db 'DEC R0 DEC R1 DEC R2 DEC R3 ' + db 'DEC R4 DEC R5 DEC R6 DEC R7 ' + db 'DEC R8 DEC R9 DEC R10 DEC R11 ' + db 'DEC R12 DEC R13 DEC R14 GETBH ' + + db 'LM R0 LM R1 LM R2 LM R3 ' + db 'LM R4 LM R5 LM R6 LM R7 ' + db 'LM R8 LM R9 LM R10 LM R11 ' + db 'LM R12 LM R13 LM R14 LM R15 ' +;A2 + db 'STOP NOP CACHE LSR ' + db 'ROL BRA BLT BGE ' + db 'BNE BEQ BPL BMI ' + db 'BCC BCS BVC BVS ' + + db 'TO R0 TO R1 TO R2 TO R3 ' ; MOVE when B=1 + db 'TO R4 TO R5 TO R6 TO R7 ' + db 'TO R8 TO R9 TO R10 TO R11 ' + db 'TO R12 TO R13 TO R14 TO R15 ' + + db 'WITH R0 WITH R1 WITH R2 WITH R3 ' + db 'WITH R4 WITH R5 WITH R6 WITH R7 ' + db 'WITH R8 WITH R9 WITH R10WITH R11' + db 'WITH R12WITH R13WITH R14WITH R15' + + db 'STW(R0) STW(R1) STW(R2) STW(R3) ' + db 'STW(R4) STW(R5) STW(R6) STW(R7) ' + db 'STW(R8) STW(R9) STW(R10)STW(R11)' + db 'LOOP ALT1 ALT2 ALT3 ' + + db 'LDW(R0) LDW(R1) LDW(R2) LDW(R3) ' + db 'LDW(R4) LDW(R5) LDW(R6) LDW(R7) ' + db 'LDW(R8) LDW(R9) LDW(R10)LDW(R11)' + db 'PLOT SWAP COLOR NOT ' + + db 'ADD #$0 ADD #$1 ADD #$2 ADD #$3 ' + db 'ADD #$4 ADD #$5 ADD #$6 ADD #$7 ' + db 'ADD #$8 ADD #$9 ADD #$A ADD #$B ' + db 'ADD #$C ADD #$D ADD #$E ADD #$F ' + + db 'SUB #$0 SUB #$1 SUB #$2 SUB #$3 ' + db 'SUB #$4 SUB #$5 SUB #$6 SUB #$7 ' + db 'SUB #$8 SUB #$9 SUB #$A SUB #$B ' + db 'SUB #$C SUB #$D SUB #$E SUB #$F ' + + db 'MERGE AND #$1 AND #$2 AND #$3 ' + db 'AND #$4 AND #$5 AND #$6 AND #$7 ' + db 'AND #$8 AND #$9 AND #$A AND #$B ' + db 'AND #$C AND #$D AND #$E AND #$F ' + + db 'MULTIR0 MULTIR1 MULTIR2 MULTIR3 ' + db 'MULTIR4 MULTIR5 MULTIR6 MULTIR7 ' + db 'MULTIR8 MULTIR9 MULTIR10MULTIR11' + db 'MULTIR12MULTIR13MULTIR14MULTIR15' + + db 'SBK LINK #$1LINK #$2LINK #$3' + db 'LINK #$4SEX ASR ROR ' + db 'JMP R8 JMP R9 JMP R10 JMP R11 ' + db 'JMP R12 JMP R13 LOB FMULT ' + + db 'SMS R0 SMS R1 SMS R2 SMS R3 ' + db 'SMS R4 SMS R5 SMS R6 SMS R7 ' + db 'SMS R8 SMS R9 SMS R10 SMS R11 ' + db 'SMS R12 SMS R13 SMS R14 SMS R15 ' + + db 'FROM R0 FROM R1 FROM R2 FROM R3 ' ; MOVES if B=1 + db 'FROM R4 FROM R5 FROM R6 FROM R7 ' + db 'FROM R8 FROM R9 FROM R10FROM R11' + db 'FROM R12FROM R13FROM R14FROM R15' + + db 'HIB OR #$1 OR #$2 OR #$3 ' + db 'OR #$4 OR #$5 OR #$6 OR #$7 ' + db 'OR #$8 OR #$9 OR #$A OR #$B ' + db 'OR #$C OR #$D OR #$E OR #$F ' + + db 'INC R0 INC R1 INC R2 INC R3 ' + db 'INC R4 INC R5 INC R6 INC R7 ' + db 'INC R8 INC R9 INC R10 INC R11 ' + db 'INC R12 INC R13 INC R14 RAMB ' + + db 'DEC R0 DEC R1 DEC R2 DEC R3 ' + db 'DEC R4 DEC R5 DEC R6 DEC R7 ' + db 'DEC R8 DEC R9 DEC R10 DEC R11 ' + db 'DEC R12 DEC R13 DEC R14 GETBL ' + + db 'SM R0 SM R1 SM R2 SM R3 ' + db 'SM R4 SM R5 SM R6 SM R7 ' + db 'SM R8 SM R9 SM R10 SM R11 ' + db 'SM R12 SM R13 SM R14 SM R15 ' +;A3 + db 'STOP NOP CACHE LSR ' + db 'ROL BRA BLT BGE ' + db 'BNE BEQ BPL BMI ' + db 'BCC BCS BVC BVS ' + + db 'TO R0 TO R1 TO R2 TO R3 ' ; MOVE when B=1 + db 'TO R4 TO R5 TO R6 TO R7 ' + db 'TO R8 TO R9 TO R10 TO R11 ' + db 'TO R12 TO R13 TO R14 TO R15 ' + + db 'WITH R0 WITH R1 WITH R2 WITH R3 ' + db 'WITH R4 WITH R5 WITH R6 WITH R7 ' + db 'WITH R8 WITH R9 WITH R10WITH R11' + db 'WITH R12WITH R13WITH R14WITH R15' + + db 'STW(R0) STW(R1) STW(R2) STW(R3) ' + db 'STW(R4) STW(R5) STW(R6) STW(R7) ' + db 'STW(R8) STW(R9) STW(R10)STW(R11)' + db 'LOOP ALT1 ALT2 ALT3 ' + + db 'LDW(R0) LDW(R1) LDW(R2) LDW(R3) ' + db 'LDW(R4) LDW(R5) LDW(R6) LDW(R7) ' + db 'LDW(R8) LDW(R9) LDW(R10)LDW(R11)' + db 'PLOT SWAP COLOR NOT ' + + db 'ADC #$0 ADC #$1 ADC #$2 ADC #$3 ' + db 'ADC #$4 ADC #$5 ADC #$6 ADC #$7 ' + db 'ADC #$8 ADC #$9 ADC #$A ADC #$B ' + db 'ADC #$C ADC #$D ADC #$E ADC #$F ' + + db 'CMP R0 CMP R1 CMP R2 CMP R3 ' + db 'CMP R4 CMP R5 CMP R6 CMP R7 ' + db 'CMP R8 CMP R9 CMP R10 CMP R11 ' + db 'CMP R12 CMP R13 CMP R14 CMP R15 ' + + db 'MERGE BIC #$1 BIC #$2 BIC #$3 ' + db 'BIC #$4 BIC #$5 BIC #$6 BIC #$7 ' + db 'BIC #$8 BIC #$9 BIC #$A BIC #$B ' + db 'BIC #$C BIC #$D BIC #$E BIC #$F ' + + db 'UMULIR0 UMULIR1 UMULIR2 UMULIR3 ' + db 'UMULIR4 UMULIR5 UMULIR6 UMULIR7 ' + db 'UMULIR8 UMULIR9 UMULIR10UMULIR11' + db 'UMULIR12UMULIR13UMULIR14UMULIR15' + + db 'SBK LINK #$1LINK #$2LINK #$3' + db 'LINK #$4SEX ASR ROR ' + db 'JMP R8 JMP R9 JMP R10 JMP R11 ' + db 'JMP R12 JMP R13 LOB FMULT ' + + db 'IBT R0 IBT R1 IBT R2 IBT R3 ' + db 'IBT R4 IBT R5 IBT R6 IBT R7 ' + db 'IBT R8 IBT R9 IBT R10 IBT R11 ' + db 'IBT R12 IBT R13 IBT R14 IBT R15 ' + + db 'FROM R0 FROM R1 FROM R2 FROM R3 ' ; MOVES if B=1 + db 'FROM R4 FROM R5 FROM R6 FROM R7 ' + db 'FROM R8 FROM R9 FROM R10FROM R11' + db 'FROM R12FROM R13FROM R14FROM R15' + + db 'HIB XOR #$1 XOR #$2 XOR #$3 ' + db 'XOR #$4 XOR #$5 XOR #$6 XOR #$7 ' + db 'XOR #$8 XOR #$9 XOR #$A XOR #$B ' + db 'XOR #$C XOR #$D XOR #$E XOR #$F ' + + db 'INC R0 INC R1 INC R2 INC R3 ' + db 'INC R4 INC R5 INC R6 INC R7 ' + db 'INC R8 INC R9 INC R10 INC R11 ' + db 'INC R12 INC R13 INC R14 ROMB ' + + db 'DEC R0 DEC R1 DEC R2 DEC R3 ' + db 'DEC R4 DEC R5 DEC R6 DEC R7 ' + db 'DEC R8 DEC R9 DEC R10 DEC R11 ' + db 'DEC R12 DEC R13 DEC R14 GETBS ' + + db 'IWT R0 IWT R1 IWT R2 IWT R3 ' + db 'IWT R4 IWT R5 IWT R6 IWT R7 ' + db 'IWT R8 IWT R9 IWT R10 IWT R11 ' + db 'IWT R12 IWT R13 IWT R14 IWT R15 ' + +SECTION .text +NEWSYM FxTableAsmEnd diff --git a/src/i386/getset.S b/src/i386/getset.S new file mode 100644 index 0000000..0ca6f1d --- /dev/null +++ b/src/i386/getset.S @@ -0,0 +1,1079 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.data +.BankSave: + .long 0 +.text + +.globl S9xGetByte + +S9xGetByte: + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + + movb InDMA, %cl + testb %cl, %cl + jne .GB_NOADD + movb MemorySpeed(%eax), %cl + andl $0xff, %ecx + addl %ecx, CYCLES + SAVE_CYCLES /*save now, so we don't need to necessarily save later*/ +.GB_NOADD: +#ifdef CPU_SHUTDOWN + movb BlockIsRAM(%eax), %ch +#endif + movl Map(, %eax, 4), %eax + cmpl $18, %eax /* MAP_LAST */ + jb .GBSpecial + andl $0xffff, %edx +#ifdef CPU_SHUTDOWN + testb %ch, %ch + jz .GBNotRAM + pushl %eax + movl PCAtOpcodeStart, %eax + movl %eax, WaitAddress + popl %eax +.GBNotRAM: +#endif + movb (%eax, %edx), %al + ret + + .align 4 +.GBSpecial: + jmp *.GBJmpTable(, %eax, 4) +.data + .align 4 +.GBJmpTable: + .long .GBPPU /* MAP_PPU */ + .long .GBCPU /* MAP_CPU */ + .long .GBDSP /* MAP_DSP */ + .long .GBLSRAM /* MAP_LOROM_SRAM */ + .long .GBHSRAM /* MAP_HIROM_SRAM */ + .long .GBNONE /* MAP_NONE */ + .long .GBDEBUG /* MAP_DEBUG */ + .long .GBC4 /* MAP_C4 */ + .long .GBBWRAM /* MAP_BWRAM */ + .long .GBNONE /* MAP_BWRAM_BITMAP */ + .long .GBNONE /* MAP_BWRAM_BITMAP2 */ + .long .GBNONE /* MAP_SA1RAM */ + .long .GB7ROM /* MAP_SPC7110_ROM */ + .long .GB7RAM /* MAP_SPC7110_DRAM */ + .long .GB7SRM /* MAP_RONLY_SRAM */ + .long .GBOBC1 /* MAP_OBC_RAM */ + .long .GBSDSP /* MAP_SETA_DSP */ + .long .GBSRISC /* MAP_SETA_RISC */ + +.text +.GBPPU: /* MAP_PPU */ + pushl %edx + ccall S9xGetPPU + popl %edx + LOAD_CYCLES + ret + +.GBCPU: /* MAP_CPU */ + pushl %edx + ccall S9xGetCPU + popl %edx + LOAD_CYCLES + ret + +.GBDSP: /* MAP_DSP */ + pushl %edx + ccall S9xGetDSP + LOAD_CYCLES + popl %edx + ret + +.GBLSRAM: /* MAP_LOROM_SRAM */ + movl %edx, %ecx + andl $0x7fff, %edx + andl $0x00ff0000, %ecx + sarl $1, %ecx + orl %ecx, %edx + movl SRAM, %ecx + andl SRAMMask, %edx + movb (%ecx, %edx), %al + ret + +.GB7SRM: /* MAP_RONLY_SRAM */ +.GBHSRAM: /* MAP_HIROM_SRAM */ + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movl SRAM, %eax + andl SRAMMask, %edx + movb (%eax, %edx), %al + ret + +.GBNONE: /* MAP_NONE */ + xorl %eax, %eax + movb OpenBus, %al + ret + +.GBDEBUG: /* MAP_DEBUG */ + xorl %eax, %eax + movb OpenBus, %al + ret + +.GBC4: /* MAP_C4 */ + pushl %edx + ccall S9xGetC4 + popl %edx + LOAD_CYCLES + ret + +.GBBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + addl $-24576, %edx + movl BWRAM, %eax + movb (%eax, %edx), %al + ret + +.GB7ROM: /* MAP_SPC7110_ROM */ + pushl %edx + ccall S9xGetSPC7110Byte + popl %edx + LOAD_CYCLES + ret + +.GB7RAM: /* MAP_SPC7110_DRAM */ + movl $0x4800, %edx + pushl %edx + ccall S9xGetSPC7110 + popl %edx + LOAD_CYCLES + ret + +.GBOBC1: /* MAP_OBC_RAM */ + pushl %edx + ccall GetOBC1 + popl %edx + LOAD_CYCLES + ret + +.GBSDSP: /* MAP_SETA_DSP */ + pushl %edx + ccall S9xGetSetaDSP + popl %edx + LOAD_CYCLES + ret + +.GBSRISC: /* MAP_SETA_RISC */ + pushl %edx + ccall S9xGetST018 + popl %edx + LOAD_CYCLES + ret + + +.globl S9xGetWord + +S9xGetWord: + movl %edx, %eax + /*MK: blocks can be 0x1000 bytes, not a 0x2000 minimum*/ + andl $0x0fff, %eax + cmpl $0x0fff, %eax + /*MK*/ + jne .GWNotAtBlockBoundary + pushl %edx + call S9xGetByte + popl %edx + movb %al, OpenBus + incl %edx + call S9xGetByte + movb %al, %ah + movb OpenBus, %al + ret + +.GWNotAtBlockBoundary: + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + + movb InDMA, %cl + testb %cl, %cl + jne .GW_NOADD + movb MemorySpeed(%eax), %cl + andl $0xff, %ecx + addl %ecx, CYCLES + addl %ecx, CYCLES + SAVE_CYCLES +.GW_NOADD: + +#ifdef CPU_SHUTDOWN + movb BlockIsRAM(%eax), %ch +#endif + movl Map(, %eax, 4), %eax + cmpl $18, %eax /* MAP_LAST */ + jb .GWSpecial + andl $0xffff, %edx +#ifdef CPU_SHUTDOWN + testb %ch, %ch + jz .GWNotRAM + pushl %eax + movl PCAtOpcodeStart, %eax + movl %eax, WaitAddress + popl %eax +.GWNotRAM: +#endif + movw (%eax, %edx), %ax + ret + + .align 4 +.GWSpecial: + jmp *.GWJmpTable(, %eax, 4) + +.data + .align 4 +.GWJmpTable: + .long .GWPPU /* MAP_PPU */ + .long .GWCPU /* MAP_CPU */ + .long .GWDSP /* MAP_DSP */ + .long .GWLSRAM /* MAP_LOROM_SRAM */ + .long .GWHSRAM /* MAP_HIROM_SRAM */ + .long .GWNONE /* MAP_NONE */ + .long .GWDEBUG /* MAP_DEBUG */ + .long .GWC4 /* MAP_C4 */ + .long .GWBWRAM /* MAP_BWRAM */ + .long .GWNONE /* MAP_BWRAM_BITMAP */ + .long .GWNONE /* MAP_BWRAM_BITMAP2 */ + .long .GWNONE /* MAP_SA1RAM */ + .long .GW7ROM /* MAP_SPC7110_ROM */ + .long .GW7RAM /* MAP_SPC7110_DRAM */ + .long .GW7SRM /* MAP_RONLY_SRAM */ + .long .GWOBC1 /* MAP_OBC_RAM */ + .long .GWSDSP /* MAP_SETA_DSP */ + .long .GWSRISC /* MAP_SETA_RISC */ + +.text +.GWPPU: /* MAP_PPU */ + pushl %edx + ccall S9xGetPPU + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetPPU + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWCPU: /* MAP_CPU */ + pushl %edx + ccall S9xGetCPU + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetCPU + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWDSP: /* MAP_DSP */ + pushl %edx + ccall S9xGetDSP + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetDSP + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWLSRAM: /* MAP_LOROM_SRAM */ + movl %edx, %ecx + andl $0x7fff, %edx + andl $0x00ff0000, %ecx + sarl $1, %ecx + orl %ecx, %edx + movl SRAM, %ecx + andl SRAMMask, %edx + movb (%ecx, %edx), %al + incl %edx + andl SRAMMask, %edx + movb (%ecx, %edx), %ah + ret + +.GW7SRM: /* MAP_RONLY_SRAM */ +.GWHSRAM: /* MAP_HIROM_SRAM */ + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movl SRAM, %ecx + movb (%ecx, %edx), %al + incl %edx + andl SRAMMask, %edx + movb (%ecx, %edx), %ah + ret + +.GWNONE: + xorl %eax, %eax + movb OpenBus, %ah + movb OpenBus, %al + ret + +.GWDEBUG: /* MAP_DEBUG */ + xorl %eax, %eax + movb OpenBus, %ah + movb OpenBus, %al + ret + +.GWC4: /* MAP_C4 */ + pushl %edx + ccall S9xGetC4 + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetC4 + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + addl $-24576, %edx + movl BWRAM, %eax + movw (%eax, %edx), %ax + ret + +.GW7ROM: /* MAP_SPC7110_ROM */ + pushl %edx + ccall S9xGetSPC7110Byte + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetSPC7110Byte + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GW7RAM: /* MAP_SPC7110_DRAM */ + movl $0x4800, %edx + pushl %edx + ccall S9xGetSPC7110 + popl %edx + pushl %eax + pushl %edx + ccall S9xGetSPC7110 + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWOBC1: /* MAP_OBC_RAM */ + pushl %edx + ccall GetOBC1 + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall GetOBC1 + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWSDSP: /* MAP_SETA_DSP */ + pushl %edx + ccall S9xGetSetaDSP + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetSetaDSP + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + +.GWSRISC: /* MAP_SETA_RISC */ + pushl %edx + ccall S9xGetST018 + popl %edx + pushl %eax + incl %edx + pushl %edx + ccall S9xGetST018 + LOAD_CYCLES + popl %edx + popl %edx + movb %al, %ah + movb %dl, %al + ret + + +.globl S9xSetByte +S9xSetByte: + pushl %eax +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + + movb InDMA, %cl + testb %cl, %cl + jne .SB_NOADD + movb MemorySpeed(%eax), %cl + andl $0xff, %ecx + addl %ecx, CYCLES + SAVE_CYCLES +.SB_NOADD: + + movl WriteMap(, %eax, 4), %eax + cmpl $18, %eax /* MAP_LAST */ + jb .SBSpecial + andl $0xffff, %edx +#ifdef CPU_SHUTDOWN + addl %eax, %edx + cmpl SA1WaitByteAddress1, %edx + jz .Matched + cmpl SA1WaitByteAddress2, %edx + jnz .NoMatch +.Matched: + cmpl $0, SA1Opcodes + movl $0, SA1WaitCounter + setnz %al + movb %al, SA1Executing +.NoMatch: + popl %ecx + movb %cl, (%edx) +#else + popl %ecx + movb %cl, (%eax, %edx) +#endif + ret + +.SBSpecial: + jmp *.SBJmpTable(, %eax, 4) +.data + .align 4 +.SBJmpTable: + .long .SBPPU /* MAP_PPU */ + .long .SBCPU /* MAP_CPU */ + .long .SBDSP /* MAP_DSP */ + .long .SBLSRAM /* MAP_LOROM_SRAM */ + .long .SBHSRAM /* MAP_HIROM_SRAM */ + .long .SBNONE /* MAP_NONE */ + .long .SBDEBUG /* MAP_DEBUG */ + .long .SBC4 /* MAP_C4 */ + .long .SBBWRAM /* MAP_BWRAM */ + .long .SBNONE /* MAP_BWRAM_BITMAP */ + .long .SBNONE /* MAP_BWRAM_BITMAP2 */ + .long .SBNONE /* MAP_SA1RAM */ + .long .SBNONE /* MAP_SPC7110_ROM */ + .long .SBNONE /* MAP_SPC7110_DRAM */ + .long .SBNONE /* MAP_RONLY_SRAM */ + .long .SBOBC1 /* MAP_OBC_RAM */ + .long .SBSDSP /* MAP_SETA_DSP */ + .long .SBSRISC /* MAP_SETA_RISC */ + +.text +.SBPPU: /* MAP_PPU */ + STORE_REGISTERS + popl %eax + pushl %edx /* Save Address because S9xSetPPU can stomp it with certain optimizations enabled */ + pushl %edx + pushl %eax + ccall S9xSetPPU + LOAD_REGISTERS + addl $8, %esp + popl %edx + ret + +.SBCPU: /* MAP_CPU */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetCPU + LOAD_REGISTERS + addl $8, %esp + ret + +.SBDSP: /* MAP_DSP */ + popl %eax + pushl %edx + pushl %eax + ccall S9xSetDSP + LOAD_CYCLES + addl $8, %esp + ret + +.SBLSRAM: /* MAP_LOROM_SRAM */ + popl %eax + movl SRAMMask, %ecx + orl %ecx, %ecx + jz .SBLSRAM_SKIP + movl %edx, %ecx + andl $0x7fff, %edx + andl $0x00ff0000, %ecx + sarl $1, %ecx + orl %ecx, %edx + movl SRAM, %ecx + andl SRAMMask, %edx + movb %al, (%ecx, %edx) + movb $1, SRAMModified +.SBLSRAM_SKIP: + ret + +.SBHSRAM: /* MAP_HIROM_SRAM */ + popl %eax + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movl SRAMMask, %ecx + orl %ecx, %ecx + jz .SBHSRAM_SKIP + andl %ecx, %edx + movl SRAM, %ecx + movb %al, (%ecx, %edx) + movb $1, SRAMModified +.SBHSRAM_SKIP: + ret + +.SBNONE: /* MAP_NONE */ +.SBDEBUG: /* MAP_DEBUG */ + popl %eax + ret + +.SBC4: /* MAP_C4 */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetC4 + LOAD_REGISTERS + addl $8, %esp + ret + +.SBBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + popl %eax + addl $-24576, %edx + movl BWRAM, %ecx + movb %al, (%ecx, %edx) + movb $1, SRAMModified + ret + +.SBOBC1: /* MAP_OBC_RAM */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall SetOBC1 + LOAD_REGISTERS + addl $8, %esp + ret + +.SBSDSP: /* MAP_SETA_DSP */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetSetaDSP + LOAD_REGISTERS + addl $8, %esp + ret + +.SBSRISC: /* MAP_SETA_RISC */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetST018 + LOAD_REGISTERS + addl $8, %esp + ret + +.globl S9xSetWord + +S9xSetWord: + pushl %eax + + movl %edx, %eax + andl $0x0fff, %eax + cmpl $0x0fff, %eax + jne .SWNotAtBlockBoundary + xorl %eax, %eax + pushl %edx + movb 4(%esp), %al + call S9xSetByte + popl %edx + xorl %eax, %eax + incl %edx + movb 1(%esp), %al + call S9xSetByte + popl %ecx + ret + +.SWNotAtBlockBoundary: + +#ifdef CPU_SHUTDOWN + movl $0, WaitAddress +#endif + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + + movb InDMA, %cl + testb %cl, %cl + jne .SW_NOADD + movb MemorySpeed(%eax), %cl + andl $0xff, %ecx + addl %ecx, CYCLES + addl %ecx, CYCLES + SAVE_CYCLES +.SW_NOADD: + movl WriteMap(, %eax, 4), %eax + cmpl $18, %eax /* MAP_LAST */ + jb .SWSpecial + andl $0xffff, %edx +#ifdef CPU_SHUTDOWN + addl %eax, %edx + cmpl SA1WaitByteAddress1, %edx + jz .Matched2 + cmpl SA1WaitByteAddress2, %edx + jnz .NoMatch2 +.Matched2: + cmpl $0, SA1Opcodes + movl $0, SA1WaitCounter + setnz %al + movb %al, SA1Executing +.NoMatch2: + popl %ecx + movw %cx, (%edx) +#else + popl %ecx + movw %cx, (%eax, %edx) +#endif + ret + +.SWSpecial: + jmp *.SWJmpTable(, %eax, 4) +.data + .align 4 +.SWJmpTable: + .long .SWPPU /* MAP_PPU */ + .long .SWCPU /* MAP_CPU */ + .long .SWDSP /* MAP_DSP */ + .long .SWLSRAM /* MAP_LOROM_SRAM */ + .long .SWHSRAM /* MAP_HIROM_SRAM */ + .long .SWNONE /* MAP_NONE */ + .long .SWDEBUG /* MAP_DEBUG */ + .long .SWC4 /* MAP_C4 */ + .long .SWBWRAM /* MAP_BWRAM */ + .long .SWNONE /* MAP_BWRAM_BITMAP */ + .long .SWNONE /* MAP_BWRAM_BITMAP2 */ + .long .SWNONE /* MAP_SA1RAM */ + .long .SWNONE /* MAP_SPC7110_ROM */ + .long .SWNONE /* MAP_SPC7110_DRAM */ + .long .SWNONE /* MAP_RONLY_SRAM */ + .long .SWOBC1 /* MAP_OBC_RAM */ + .long .SWSDSP /* MAP_SETA_DSP */ + .long .SWSRISC /* MAP_SETA_RISC */ + +.text +.SWPPU: /* MAP_PPU */ + STORE_REGISTERS + popl %eax + pushl %edx /* Save Address because S9xSetPPU will use it with certain optimizations enabled */ + pushl %eax /* Save Byte because S9xSetPPU will use it with certain optimizations enabled */ + pushl %edx + pushl %eax + ccall S9xSetPPU + popl %eax + popl %edx + popl %eax + popl %edx + pushl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetPPU + LOAD_REGISTERS + addl $8, %esp + popl %edx + ret + +.SWCPU: /* MAP_CPU */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetCPU + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetCPU + LOAD_REGISTERS + addl $8, %esp + ret + +.SWDSP: /* MAP_DSP */ + popl %eax + pushl %edx + pushl %eax + ccall S9xSetDSP + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetDSP + LOAD_CYCLES + addl $8, %esp + ret + +.SWLSRAM: /* MAP_LOROM_SRAM */ + popl %eax + movl SRAMMask, %ecx + orl %ecx, %ecx + jz .SWLSRAM_SKIP + movl %edx, %ecx + andl $0x7fff, %edx + andl $0x00ff0000, %ecx + sarl $1, %ecx + orl %ecx, %edx + movl SRAM, %ecx + andl SRAMMask, %edx + movb %al, (%ecx, %edx) + incl %edx + andl SRAMMask, %edx + movb %ah, (%ecx, %edx) + movb $1, SRAMModified +.SWLSRAM_SKIP: + ret + +.SWHSRAM: /* MAP_HIROM_SRAM */ + popl %eax + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movl SRAMMask, %ecx + orl %ecx, %ecx + jz .SWHSRAM_SKIP + andl %ecx, %edx + movl SRAM, %ecx + movb %al, (%ecx, %edx) + incl %edx + andl SRAMMask, %edx + movb %ah, (%ecx, %edx) + movb $1, SRAMModified +.SWHSRAM_SKIP: + ret + +.SWNONE: +.SWDEBUG: /* MAP_DEBUG */ + popl %eax + ret + +.SWC4: /* MAP_C4 */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetC4 + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetC4 + LOAD_REGISTERS + addl $8, %esp + ret + +.SWBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + popl %eax + addl $-24576, %edx + movl BWRAM, %ecx + movw %ax, (%ecx, %edx) + movb $1, SRAMModified + ret + +.SWOBC1: /* MAP_OBC1 */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall SetOBC1 + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall SetOBC1 + LOAD_REGISTERS + addl $8, %esp + ret + +.SWSDSP: /* MAP_SETA_DSP */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetSetaDSP + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetSetaDSP + LOAD_REGISTERS + addl $8, %esp + ret + +.SWSRISC: /* MAP_SETA_RISC */ + STORE_REGISTERS + popl %eax + pushl %edx + pushl %eax + ccall S9xSetST018 + popl %eax + popl %edx + movb %ah, %al + incl %edx + pushl %edx + pushl %eax + ccall S9xSetST018 + LOAD_REGISTERS + addl $8, %esp + ret + + +.globl S9xSetPCBase + +S9xSetPCBase: + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + movb MemorySpeed(%eax), %cl + andl $0xff, %ecx + movl %ecx, MemSpeed + addl %ecx, %ecx + movl %ecx, MemSpeedx2 + movl Map(, %eax, 4), %eax + cmpl $18, %eax /* MAP_LAST */ + jb .SPCSpecial + andl $0xffff, %edx + movl %eax, PCBase + addl %edx, %eax + movl %eax, PC + ret + + .align 4 +.SPCSpecial: + jmp *.SPCJmpTable(, %eax, 4) +.data + .align 4 +.SPCJmpTable: + .long .SPCPPU /* MAP_PPU */ + .long .SPCCPU /* MAP_CPU */ + .long .SPCDSP /* MAP_DSP */ + .long .SPCLSRAM /* MAP_LOROM_SRAM */ + .long .SPCHSRAM /* MAP_HIROM_SRAM */ + .long .SPCNONE /* MAP_NONE */ + .long .SPCDEBUG /* MAP_DEBUG */ + .long .SPCC4 /* MAP_C4 */ + .long .SPCBWRAM /* MAP_BWRAM */ + .long .SPCNONE /* MAP_BWRAM_BITMAP */ + .long .SPCNONE /* MAP_BWRAM_BITMAP2 */ + .long .SPCNONE /* MAP_SA1RAM */ + .long .SPCNONE /* MAP_SPC7110_ROM */ + .long .SPCNONE /* MAP_SPC7110_DRAM */ + .long .SPCNONE /* MAP_RONLY_SRAM */ + .long .SPCNONE /* MAP_OBC_RAM */ + .long .SPCNONE /* MAP_SETA_DSP */ + .long .SPCNONE /* MAP_SETA_RISC */ + +.text +.SPCPPU: /* MAP_PPU */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCCPU: /* MAP_CPU */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCDSP: /* MAP_DSP */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCLSRAM: /* MAP_LOROM_SRAM */ + movl SRAM, %ecx + andl $0xffff, %edx + movl %ecx, PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCHSRAM: /* MAP_HIROM_SRAM */ + movl SRAM, %eax + andl $0xffff, %edx + addl $-24576, %eax + movl %eax, PCBase + addl %eax, %edx + movl %edx, PC + ret + +.SPCNONE: +.SPCDEBUG: /* MAP_DEBUG */ + movl SRAM, %eax + andl $0xffff, %edx + movl %eax, PCBase + addl %eax, %edx + movl %edx, PC + ret + +.SPCC4: /* MAP_C4 */ + movl C4RAM, %ecx + andl $0xffff, %edx + addl $-0x6000, %ecx + movl %ecx, PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCBWRAM: /* MAP_BWRAM */ + movl SRAM, %eax + andl $0xffff, %edx + addl $-24576, %eax + movl %eax, PCBase + addl %eax, %edx + movl %edx, PC + ret diff --git a/src/i386/macros.mac b/src/i386/macros.mac new file mode 100644 index 0000000..c1df7b8 --- /dev/null +++ b/src/i386/macros.mac @@ -0,0 +1,52 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +bits 32 +section .text +; Zsnes required macros +%imacro newsym 1 + GLOBAL %1 + %1: +%endmacro + +%imacro newsym 2+ + GLOBAL %1 + %1: %2 +%endmacro + +%macro ALIGN32 0 + times ($$-$) & 1Fh nop ; Long word alignment +%endmacro + +%macro ALIGN16 0 + times ($$-$) & 1Fh nop ; Long word alignment +%endmacro + +%imacro extsym 1-* +%rep %0 + EXTERN %1 +%rotate 1 +%endrep +%endmacro diff --git a/src/i386/offsets.h b/src/i386/offsets.h new file mode 100644 index 0000000..4b292c4 --- /dev/null +++ b/src/i386/offsets.h @@ -0,0 +1,273 @@ +#define Flags CPU + 20 +#define BranchSkip CPU + 3 +#define NMIActive CPU + 4 +#define IRQActive CPU + 5 +#define WaitingForInterrupt CPU + 6 +#define InDMA CPU + 7 +#define WhichEvent CPU + 8 +#define PCS CPU + 24 +#define PCBase CPU + 28 +#define PCAtOpcodeStart CPU + 32 +#define WaitAddress CPU + 36 +#define WaitCounter CPU + 40 +#define Cycles CPU + 44 +#define NextEvent CPU + 48 +#define V_Counter CPU + 52 +#define MemSpeed CPU + 56 +#define MemSpeedx2 CPU + 60 +#define FastROMSpeed CPU + 64 +#define AutoSaveTimer CPU + 68 +#define SRAMModified CPU + 0 +#define NMITriggerPoint CPU + 72 +#define TriedInterleavedMode2 CPU + 2 +#define BRKTriggered CPU + 1 +#define NMICycleCount CPU + 12 +#define IRQCycleCount CPU + 16 +#define PB Registers + 0 +#define DB Registers + 1 +#define PP Registers + 2 +#define PL Registers + 2 +#define PH PL + 1 +#define AA Registers + 4 +#define AL Registers + 4 +#define AH AL + 1 +#define DD Registers + 6 +#define DL Registers + 6 +#define DH DL + 1 +#define SS Registers + 8 +#define SL Registers + 8 +#define SH SL + 1 +#define XX Registers + 10 +#define XL Registers + 10 +#define XH XL + 1 +#define YY Registers + 12 +#define YL Registers + 12 +#define YH YL + 1 +#define PCR Registers + 14 +#define RAM Memory + 0 +#define ROM Memory + 4 +#define VRAM Memory + 8 +#define SRAM Memory + 12 +#define BWRAM Memory + 16 +#define FillRAM Memory + 20 +#define C4RAM Memory + 24 +#define HiROM Memory + 28 +#define LoROM Memory + 29 +#define SRAMMask Memory + 32 +#define SRAMSize Memory + 36 +#define Map Memory + 40 +#define WriteMap Memory + 16424 +#define MemorySpeed Memory + 32808 +#define BlockIsRAM Memory + 36904 +#define BlockIsROM Memory + 41000 +#define ROMFilename Memory + 53368 +#define APUPCS IAPU + 16 +#define APURAM IAPU + 20 +#define APUExecuting IAPU + 3 +#define APUDirectPage IAPU + 24 +#define APUBit IAPU + 4 +#define APUAddress IAPU + 8 +#define APUWaitAddress1 IAPU + 28 +#define APUWaitAddress2 IAPU + 32 +#define APUWaitCounter IAPU + 12 +#define APUShadowRAM IAPU + 36 +#define APUCachedSamples IAPU + 40 +#define APU_Carry IAPU + 0 +#define APU_Zero IAPU + 1 +#define APU_Overflow IAPU + 2 +#define APUTimerErrorCounter IAPU + 44 +#define NextAPUTimerPos IAPU + 48 +#define APUTimerCounter IAPU + 52 +#define APUCycles APU + 0 +#define APUShowROM APU + 4 +#define APUFlags APU + 5 +#define APUKeyedChannels APU + 6 +#define APUOutPorts APU + 7 +#define APUDSP APU + 11 +#define APUExtraRAM APU + 139 +#define APUTimer APU + 204 +#define APUTimerTarget APU + 210 +#define APUTimerEnabled APU + 216 +#define TimerValueWritten APU + 219 +#define CPUSpeed ICPU + 0 +#define CPUOpcodes ICPU + 4 +#define _Carry ICPU + 8 +#define _Zero ICPU + 9 +#define _Negative ICPU + 10 +#define _Overflow ICPU + 11 +#define ShiftedDB ICPU + 20 +#define ShiftedPB ICPU + 16 +#define CPUExecuting ICPU + 12 +#define Scanline ICPU + 28 +#define Frame ICPU + 24 +#define APUEnabled Settings + 0 +#define Shutdown Settings + 1 +#define H_Max Settings + 4 +#define HBlankStart Settings + 8 +#define CyclesPercentage Settings + 12 +#define DisableIRQ Settings + 16 +#define Paused Settings + 17 +#define PAL Settings + 30 +#define SA1Enabled Settings + 82 +#define SuperFXEnabled Settings + 80 +#define ApuP APURegisters + 0 +#define ApuYA APURegisters + 2 +#define ApuA APURegisters + 2 +#define ApuY APURegisters + 3 +#define ApuX APURegisters + 4 +#define ApuS APURegisters + 5 +#define ApuPC APURegisters + 6 +#define APUPCR APURegisters + 6 +#define BGMode PPU + 0 +#define BG3Priority PPU + 1 +#define Brightness PPU + 2 +#define GHight PPU + 4 +#define GInc PPU + 5 +#define GAddress PPU + 6 +#define GMask1 PPU + 8 +#define GFullGraphicCount PPU + 10 +#define GShift PPU + 12 +#define CGFLIP PPU + 62 +#define CGDATA PPU + 64 +#define FirstSprite PPU + 576 +#define LastSprite PPU + 577 +#define OBJ PPU + 578 +#define OAMPriorityRotation PPU + 2114 +#define OAMAddr PPU + 2116 +#define OAMFlip PPU + 2119 +#define OAMTileAddress PPU + 2120 +#define IRQVBeamPos PPU + 2122 +#define IRQHBeamPos PPU + 2124 +#define VBeamPosLatched PPU + 2126 +#define HBeamPosLatched PPU + 2128 +#define HBeamFlip PPU + 2130 +#define VBeamFlip PPU + 2131 +#define HVBeamCounterLatched PPU + 2132 +#define MatrixA PPU + 2134 +#define MatrixB PPU + 2136 +#define MatrixC PPU + 2138 +#define MatrixD PPU + 2140 +#define CentreX PPU + 2142 +#define CentreY PPU + 2144 +#define Joypad1ButtonReadPos PPU + 2146 +#define Joypad2ButtonReadPos PPU + 2147 +#define CGADD PPU + 2148 +#define FixedColourGreen PPU + 2150 +#define FixedColourRed PPU + 2149 +#define FixedColourBlue PPU + 2151 +#define SavedOAMAddr PPU + 2152 +#define ScreenHeight PPU + 2154 +#define WRAM PPU + 2156 +#define BG_Forced PPU + 2160 +#define ForcedBlanking PPU + 2161 +#define OBJThroughMain PPU + 2162 +#define OBJThroughSub PPU + 2163 +#define OBJSizeSelect PPU + 2164 +#define OBJNameBase PPU + 2166 +#define OAMReadFlip PPU + 2169 +#define OAMData PPU + 2170 +#define VTimerEnabled PPU + 2714 +#define HTimerEnabled PPU + 2715 +#define HTimerPosition PPU + 2716 +#define Mosaic PPU + 2718 +#define BGMosaic PPU + 2719 +#define Mode7HFlip PPU + 2723 +#define Mode7VFlip PPU + 2724 +#define Mode7Repeat PPU + 2725 +#define Window1Left PPU + 2726 +#define Window1Right PPU + 2727 +#define Window2Left PPU + 2728 +#define Window2Right PPU + 2729 +#define ClipWindowOverlapLogic PPU + 2736 +#define ClipWindow1Enable PPU + 2742 +#define ClipWindow2Enable PPU + 2748 +#define ClipWindow1Inside PPU + 2754 +#define ClipWindow2Inside PPU + 2760 +#define RecomputeClipWindows PPU + 2766 +#define CGFLIPRead PPU + 2767 +#define OBJNameSelect PPU + 2768 +#define Need16x8Mulitply PPU + 2770 +#define Joypad3ButtonReadPos PPU + 2771 +#define MouseSpeed PPU + 2772 +#define RangeTimeOver PPU + 2118 +#define ColorsChanged IPPU + 0 +#define HDMA IPPU + 1 +#define HDMAStarted IPPU + 2 +#define MaxBrightness IPPU + 3 +#define LatchedBlanking IPPU + 4 +#define OBJChanged IPPU + 5 +#define RenderThisFrame IPPU + 6 +#define SkippedFrames IPPU + 20 +#define FrameSkip IPPU + 24 +#define TileCache IPPU + 28 +#define TileCached IPPU + 40 +#define FirstVRAMRead IPPU + 52 +#define Interlace IPPU + 54 +#define DoubleWidthPixels IPPU + 56 +#define RenderedScreenHeight IPPU + 60 +#define RenderedScreenWidth IPPU + 64 +#define Red IPPU + 68 +#define Green IPPU + 1092 +#define Blue IPPU + 2116 +#define XB IPPU + 3140 +#define ScreenColors IPPU + 3144 +#define PreviousLine IPPU + 3656 +#define CurrentLine IPPU + 3660 +#define Joypads IPPU + 3668 +#define SuperScope IPPU + 3688 +#define Mouse IPPU + 3692 +#define PrevMouseX IPPU + 3700 +#define PrevMouseY IPPU + 3708 +#define Clip IPPU + 3716 +#define SA1Opcodes SA1 + 16 +#define SA1_Carry SA1 + 0 +#define SA1_Zero SA1 + 1 +#define SA1_Negative SA1 + 2 +#define SA1_Overflow SA1 + 3 +#define SA1CPUExecuting SA1 + 4 +#define SA1ShiftedPB SA1 + 20 +#define SA1ShiftedDB SA1 + 24 +#define SA1Flags SA1 + 28 +#define SA1Executing SA1 + 5 +#define SA1NMIActive SA1 + 6 +#define SA1IRQActive SA1 + 7 +#define SA1WaitingForInterrupt SA1 + 8 +#define SA1PCS SA1 + 36 +#define SA1PCBase SA1 + 40 +#define SA1PCAtOpcodeStart SA1 + 48 +#define SA1WaitAddress SA1 + 52 +#define SA1WaitCounter SA1 + 32 +#define SA1WaitByteAddress1 SA1 + 56 +#define SA1WaitByteAddress2 SA1 + 60 +#define SA1BWRAM SA1 + 44 +#define SA1Map SA1 + 64 +#define SA1WriteMap SA1 + 16448 +#define SA1op1 SA1 + 32832 +#define SA1op2 SA1 + 32834 +#define SA1arithmetic_op SA1 + 32836 +#define SA1sum SA1 + 32840 +#define SA1overflow SA1 + 10 +#define VirtualBitmapFormat SA1 + 11 +#define SA1_in_char_dma SA1 + 12 +#define SA1variable_bit_pos SA1 + 13 +#define SA1PB SA1Registers + 0 +#define SA1DB SA1Registers + 1 +#define SA1PP SA1Registers + 2 +#define SA1PL SA1Registers + 2 +#define SA1PH SA1PL + 1 +#define SA1AA SA1Registers + 4 +#define SA1AL SA1Registers + 4 +#define SA1AH SA1AL + 1 +#define SA1DD SA1Registers + 6 +#define SA1DL SA1Registers + 6 +#define SA1DH SA1DL + 1 +#define SA1SS SA1Registers + 8 +#define SA1SL SA1Registers + 8 +#define SA1SH SA1SL + 1 +#define SA1XX SA1Registers + 10 +#define SA1XL SA1Registers + 10 +#define SA1XH SA1XL + 1 +#define SA1YY SA1Registers + 12 +#define SA1YL SA1Registers + 12 +#define SA1YH SA1YL + 1 +#define SA1PCR SA1Registers + 14 diff --git a/src/i386/regs.mac b/src/i386/regs.mac new file mode 100644 index 0000000..cb8d312 --- /dev/null +++ b/src/i386/regs.mac @@ -0,0 +1,101 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +;******************************************************* +; InitReg Initializes Registers +;******************************************************* + +%macro setreg 2 + mov edi,%1 + add edi,[regptr] + mov eax,%2 + mov [edi],eax +%endmacro + +;******************************************************* +; Registers Note : Remember to restore AH, ECX, & DX +;******************************************************* + +%macro checkmultchange 0 + ; execute multiplication + cmp byte[multchange],0 + je .nomult + push edx + push eax + xor bh,bh + mov bl,[mode7B+1] + mov ax,[mode7A] + test bl,80h + jz .noneg + mov bh,0FFh +.noneg + imul bx + mov [compmult],ax + mov [compmult+2],dl + pop eax + pop edx + mov byte[multchange],0 +.nomult +%endmacro + +%macro mouse4016doxA 2 + cmp byte[JoyAPos],%1 + jne .nx7 + mov bx,[mousexpos] + shr bx,%2 + and bx,1 + mov al,bl +.nx7 +%endmacro + +%macro mouse4016doyA 2 + cmp byte[JoyAPos],%1 + jne .ny7 + mov bx,[mouseypos] + shr bx,%2 + and bx,1 + mov al,bl +.ny7 +%endmacro + +%macro mouse4017dox 2 + cmp byte[JoyBPos],%1 + jne .nx7 + mov bx,[mousexpos] + shr bx,%2 + and bx,1 + mov al,bl +.nx7 +%endmacro + +%macro mouse4017doy 2 + cmp byte[JoyBPos],%1 + jne .ny7 + mov bx,[mouseypos] + shr bx,%2 + and bx,1 + mov al,bl +.ny7 +%endmacro diff --git a/src/i386/regsw.mac b/src/i386/regsw.mac new file mode 100644 index 0000000..a95d47a --- /dev/null +++ b/src/i386/regsw.mac @@ -0,0 +1,51 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +;******************************************************* +; InitRegW Initializes Write Registers +;******************************************************* + +%macro reenablespc 0 + cmp dword[cycpbl],1000000h + jb %%enspc + mov dword[cycpbl],0 + test byte[curexecstate],02h + jnz %%enspc + or byte[curexecstate],02h + push ebx + xor ebx,ebx + mov bl,dl + EXTSYM tableadc + mov edi,[tableadc+ebx*4] + pop ebx +%%enspc +%endmacro + +%macro setregw 2 + mov edi,%1 + add edi,[regptw] + mov eax,%2 + mov [edi],eax +%endmacro diff --git a/src/i386/sa1addr.h b/src/i386/sa1addr.h new file mode 100644 index 0000000..141fd38 --- /dev/null +++ b/src/i386/sa1addr.h @@ -0,0 +1,537 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro GetCarry + movb SA1_Carry, %dl + shrb %dl +.endm + +.macro GetNotCarry + cmpb $1, SA1_Carry +.endm + +.macro SetZN + movb %al, SA1_Zero + movb %al, SA1_Negative +.endm + +.macro Set16ZN + movb %ah, SA1_Negative + setnz SA1_Zero +.endm + +.macro SetZNC + setc SA1_Carry + movb %al, SA1_Negative + movb %al, SA1_Zero +.endm + +.macro Set16ZNC + setc SA1_Carry + setnz SA1_Zero + movb %ah, SA1_Negative +.endm + +.macro SetZNCV + setc SA1_Carry + seto SA1_Overflow + movb %al, SA1_Negative + movb %al, SA1_Zero +.endm + +.macro Set16ZNCV + setc SA1_Carry + seto SA1_Overflow + setnz SA1_Zero + movb %ah, SA1_Negative +.endm + +.macro SetZNV + seto SA1_Overflow + movb %al, SA1_Negative + movb %al, SA1_Zero +.endm + +.macro Set16ZNV + seto SA1_Overflow + setnz SA1_Zero + movb %ah, SA1_Negative +.endm + + +/************* IMMEDIATE8 ****************/ +.Macro Immediate8 K + movb (PC), %al + incl PC +.endm + +/************* IMMEDIATE16 ****************/ +.macro Immediate16 K + movw (PC), %ax + addl $2, PC +.endm + +/************* Relative ****************/ +.macro Relative K + movl PC, %edx + movsbl (%edx), %eax + incl %edx + movl %edx, PC + subl SA1PCBase, %edx + addl %eax, %edx + andl $0xffff, %edx +.endm + +/************* RelativeLong ****************/ +.macro RelativeLong K + xorl %eax, %eax + movl PC, %edx + movw (%edx), %ax + addl $2, %edx + movl %edx, PC + subl SA1PCBase, %edx + addl %eax, %edx + andl $0xffff, %edx +.endm + +/************* AbsoluteIndexedIndirect8 ****************/ +.macro AbsoluteIndexedIndirect8 K + xorl %edx, %edx + movw XX, %dx + addw (PC), %dx + addl $2, PC + orl SA1ShiftedPB, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx +.endm + +/************* AbsoluteIndirectLong8 ****************/ +.macro AbsoluteIndirectLong8 K + movw (PC), %dx + addl $2, PC + andl $0xffff, %edx + pushl %edx + call S9xSA1GetWord + popl %edx + pushl %eax + addl $2, %edx + call S9xSA1GetByte + popl %edx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + orl %eax, %edx +.endm + +.macro AbsoluteIndirect8 K + movw (PC), %dx + addl $2, PC + andl $0xffff, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx +.endm + +.macro Absolute8 K + movw (PC), %dx + addl $2, PC + andl $0xffff, %edx + orl SA1ShiftedDB, %edx +.endm + +.macro AbsoluteLong8 K + movl (PC), %edx + add $3, PC + andl $0xffffff, %edx +.endm + +.macro Direct8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC +.endm + +.macro DirectIndirectIndexed8 K + xorl %edx, %edx + movb (PC), %dl + incl PC + addw DD, %dx + call S9xSA1GetWord + movl SA1ShiftedDB, %edx + movw %ax, %dx + xorl %eax, %eax + movw YY, %ax + addl %eax, %edx +.endm + +.macro DirectIndirectIndexedLong8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + pushl %edx + call S9xSA1GetWord + popl %edx + pushw %ax + addw $2, %dx + call S9xSA1GetByte + andl $0xff, %eax + sall $16, %eax + xorl %edx, %edx + popw %ax + movw YY, %dx + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro DirectIndexedIndirect8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + addw XX, %dx + call S9xSA1GetWord + movl SA1ShiftedDB, %edx + movw %ax, %dx +.endm + +.macro DirectIndexedX8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + addw XX, %dx +.endm + +.macro DirectIndexedY8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + addw YY, %dx +.endm + +.macro AbsoluteIndexedX8 K + movl SA1ShiftedDB, %edx + movw (PC), %dx + xorl %eax, %eax + addl $2, PC + movw XX, %ax + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro AbsoluteIndexedY8 K + movl SA1ShiftedDB, %edx + movw (PC), %dx + xorl %eax, %eax + addl $2, PC + movw YY, %ax + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro AbsoluteLongIndexedX8 K + movl (PC), %edx + xorl %eax, %eax + addl $3, PC + movw XX, %ax + addl %eax, %edx + andl $0xffffff, %edx +.endm + +.macro DirectIndirect8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + call S9xSA1GetWord + movl SA1ShiftedDB, %edx + movw %ax, %dx +.endm + +.macro DirectIndirectLong8 K + xorl %edx, %edx + movb (PC), %dl + addw DD, %dx + incl PC + pushl %edx + call S9xSA1GetWord + popl %edx + pushw %ax + addw $2, %dx + call S9xSA1GetByte + andl $0xff, %eax + sall $16, %eax + popw %ax + movl %eax, %edx +.endm + +.macro StackRelative8 K + xorl %edx, %edx + movb (PC), %dl + addw SS, %dx + incl PC +.endm + +.macro StackRelativeIndirectIndexed8 K + xorl %edx, %edx + movb (PC), %dl + addw SS, %dx + incl PC + call S9xSA1GetWord + movl SA1ShiftedDB, %edx + movw %ax, %dx + xorl %eax, %eax + movw YY, %ax + addl %eax, %edx + andl $0xffffff, %edx +.endm + +#if 0 +.macro PushByte K + movl SS, %edx + andl $0xffff, %edx + call S9xSA1SetByte + decw SS +.endm + +.macro PushWord K + movl SS, %edx + decl %edx + andl $0xffff, %edx + call S9xSA1SetWord + movl SS, %edx + subl $2, %edx + movw %dx, SS +.endm + +.macro PullByte K + movl SS, %edx + incl %edx + movw %dx, SS + andl $0xffff, %edx + call S9xSA1GetByte +.endm + +.macro PullWord K + movl SS, %edx + addw $2, %dx + movw %dx, SS + decl %edx + andl $0xffff, %edx + call S9xSA1GetWord +.endm +#endif + +.macro PushByte K + movl SS, %edx + andl $0xffff, %edx + call S9xSA1SetByte + decw SS +.endm + +.macro PushByteE K + movl SS, %edx + andl $0x00ff, %edx + movb $0x01, %dh + movw %dx, SS + call S9xSA1SetByte +.endm + +.macro PushWord K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSA1SetByte + popl %edx + popl %eax + decw %dx + call S9xSA1SetByte + subw $2, SS +.endm + +.macro PushWordE K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSA1SetByte + popl %edx + popl %eax + decw %dx + movb $0x01, %dh + call S9xSA1SetByte + subw $2, SS +.endm + +.macro PushWordENew K + xorl %edx, %edx + movw SS, %dx + pushl %eax + pushl %edx + movb %ah, %al + call S9xSA1SetByte + popl %edx + popl %eax + decw %dx + call S9xSA1SetByte + movb $0x01, %dh + subw $2, SS +.endm + +.macro PullByte K + movl SS, %edx + incl %edx + movw %dx, SS + andl $0xffff, %edx + call S9xSA1GetByte +.endm + +.macro PullByteE K + movl SS, %edx + incl %edx + andl $0xffff, %edx + movb $0x01, %dh + call S9xSA1GetByte + movw %dx, SS +.endm + +.macro PullWord K + movl SS, %edx + incw %dx + andl $0xffff, %edx + pushl %edx + call S9xSA1GetByte + movb %al, OpenBus + popl %edx + incw %dx + call S9xSA1GetByte + movb %al, %ah + movb OpenBus, %al + movw %dx, SS +.endm + +.macro PullWordE K + movl SS, %edx + andl $0xffff, %edx + incw %dx + movb $0x01, %dh + pushl %edx + call S9xSA1GetByte + popl %edx + movb %al, OpenBus + incw %dx + movb $0x01, %dh + call S9xSA1GetByte + movb %al, %ah + movb OpenBus, %al + movw %dw, SS +.endm + +.macro PullWordENew K + movl SS, %edx + incw %dx + andl $0xffff, %edx + pushl %edx + call S9xSA1GetByte + movb %al, OpenBus + popl %edx + incw %dx + call S9xSA1GetByte + movb %al, %ah + movb OpenBus, %al + movb $0x01, %dh + movw %dx, SS +.endm + diff --git a/src/i386/sa1gs.S b/src/i386/sa1gs.S new file mode 100644 index 0000000..44b9efa --- /dev/null +++ b/src/i386/sa1gs.S @@ -0,0 +1,508 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.data +.BankSave: + .long 0 +.text + +S9xSA1GetByte: + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + movl SA1Map(, %eax, 4), %eax + cmpl $10, %eax + jbe .GBSpecial + andl $0xffff, %edx + movb (%eax, %edx), %al + ret + + .align 4 +.GBSpecial: + jmp *.GBJmpTable(, %eax, 4) +.data + .align 4 +.GBJmpTable: + .long .GBPPU + .long .GBCPU + .long .GBDSP + .long .GBLSRAM + .long .GBHSRAM + .long .GBNONE + .long .GBDEBUG + .long .GBNONE + .long .GBBWRAM + .long .GBBWBITMAP + .long .GBBWBITMAP2 + +.text +.GBPPU: /* MAP_PPU */ + andl $0xffff, %edx + pushl %edx + ccall S9xGetSA1 + popl %edx + ret + +.GBCPU: /* MAP_CPU */ + +.GBDSP: /* MAP_DSP */ + mov $0, %al + ret + +.GBLSRAM: /* MAP_LOROM_SRAM */ + andl $0xffff, %edx + movl SRAM, %ecx + andw SRAMMask, %dx + movb (%ecx, %edx), %al + ret + +.GBHSRAM: /* MAP_HIROM_SRAM */ + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movl SRAM, %eax + andw SRAMMask, %dx + movb (%eax, %edx), %al + ret + +.GBNONE: +.GBDEBUG: /* MAP_DEBUG */ + xorl %eax, %eax + movb OpenBus, %al + ret + +.GBBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + addl $-24576, %edx + movl SA1BWRAM, %eax + movb (%eax, %edx), %al + ret + +.GBBWBITMAP: + movl FillRAM, %eax + subl $0x600000, %edx + testb $0x80, 0x223f(%eax) + movl %edx, %eax + jz .GB4 + + // Depth 2 + movb %dl, %cl + shrl $2, %eax + andb $3, %cl + andl $0xffff, %eax + addl SRAM, %eax + shlb $1, %cl + movb (%eax), %al + shrb %cl, %al + andb $3, %al + ret +.GB4: + movb %dl, %cl + shrl $1, %eax + andb $1, %cl + andl $0xffff, %eax + addl SRAM, %eax + shlb $2, %cl + movb (%eax), %al + shrb %cl, %al + andb $15, %al + ret + +.GBBWBITMAP2: + andl $0xffff, %edx + movl FillRAM, %eax + subl $0x6000, %edx + testb $0x80, 0x223f(%eax) + movl %edx, %eax + jz .GB42 + + // Depth 2 + movb %dl, %cl + shrl $2, %eax + andb $3, %cl + andl $0xffff, %eax + addl SA1BWRAM, %eax + shlb $1, %cl + movb (%eax), %al + shrb %cl, %al + andb $3, %al + ret +.GB42: + movb %dl, %cl + shrl $1, %eax + andb $1, %cl + andl $0xffff, %eax + addl SA1BWRAM, %eax + shlb $2, %cl + movb (%eax), %al + shrb %cl, %al + andb $15, %al + ret + + +S9xSA1GetWord: + pushl %edx + call S9xSA1GetByte + popl %edx + movb %al, OpenBus + incl %edx + call S9xSA1GetByte + movb %al, %ah + movb OpenBus, %al + ret + +S9xSA1SetByte: + pushl %eax + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + movl SA1WriteMap(, %eax, 4), %eax + cmpl $10, %eax + jbe .SBSpecial + andl $0xffff, %edx + popl %ecx + movb %cl, (%eax, %edx) + ret + +.SBSpecial: + jmp *.SBJmpTable(, %eax, 4) +.data + .align 4 +.SBJmpTable: + .long .SBPPU + .long .SBCPU + .long .SBDSP + .long .SBLSRAM + .long .SBHSRAM + .long .SBNONE + .long .SBDEBUG + .long .SBNONE + .long .SBBWRAM + .long .SBBWBITMAP + .long .SBBWBITMAP2 + +.text +.SBPPU: /* MAP_PPU */ + andl $0xffff, %edx + popl %eax + pushl %edx + pushl %eax + ccall S9xSetSA1 + addl $8, %esp + ret + +.SBCPU: /* MAP_CPU */ + popl %eax + ret + +.SBDSP: /* MAP_DSP */ + popl %eax + ret + +.SBLSRAM: /* MAP_LOROM_SRAM */ + popl %eax + movw SRAMMask, %cx + orw %cx, %cx + jz .SBLSRAM_SKIP + andl $0xffff, %edx + andw %cx, %dx + movl SRAM, %ecx + movb %al, (%ecx, %edx) +.SBLSRAM_SKIP: + ret + +.SBHSRAM: /* MAP_HIROM_SRAM */ + popl %eax + movl %edx, %ecx + andl $0xf0000, %ecx + andl $0x7fff, %edx + sarl $3, %ecx + addl $-24576, %edx + addl %ecx, %edx + movw SRAMMask, %cx + orw %cx, %cx + jz .SBHSRAM_SKIP + andw %cx, %dx + movl SRAM, %ecx + movb %al, (%ecx, %edx) +.SBHSRAM_SKIP: + ret + +.SBNONE: +.SBDEBUG: /* MAP_DEBUG */ + popl %eax + ret + +.SBBWRAM: /* MAP_BWRAM */ + andl $0x7fff, %edx + popl %eax + addl $-24576, %edx + movl SA1BWRAM, %ecx + movb %al, (%ecx, %edx) + ret + +.SBBWBITMAP: + movl FillRAM, %eax + subl $0x600000, %edx + movb 0x223f(%eax), %al + testb $0x80, %al + movl %edx, %eax + jz .SB4 + + // Depth 2 + shrl $2, %eax + movb %dl, %cl + andl $0xffff, %eax + addl SRAM, %eax + andb $3, %cl + popl %edx + shlb $1, %cl + movb %dl, %dh + movb $3, %dl + shlb %cl, %dl + notb %dl + andb $3, %dh + andb (%eax), %dl + shlb %cl, %dh + orb %dh, %dl + movb %dl, (%eax) + ret +.SB4: + shrl $1, %eax + movb %dl, %cl + andl $0xffff, %eax + addl SRAM, %eax + andb $1, %cl + popl %edx + shlb $2, %cl + movb %dl, %dh + movb $15, %dl + shlb %cl, %dl + notb %dl + andb $15, %dh + andb (%eax), %dl + shlb %cl, %dh + orb %dh, %dl + movb %dl, (%eax) + ret + +.SBBWBITMAP2: + andl $0xffff, %edx + subl $0x6000, %edx + movl FillRAM, %eax + testb $0x80, 0x223f(%eax) + jz .SB42 + + // Depth 2 + movl %edx, %eax + shrl $2, %eax + andl $0xffff, %eax + addl SA1BWRAM, %eax + + movb %dl, %cl + popl %edx + andb $3, %cl + movb %dl, %dh + shlb $1, %cl + movb $3, %dl + andb $3, %dh + shlb %cl, %dl + shlb %cl, %dh + notb %dl + andb (%eax), %dl + orb %dh, %dl + movb %dl, (%eax) + ret +.SB42: + movl %edx, %eax + shrl $1, %eax + andl $0xffff, %eax + addl SA1BWRAM, %eax + movb %dl, %cl + andb $1, %cl + shlb $2, %cl + popl %edx + movb %dl, %dh + movb $15, %dl + shlb %cl, %dl + notb %dl + andb (%eax), %dl + andb $15, %dh + shlb %cl, %dh + orb %dh, %dl + movb %dl, (%eax) + ret + +S9xSA1SetWord: + pushl %eax + pushl %edx + call S9xSA1SetByte + popl %edx + popl %eax + incl %edx + movb %ah, %al + jmp S9xSA1SetByte + +S9xSA1SetPCBase: + movl %edx, %eax + shrl $MEMMAP_SHIFT, %eax + and $MEMMAP_MASK, %eax + movl SA1Map(, %eax, 4), %eax + cmpl $10, %eax + jbe .SPCSpecial + andl $0xffff, %edx + movl %eax, SA1PCBase + addl %edx, %eax + movl %eax, PC + ret + + .align 4 +.SPCSpecial: + jmp *.SPCJmpTable(, %eax, 4) +.data + .align 4 +.SPCJmpTable: + .long .SPCPPU + .long .SPCCPU + .long .SPCDSP + .long .SPCLSRAM + .long .SPCHSRAM + .long .SPCNONE + .long .SPCDEBUG + .long .SPCNONE + .long .SPCBWRAM + .long .SPCNONE + .long .SPCNONE + +.text +.SPCPPU: /* MAP_PPU */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, SA1PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCCPU: /* MAP_CPU */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, SA1PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCDSP: /* MAP_DSP */ + movl FillRAM, %ecx + andl $0xffff, %edx + movl %ecx, SA1PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCLSRAM: /* MAP_LOROM_SRAM */ + movl SRAM, %ecx + andl $0xffff, %edx + movl %ecx, SA1PCBase + addl %edx, %ecx + movl %ecx, PC + ret + +.SPCHSRAM: /* MAP_HIROM_SRAM */ + movl SRAM, %eax + andl $0xffff, %edx + addl $-24576, %eax + movl %eax, SA1PCBase + addl %eax, %edx + movl %edx, PC + ret + +.SPCNONE: +.SPCDEBUG: /* MAP_DEBUG */ + movl SRAM, %eax + movl %eax, SA1PCBase + movl %eax, PC + ret + +.SPCBWRAM: /* MAP_BWRAM */ + movl SA1BWRAM, %eax + andl $0xffff, %edx + addl $-24576, %eax + movl %eax, SA1PCBase + addl %eax, %edx + movl %edx, PC + ret diff --git a/src/i386/sa1ops.S b/src/i386/sa1ops.S new file mode 100644 index 0000000..3dbb59b --- /dev/null +++ b/src/i386/sa1ops.S @@ -0,0 +1,4535 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#define Registers SA1Registers +#undef VAR_CYCLES +#include "sa1struc.h" + +#if 0 +#define PCS SA1PCS +#define PB SA1PB +#define PP SA1PP +#define PL SA1PL +#define PH SA1PH +#define AA SA1AA +#define AL SA1AL +#define AH SA1AH +#define DD SA1DD +#define DL SA1DL +#define DH SA1DH +#define SS SA1SS +#define SL SA1SL +#define SH SA1SH +#define XX SA1XX +#define XL SA1XL +#define XH SA1XH +#define YY SA1YY +#define YL SA1YL +#define YH SA1YH +#endif + +#undef _Carry +#define _Carry SA1_Carry +#undef _Zero +#define _Zero SA1_Zero +#undef _Negative +#define _Negative SA1_Negative +#undef _Overflow +#define _Overflow SA1_Overflow + +#include "sa1addr.h" +#include "sa1ops.h" +#include "sa1gs.S" + +.data +.zzz: +.string "*** IRQ\n" + +.text + +.globl S9xSA1MainLoop +S9xSA1MainLoop: + LOAD_REGISTERS + testl $IRQ_PENDING_FLAG, SA1Flags + jz .nosa1irq2 + testb $0xff, SA1IRQActive + jz .nosa1irq1 + testb $IRQ, FLAGS + jnz .nosa1irq2 + cmpb $0, WaitingForInterrupt + je .nosa1wait + incl PC + movb $0, WaitingForInterrupt +.nosa1wait: + call S9xSA1Opcode_IRQ + jmp .nosa1irq2 +.nosa1irq1: + andl $~IRQ_PENDING_FLAG, SA1Flags +.nosa1irq2: + movl $3, %eax +.instruction_loop: + testb $0xff, SA1Executing + jz .exit + pushl %eax +#ifdef DEBUGGER + testb $TRACE_FLAG, SA1Flags + jz .NO_SA1_TRACE + STORE_REGISTERS + ccall S9xSA1Trace + LOAD_REGISTERS +.NO_SA1_TRACE: +#endif + xorl %eax, %eax + movl SA1Opcodes, %ecx +#ifdef CPU_SHUTDOWN + movl PC, SA1PCAtOpcodeStart +#endif + movb (PC), %al + incl PC + jmp *(%ecx,%eax,4) +.globl S9xSA1MainAsmLoop +S9xSA1MainAsmLoop: + popl %eax + decl %eax + jnz .instruction_loop +.exit: + STORE_REGISTERS + ret + +/* ADC */ +Op69M1: + Immediate8 ADC + Adc8 IMM8 + +Op69M0: + Immediate16 ADC2 + Adc16 IMM16 + +Op65M1: + Direct8 ADC2 + call S9xSA1GetByte + Adc8 DIR8 + +Op65M0: + Direct8 ADC + call S9xSA1GetWord + Adc16 DIR16 + +Op75M1: + DirectIndexedX8 ADC + call S9xSA1GetByte + Adc8 DIX8 + +Op75M0: + DirectIndexedX8 ADC2 + call S9xSA1GetWord + Adc16 DIX16 + +Op72M1: + DirectIndirect8 ADC + call S9xSA1GetByte + Adc8 DI8 + +Op72M0: + DirectIndirect8 ADC2 + call S9xSA1GetWord + Adc16 DI16 + +Op61M1: + DirectIndexedIndirect8 ADC + call S9xSA1GetByte + Adc8 DII8 + +Op61M0: + DirectIndexedIndirect8 ADC2 + call S9xSA1GetWord + Adc16 DII16 + +Op71M1: + DirectIndirectIndexed8 ADC + call S9xSA1GetByte + Adc8 DIIY8 + +Op71M0: + DirectIndirectIndexed8 ADC2 + call S9xSA1GetWord + Adc16 DIIY16 + +Op67M1: + DirectIndirectLong8 ADC + call S9xSA1GetByte + Adc8 DIL8 + +Op67M0: + DirectIndirectLong8 ADC2 + call S9xSA1GetWord + Adc16 DIL16 + +Op77M1: + DirectIndirectIndexedLong8 ADC + call S9xSA1GetByte + Adc8 DIIL8 + +Op77M0: + DirectIndirectIndexedLong8 ADC2 + call S9xSA1GetWord + Adc16 DIIL8 + +Op6DM1: + Absolute8 ADC + call S9xSA1GetByte + Adc8 ABS8 + +Op6DM0: + Absolute8 ADC2 + call S9xSA1GetWord + Adc16 ABS16 + +Op7DM1: + AbsoluteIndexedX8 ADC + call S9xSA1GetByte + Adc8 ABSX8 + +Op7DM0: + AbsoluteIndexedX8 ADC2 + call S9xSA1GetWord + Adc16 ABSX16 + +Op79M1: + AbsoluteIndexedY8 ADC + call S9xSA1GetByte + Adc8 ABSY8 + +Op79M0: + AbsoluteIndexedY8 ADC2 + call S9xSA1GetWord + Adc16 ABSY16 + +Op6FM1: + AbsoluteLong8 ADC + call S9xSA1GetByte + Adc8 ABSL8 + +Op6FM0: + AbsoluteLong8 ADC2 + call S9xSA1GetWord + Adc16 ABSL16 + +Op7FM1: + AbsoluteLongIndexedX8 ADC + call S9xSA1GetByte + Adc8 ALX8 + +Op7FM0: + AbsoluteLongIndexedX8 ADC2 + call S9xSA1GetWord + Adc16 ALX16 + +Op63M1: + StackRelative8 ADC + call S9xSA1GetByte + Adc8 SREL8 + +Op63M0: + StackRelative8 ADC2 + call S9xSA1GetWord + Adc16 SREL16 + +Op73M1: + StackRelativeIndirectIndexed8 ADC + call S9xSA1GetByte + Adc8 SRII8 + +Op73M0: + StackRelativeIndirectIndexed8 ADC2 + call S9xSA1GetWord + Adc16 SRII16 + +/* AND */ +Op29M1: + Immediate8 AND + And8 IMM8 + +Op29M0: + Immediate16 AND + And16 IMM16 + +Op25M1: + Direct8 AND + call S9xSA1GetByte + And8 DIR8 + +Op25M0: + Direct8 AND2 + call S9xSA1GetWord + And16 DIR16 + +Op35M1: + DirectIndexedX8 AND + call S9xSA1GetByte + And8 DIX8 + +Op35M0: + DirectIndexedX8 AND2 + call S9xSA1GetWord + And16 DIX16 + +Op32M1: + DirectIndirect8 AND + call S9xSA1GetByte + And8 DI8 + +Op32M0: + DirectIndirect8 AND2 + call S9xSA1GetWord + And16 DI16 + +Op21M1: + DirectIndexedIndirect8 AND + call S9xSA1GetByte + And8 DII8 + +Op21M0: + DirectIndexedIndirect8 AND2 + call S9xSA1GetWord + And16 DII16 + +Op31M1: + DirectIndirectIndexed8 AND + call S9xSA1GetByte + And8 DIIY8 + +Op31M0: + DirectIndirectIndexed8 AND2 + call S9xSA1GetWord + And16 DIIY16 + +Op27M1: + DirectIndirectLong8 AND + call S9xSA1GetByte + And8 DIL8 + +Op27M0: + DirectIndirectLong8 AND2 + call S9xSA1GetWord + And16 DIL16 + +Op37M1: + DirectIndirectIndexedLong8 AND + call S9xSA1GetByte + And8 DIIL8 + +Op37M0: + DirectIndirectIndexedLong8 AND2 + call S9xSA1GetWord + And16 DIIL16 + +Op2DM1: + Absolute8 AND + call S9xSA1GetByte + And8 ABS8 + +Op2DM0: + Absolute8 AND2 + call S9xSA1GetWord + And16 ABS16 + +Op3DM1: + AbsoluteIndexedX8 AND + call S9xSA1GetByte + And8 ABSX8 + +Op3DM0: + AbsoluteIndexedX8 AND2 + call S9xSA1GetWord + And16 ABSX16 + +Op39M1: + AbsoluteIndexedY8 AND + call S9xSA1GetByte + And8 ABSY8 + +Op39M0: + AbsoluteIndexedY8 AND2 + call S9xSA1GetWord + And16 ABSY16 + +Op2FM1: + AbsoluteLong8 AND + call S9xSA1GetByte + And8 ABSL8 + +Op2FM0: + AbsoluteLong8 AND2 + call S9xSA1GetWord + And16 ABSL16 + +Op3FM1: + AbsoluteLongIndexedX8 AND + call S9xSA1GetByte + And8 ALX8 + +Op3FM0: + AbsoluteLongIndexedX8 AND2 + call S9xSA1GetWord + And16 ALX16 + +Op23M1: + StackRelative8 AND + call S9xSA1GetByte + And8 SREL8 + +Op23M0: + StackRelative8 AND2 + call S9xSA1GetWord + And16 SREL16 + +Op33M1: + StackRelativeIndirectIndexed8 AND + call S9xSA1GetByte + And8 SRII8 + +Op33M0: + StackRelativeIndirectIndexed8 AND2 + call S9xSA1GetWord + And16 SRII16 + +/* ASL */ +Op0AM1: + movb AL, %al + salb %al + movb %al, AL + SetZNC + jmp S9xSA1MainAsmLoop + +Op0AM0: + movw AA, %ax + salw %ax + movw %ax, AA + setnz SA1_Zero + setc SA1_Carry + movb %ah, SA1_Negative + jmp S9xSA1MainAsmLoop + +Op06M1: + Direct8 ASL + Asl8 DIR8 + +Op06M0: + Direct8 ASL2 + Asl16 DIR16 + +Op16M1: + DirectIndexedX8 ASL + Asl8 DIX + +Op16M0: + DirectIndexedX8 ASL2 + Asl16 DIX + +Op0EM1: + Absolute8 ASL + Asl8 ABS + +Op0EM0: + Absolute8 ASL2 + Asl16 ABS + +Op1EM1: + AbsoluteIndexedX8 ASL + Asl8 ABSX + +Op1EM0: + AbsoluteIndexedX8 ASL2 + Asl16 ABSX + +/* BIT */ +Op89M1: + Immediate8 BIT + andb AL, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop + +Op89M0: + Immediate16 BIT + andw AA, %ax + setnz SA1_Zero + jmp S9xSA1MainAsmLoop + +Op24M1: + Direct8 BIT + Bit8 DIR + +Op24M0: + Direct8 BIT + Bit16 DIR + +Op34M1: + DirectIndexedX8 BIT + Bit8 DIX + +Op34M0: + DirectIndexedX8 BIT2 + Bit16 DIX + +Op2CM1: + Absolute8 BIT + Bit8 ABS + +Op2CM0: + Absolute8 BIT2 + Bit16 ABS + +Op3CM1: + AbsoluteIndexedX8 BIT + Bit8 ABSX + +Op3CM0: + AbsoluteIndexedX8 BIT2 + Bit16 ABSX + +/* CMP */ +OpC9M1: + Immediate8 CMP + Cmp8 IMM + +OpC9M0: + Immediate16 CMP + Cmp16 IMM + +OpC5M1: + Direct8 CMP + call S9xSA1GetByte + Cmp8 DIR + +OpC5M0: + Direct8 CMP2 + call S9xSA1GetWord + Cmp16 DIR + +OpD5M1: + DirectIndexedX8 CMP + call S9xSA1GetByte + Cmp8 DIX + +OpD5M0: + DirectIndexedX8 CMP2 + call S9xSA1GetWord + Cmp16 DIX + +OpD2M1: + DirectIndirect8 CMP + call S9xSA1GetByte + Cmp8 DI + +OpD2M0: + DirectIndirect8 CMP2 + call S9xSA1GetWord + Cmp16 DI + +OpC1M1: + DirectIndexedIndirect8 CMP + call S9xSA1GetByte + Cmp8 DII + +OpC1M0: + DirectIndexedIndirect8 CMP2 + call S9xSA1GetWord + Cmp16 DII + +OpD1M1: + DirectIndirectIndexed8 CMP + call S9xSA1GetByte + Cmp8 DIIY + +OpD1M0: + DirectIndirectIndexed8 CMP2 + call S9xSA1GetWord + Cmp16 DIIY + +OpC7M1: + DirectIndirectLong8 CMP + call S9xSA1GetByte + Cmp8 DIL + +OpC7M0: + DirectIndirectLong8 CMP2 + call S9xSA1GetWord + Cmp16 DIL + +OpD7M1: + DirectIndirectIndexedLong8 CMP + call S9xSA1GetByte + Cmp8 DIIL + +OpD7M0: + DirectIndirectIndexedLong8 CMP2 + call S9xSA1GetWord + Cmp16 DIIL + +OpCDM1: + Absolute8 CMP + call S9xSA1GetByte + Cmp8 ABS + +OpCDM0: + Absolute8 CMP2 + call S9xSA1GetWord + Cmp16 ABS + +OpDDM1: + AbsoluteIndexedX8 CMP + call S9xSA1GetByte + Cmp8 ABSX + +OpDDM0: + AbsoluteIndexedX8 CMP2 + call S9xSA1GetWord + Cmp16 ABSX + +OpD9M1: + AbsoluteIndexedY8 CMP + call S9xSA1GetByte + Cmp8 ABSY + +OpD9M0: + AbsoluteIndexedY8 CMP2 + call S9xSA1GetWord + Cmp16 ABSY + +OpCFM1: + AbsoluteLong8 CMP + call S9xSA1GetByte + Cmp8 ABSL + +OpCFM0: + AbsoluteLong8 CMP2 + call S9xSA1GetWord + Cmp16 ABSL + +OpDFM1: + AbsoluteLongIndexedX8 CMP + call S9xSA1GetByte + Cmp8 ALX + +OpDFM0: + AbsoluteLongIndexedX8 CMP2 + call S9xSA1GetWord + Cmp16 ALX + +OpC3M1: + StackRelative8 CMP + call S9xSA1GetByte + Cmp8 SREL + +OpC3M0: + StackRelative8 CMP2 + call S9xSA1GetWord + Cmp16 SREL + +OpD3M1: + StackRelativeIndirectIndexed8 CMP + call S9xSA1GetByte + Cmp8 SRII + +OpD3M0: + StackRelativeIndirectIndexed8 CMP2 + call S9xSA1GetWord + Cmp16 SRII + +/* CPX */ +OpE0X1: + Immediate8 CPX + Cpx8 IMM + +OpE0X0: + Immediate16 CPX + Cpx16 IMM + +OpE4X1: + Direct8 CPX + call S9xSA1GetByte + Cpx8 DIR + +OpE4X0: + Direct8 CPX2 + call S9xSA1GetWord + Cpx16 DIR + +OpECX1: + Absolute8 CPX + call S9xSA1GetByte + Cpx8 ABS + +OpECX0: + Absolute8 CPX2 + call S9xSA1GetWord + Cpx16 ABS + + +/* CPY */ +OpC0X1: + Immediate8 CPY + Cpy8 IMM + +OpC0X0: + Immediate16 CPY + Cpy16 IMM + +OpC4X1: + Direct8 CPY + call S9xSA1GetByte + Cpy8 DIR + +OpC4X0: + Direct8 CPY2 + call S9xSA1GetWord + Cpy16 DIR + +OpCCX1: + Absolute8 CPY + call S9xSA1GetByte + Cpy8 ABS + +OpCCX0: + Absolute8 CPY2 + call S9xSA1GetWord + Cpy16 ABS + +/* DEC */ +Op3AM1: + movb AL, %al + decb %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op3AM0: + decw AA + setnz SA1_Zero + movb AH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +OpC6M1: + Direct8 DEC + Dec8 DIR + +OpC6M0: + Direct8 DEC2 + Dec16 DIR + +OpD6M1: + DirectIndexedX8 DEC + Dec8 DIX + +OpD6M0: + DirectIndexedX8 DEC2 + Dec16 DIX + +OpCEM1: + Absolute8 DEC + Dec8 ABS + +OpCEM0: + Absolute8 DEC2 + Dec16 ABS + +OpDEM1: + AbsoluteIndexedX8 DEC + + Dec8 ABSX + +OpDEM0: + AbsoluteIndexedX8 DEC2 + Dec16 ABSX + +/* EOR */ +Op49M1: + Immediate8 EOR + Eor8 IMM + +Op49M0: + Immediate16 EOR + Eor16 IMM + +Op45M1: + Direct8 EOR + call S9xSA1GetByte + Eor8 DIR + +Op45M0: + Direct8 EOR2 + call S9xSA1GetWord + Eor16 DIR + +Op55M1: + DirectIndexedX8 EOR + call S9xSA1GetByte + Eor8 DIX + +Op55M0: + DirectIndexedX8 EOR2 + call S9xSA1GetWord + Eor16 DIX + +Op52M1: + DirectIndirect8 EOR + call S9xSA1GetByte + Eor8 DI + +Op52M0: + DirectIndirect8 EOR2 + call S9xSA1GetWord + Eor16 DI + +Op41M1: + DirectIndexedIndirect8 EOR + call S9xSA1GetByte + Eor8 DII + +Op41M0: + DirectIndexedIndirect8 EOR2 + call S9xSA1GetWord + Eor16 DII + +Op51M1: + DirectIndirectIndexed8 EOR + call S9xSA1GetByte + Eor8 DIIY + +Op51M0: + DirectIndirectIndexed8 EOR2 + call S9xSA1GetWord + Eor16 DIIY + +Op47M1: + DirectIndirectLong8 EOR + call S9xSA1GetByte + Eor8 DIL + +Op47M0: + DirectIndirectLong8 EOR2 + call S9xSA1GetWord + Eor16 DIL + +Op57M1: + DirectIndirectIndexedLong8 EOR + call S9xSA1GetByte + Eor8 DIIL + +Op57M0: + DirectIndirectIndexedLong8 EOR2 + call S9xSA1GetWord + Eor16 DIIL + +Op4DM1: + Absolute8 EOR + call S9xSA1GetByte + Eor8 ABS + +Op4DM0: + Absolute8 EOR2 + call S9xSA1GetWord + Eor16 ABS + +Op5DM1: + AbsoluteIndexedX8 EOR + call S9xSA1GetByte + Eor8 ABSX + +Op5DM0: + AbsoluteIndexedX8 EOR2 + call S9xSA1GetWord + Eor16 ABSX + +Op59M1: + AbsoluteIndexedY8 EOR + call S9xSA1GetByte + Eor8 ABSY + +Op59M0: + AbsoluteIndexedY8 EOR2 + call S9xSA1GetWord + Eor16 ABSY + +Op4FM1: + AbsoluteLong8 EOR + call S9xSA1GetByte + Eor8 ABSL + +Op4FM0: + AbsoluteLong8 EOR2 + call S9xSA1GetWord + Eor16 ABSL + +Op5FM1: + AbsoluteLongIndexedX8 EOR + call S9xSA1GetByte + Eor8 ALX + +Op5FM0: + AbsoluteLongIndexedX8 EOR2 + call S9xSA1GetWord + Eor16 ALX + +Op43M1: + StackRelative8 EOR + call S9xSA1GetByte + Eor8 SREL + +Op43M0: + StackRelative8 EOR2 + call S9xSA1GetWord + Eor16 SREL + +Op53M1: + StackRelativeIndirectIndexed8 EOR + call S9xSA1GetByte + Eor8 SRII + +Op53M0: + StackRelativeIndirectIndexed8 EOR2 + call S9xSA1GetWord + Eor16 SRII + +/* INC */ +Op1AM1: + movb AL, %al + incb %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op1AM0: + incw AA + setnz SA1_Zero + movb AH, %ah + movb %ah, SA1_Negative + jmp S9xSA1MainAsmLoop + +OpE6M1: + Direct8 INC + Inc8 DIR + +OpE6M0: + Direct8 INC2 + Inc16 DIR + +OpF6M1: + DirectIndexedX8 INC + Inc8 DIX + +OpF6M0: + DirectIndexedX8 INC2 + Inc16 DIX + +OpEEM1: + Absolute8 INC + Inc8 ABS + +OpEEM0: + Absolute8 INC2 + Inc16 ABS + +OpFEM1: + AbsoluteIndexedX8 INC + Inc8 ABSX + +OpFEM0: + AbsoluteIndexedX8 INC2 + Inc16 ABSX + +/* LDA */ +OpA9M1: + Immediate8 LDA + Lda8 IMM + +OpA9M0: + Immediate16 LDA + Lda16 IMM + +OpA5M1: + Direct8 LDA + call S9xSA1GetByte + Lda8 DIR + +OpA5M0: + Direct8 LDA2 + call S9xSA1GetWord + Lda16 DIR + +OpB5M1: + DirectIndexedX8 LDA + call S9xSA1GetByte + Lda8 DIX + +OpB5M0: + DirectIndexedX8 LDA2 + call S9xSA1GetWord + Lda16 DIX + +OpB2M1: + DirectIndirect8 LDA + call S9xSA1GetByte + Lda8 DI + +OpB2M0: + DirectIndirect8 LDA2 + call S9xSA1GetWord + Lda16 DI + +OpA1M1: + DirectIndexedIndirect8 LDA + call S9xSA1GetByte + Lda8 DII + +OpA1M0: + DirectIndexedIndirect8 LDA2 + call S9xSA1GetWord + Lda16 DII + +OpB1M1: + DirectIndirectIndexed8 LDA + call S9xSA1GetByte + Lda8 DIIY + +OpB1M0: + DirectIndirectIndexed8 LDA2 + call S9xSA1GetWord + Lda16 DIIY + +OpA7M1: + DirectIndirectLong8 LDA + call S9xSA1GetByte + Lda8 DIL + +OpA7M0: + DirectIndirectLong8 LDA2 + call S9xSA1GetWord + Lda16 DIL + +OpB7M1: + DirectIndirectIndexedLong8 LDA + call S9xSA1GetByte + Lda8 DIIL + +OpB7M0: + DirectIndirectIndexedLong8 LDA2 + call S9xSA1GetWord + Lda16 DIIL + +OpADM1: + Absolute8 LDA + call S9xSA1GetByte + Lda8 ABS + +OpADM0: + Absolute8 LDA2 + call S9xSA1GetWord + Lda16 ABS + +OpBDM1: + AbsoluteIndexedX8 LDA + call S9xSA1GetByte + Lda8 ABSX + +OpBDM0: + AbsoluteIndexedX8 LDA2 + call S9xSA1GetWord + Lda16 ABSX + +OpB9M1: + AbsoluteIndexedY8 LDA + call S9xSA1GetByte + Lda8 ABSY + +OpB9M0: + AbsoluteIndexedY8 LDA2 + call S9xSA1GetWord + Lda16 ABSY + +OpAFM1: + AbsoluteLong8 LDA + call S9xSA1GetByte + Lda8 ABSL + +OpAFM0: + AbsoluteLong8 LDA2 + call S9xSA1GetWord + Lda16 ABSL + +OpBFM1: + AbsoluteLongIndexedX8 LDA + call S9xSA1GetByte + Lda8 ALX + +OpBFM0: + AbsoluteLongIndexedX8 LDA2 + call S9xSA1GetWord + Lda16 ALX + +OpA3M1: + StackRelative8 LDA + call S9xSA1GetByte + Lda8 SREL + +OpA3M0: + StackRelative8 LDA2 + call S9xSA1GetWord + Lda16 SREL + +OpB3M1: + StackRelativeIndirectIndexed8 LDA + call S9xSA1GetByte + Lda8 SRII + +OpB3M0: + StackRelativeIndirectIndexed8 LDA2 + call S9xSA1GetWord + Lda16 SRII + +/* LDX */ +OpA2X1: + Immediate8 LDX + Ldx8 IMM + +OpA2X0: + Immediate16 LDX + Ldx16 IMM + +OpA6X1: + Direct8 LDX + call S9xSA1GetByte + Ldx8 DIR + +OpA6X0: + Direct8 LDX2 + call S9xSA1GetWord + Ldx16 DIR + +OpB6X1: + DirectIndexedY8 LDX + call S9xSA1GetByte + Ldx8 DIY + +OpB6X0: + DirectIndexedY8 LDX2 + call S9xSA1GetWord + Ldx16 DIY + +OpAEX1: + Absolute8 LDX + call S9xSA1GetByte + Ldx8 ABS + +OpAEX0: + Absolute8 LDX2 + call S9xSA1GetWord + Ldx16 ABS + +OpBEX1: + AbsoluteIndexedY8 LDX + call S9xSA1GetByte + Ldx8 ABSY + +OpBEX0: + AbsoluteIndexedY8 LDX2 + call S9xSA1GetWord + Ldx16 ABSY + +/* LDY */ +OpA0X1: + Immediate8 LDY + Ldy8 IMM + +OpA0X0: + Immediate16 LDY + Ldy16 IMM + +OpA4X1: + Direct8 LDY + call S9xSA1GetByte + Ldy8 DIR + +OpA4X0: + Direct8 LDY2 + call S9xSA1GetWord + Ldy16 DIR + +OpB4X1: + DirectIndexedX8 LDY + call S9xSA1GetByte + Ldy8 DIX + +OpB4X0: + DirectIndexedX8 LDY2 + call S9xSA1GetWord + Ldy16 DIX + +OpACX1: + Absolute8 LDY + call S9xSA1GetByte + Ldy8 ABS + +OpACX0: + Absolute8 LDY2 + call S9xSA1GetWord + Ldy16 ABS + +OpBCX1: + AbsoluteIndexedX8 LDY + call S9xSA1GetByte + Ldy8 ABSX + +OpBCX0: + AbsoluteIndexedX8 LDY2 + call S9xSA1GetWord + Ldy16 ABSX + +/* LSR */ +Op4AM1: + movb AL, %al + shrb %al + movb %al, AL + SetZNC + jmp S9xSA1MainAsmLoop + +Op4AM0: + shrw AA + setnz SA1_Zero + setc SA1_Carry + movb AH, %ah + movb %ah, SA1_Negative + jmp S9xSA1MainAsmLoop + +Op46M1: + Direct8 LSR + Lsr8 DIR + +Op46M0: + Direct8 LSR2 + Lsr16 DIR + +Op56M1: + DirectIndexedX8 LSR + Lsr8 DIX + +Op56M0: + DirectIndexedX8 LSR2 + Lsr16 DIX + +Op4EM1: + Absolute8 LSR + Lsr8 ABS + +Op4EM0: + Absolute8 LSR2 + Lsr16 ABS + +Op5EM1: + AbsoluteIndexedX8 LSR + Lsr8 ABSX + +Op5EM0: + AbsoluteIndexedX8 LSR2 + Lsr16 ABSX + +/* ORA */ +Op09M1: + Immediate8 ORA + Ora8 IMM + +Op09M0: + Immediate16 ORA + Ora16 IMM + +Op05M1: + Direct8 ORA + call S9xSA1GetByte + Ora8 DIR + +Op05M0: + Direct8 ORA2 + call S9xSA1GetWord + Ora16 DIR + +Op15M1: + DirectIndexedX8 ORA + call S9xSA1GetByte + Ora8 DIX + +Op15M0: + DirectIndexedX8 ORA2 + call S9xSA1GetWord + Ora16 DIX + +Op12M1: + DirectIndirect8 ORA + call S9xSA1GetByte + Ora8 DI + +Op12M0: + DirectIndirect8 ORA2 + call S9xSA1GetWord + Ora16 DI + +Op01M1: + DirectIndexedIndirect8 ORA + call S9xSA1GetByte + Ora8 DII + +Op01M0: + DirectIndexedIndirect8 ORA2 + call S9xSA1GetWord + Ora16 DII + +Op11M1: + DirectIndirectIndexed8 ORA + call S9xSA1GetByte + Ora8 DIIY + +Op11M0: + DirectIndirectIndexed8 ORA2 + call S9xSA1GetWord + Ora16 DIIY + +Op07M1: + DirectIndirectLong8 ORA + call S9xSA1GetByte + Ora8 DIL + +Op07M0: + DirectIndirectLong8 ORA2 + call S9xSA1GetWord + Ora16 DIL + +Op17M1: + DirectIndirectIndexedLong8 ORA + call S9xSA1GetByte + Ora8 DIIL + +Op17M0: + DirectIndirectIndexedLong8 ORA2 + call S9xSA1GetWord + Ora16 DIIL + +Op0DM1: + Absolute8 ORA + call S9xSA1GetByte + Ora8 ABS + +Op0DM0: + Absolute8 ORA2 + call S9xSA1GetWord + Ora16 ABS + +Op1DM1: + AbsoluteIndexedX8 ORA + call S9xSA1GetByte + Ora8 ABSX + +Op1DM0: + AbsoluteIndexedX8 ORA2 + call S9xSA1GetWord + Ora16 ABSX + +Op19M1: + AbsoluteIndexedY8 ORA + call S9xSA1GetByte + Ora8 ABSY + +Op19M0: + AbsoluteIndexedY8 ORA2 + call S9xSA1GetWord + Ora16 ABSY + +Op0FM1: + AbsoluteLong8 ORA + call S9xSA1GetByte + Ora8 ABSL + +Op0FM0: + AbsoluteLong8 ORA2 + call S9xSA1GetWord + Ora16 ABSL + +Op1FM1: + AbsoluteLongIndexedX8 ORA + call S9xSA1GetByte + Ora8 ALX + +Op1FM0: + AbsoluteLongIndexedX8 ORA2 + call S9xSA1GetWord + Ora16 ALX + +Op03M1: + StackRelative8 ORA + call S9xSA1GetByte + Ora8 SREL + +Op03M0: + StackRelative8 ORA2 + call S9xSA1GetWord + Ora16 SREL + +Op13M1: + StackRelativeIndirectIndexed8 ORA + call S9xSA1GetByte + Ora8 SRII + +Op13M0: + StackRelativeIndirectIndexed8 ORA2 + call S9xSA1GetWord + Ora16 SRII + +/* ROL */ +Op2AM1: + movb AL, %al + GetCarry + rclb %al + movb %al, AL + SetZNC + jmp S9xSA1MainAsmLoop + +Op2AM0: + GetCarry + movw AA, %ax + rclw %ax + movw %ax, AA + setc SA1_Carry + movb %ah, SA1_Negative + orb %ah, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop + +Op26M1: + Direct8 ROL + Rol8 DIR + +Op26M0: + Direct8 ROL2 + Rol16 DIR + +Op36M1: + DirectIndexedX8 ROL + Rol8 DIX + +Op36M0: + DirectIndexedX8 ROL2 + Rol16 DIX + +Op2EM1: + Absolute8 ROL + Rol8 ABS + +Op2EM0: + Absolute8 ROL2 + Rol16 ABS + +Op3EM1: + AbsoluteIndexedX8 ROL + Rol8 ABSX + +Op3EM0: + AbsoluteIndexedX8 ROL2 + Rol16 ABSX + +/* ROR */ +Op6AM1: + movb AL, %al + GetCarry + rcrb %al + movb %al, AL + SetZNC + jmp S9xSA1MainAsmLoop + +Op6AM0: + GetCarry + movw AA, %ax + rcrw %ax + movw %ax, AA + setc SA1_Carry + movb %ah, SA1_Negative + orb %ah, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop + +Op66M1: + Direct8 ROR + Ror8 DIR + +Op66M0: + Direct8 ROR2 + Ror16 DIR + +Op76M1: + DirectIndexedX8 ROR + Ror8 DIX + +Op76M0: + DirectIndexedX8 ROR2 + Ror16 DIX + +Op6EM1: + Absolute8 ROR + Ror8 ABS + +Op6EM0: + Absolute8 ROR2 + Ror16 ABS + +Op7EM1: + AbsoluteIndexedX8 ROR + Ror8 ABSX + +Op7EM0: + AbsoluteIndexedX8 ROR2 + Ror16 ABSX + +/* SBC */ +OpE9M1: + Immediate8 SBC + Sbc8 IMM + +OpE9M0: + Immediate16 SBC + Sbc16 IMM + +OpE5M1: + Direct8 SBC + call S9xSA1GetByte + Sbc8 DIR + +OpE5M0: + Direct8 SBC2 + call S9xSA1GetWord + Sbc16 DIR + +OpF5M1: + DirectIndexedX8 SBC + call S9xSA1GetByte + Sbc8 DIX + +OpF5M0: + DirectIndexedX8 SBC2 + call S9xSA1GetWord + Sbc16 DIX + +OpF2M1: + DirectIndirect8 SBC + call S9xSA1GetByte + Sbc8 DI + +OpF2M0: + DirectIndirect8 SBC2 + call S9xSA1GetWord + Sbc16 DI + +OpE1M1: + DirectIndexedIndirect8 SBC + call S9xSA1GetByte + Sbc8 DII + +OpE1M0: + DirectIndexedIndirect8 SBC2 + call S9xSA1GetWord + Sbc16 DII + +OpF1M1: + DirectIndirectIndexed8 SBC + call S9xSA1GetByte + Sbc8 DIIY + +OpF1M0: + DirectIndirectIndexed8 SBC2 + call S9xSA1GetWord + Sbc16 DIIY + +OpE7M1: + DirectIndirectLong8 SBC + call S9xSA1GetByte + Sbc8 DIL + +OpE7M0: + DirectIndirectLong8 SBC2 + call S9xSA1GetWord + Sbc16 DIL + +OpF7M1: + DirectIndirectIndexedLong8 SBC + call S9xSA1GetByte + Sbc8 DIIL + +OpF7M0: + DirectIndirectIndexedLong8 SBC2 + call S9xSA1GetWord + Sbc16 DIIL + +OpEDM1: + Absolute8 SBC + call S9xSA1GetByte + Sbc8 ABS + +OpEDM0: + Absolute8 SBC2 + call S9xSA1GetWord + Sbc16 ABS + +OpFDM1: + AbsoluteIndexedX8 SBC + call S9xSA1GetByte + Sbc8 ABSX + +OpFDM0: + AbsoluteIndexedX8 SBC2 + call S9xSA1GetWord + Sbc16 ABSX + +OpF9M1: + AbsoluteIndexedY8 SBC + call S9xSA1GetByte + Sbc8 ABSY + +OpF9M0: + AbsoluteIndexedY8 SBC2 + call S9xSA1GetWord + Sbc16 ABSY + +OpEFM1: + AbsoluteLong8 SBC + call S9xSA1GetByte + Sbc8 ABSL + +OpEFM0: + AbsoluteLong8 SBC2 + call S9xSA1GetWord + Sbc16 ABSL + +OpFFM1: + AbsoluteLongIndexedX8 SBC + call S9xSA1GetByte + Sbc8 ALX + +OpFFM0: + AbsoluteLongIndexedX8 SBC2 + call S9xSA1GetWord + Sbc16 ALX + +OpE3M1: + StackRelative8 SBC + call S9xSA1GetByte + Sbc8 SREL + +OpE3M0: + StackRelative8 SBC2 + call S9xSA1GetWord + Sbc16 SREL + +OpF3M1: + StackRelativeIndirectIndexed8 SBC + call S9xSA1GetByte + Sbc8 SRII + +OpF3M0: + StackRelativeIndirectIndexed8 SBC2 + call S9xSA1GetWord + Sbc16 SRII + +/* STA */ +Op85M1: + Direct8 STA + Sta8 DIR + +Op85M0: + Direct8 STA2 + Sta16 DIR + +Op95M1: + DirectIndexedX8 STA + Sta8 DIX + +Op95M0: + DirectIndexedX8 STA2 + Sta16 DIX + +Op92M1: + DirectIndirect8 STA + Sta8 DI + +Op92M0: + DirectIndirect8 STA2 + Sta16 DI + +Op81M1: + DirectIndexedIndirect8 STA + Sta8 DII + +Op81M0: + DirectIndexedIndirect8 STA2 + Sta16 DII + +Op91M1: + DirectIndirectIndexed8 STA + Sta8 DIIY + +Op91M0: + DirectIndirectIndexed8 STA2 + Sta16 DIIY + +Op87M1: + DirectIndirectLong8 STA + Sta8 DIL + +Op87M0: + DirectIndirectLong8 STA2 + Sta16 DIL + +Op97M1: + DirectIndirectIndexedLong8 STA + Sta8 DIIL + +Op97M0: + DirectIndirectIndexedLong8 STA2 + Sta16 DIIL + +Op8DM1: + Absolute8 STA + Sta8 ABS + +Op8DM0: + Absolute8 STA + Sta16 ABS + +Op9DM1: + AbsoluteIndexedX8 STA + Sta8 ABSX + +Op9DM0: + AbsoluteIndexedX8 STA2 + Sta16 ABSX + +Op99M1: + AbsoluteIndexedY8 STA + Sta8 ABSY + +Op99M0: + AbsoluteIndexedY8 STA2 + Sta16 ABSY + +Op8FM1: + AbsoluteLong8 STA + Sta8 ABSL + +Op8FM0: + AbsoluteLong8 STA2 + Sta16 ABSL + +Op9FM1: + AbsoluteLongIndexedX8 STA + Sta8 ALX + +Op9FM0: + AbsoluteLongIndexedX8 STA2 + Sta16 ALX + +Op83M1: + StackRelative8 STA + Sta8 SREL + +Op83M0: + StackRelative8 STA2 + Sta16 SREL + +Op93M1: + StackRelativeIndirectIndexed8 STA + Sta8 SRII + +Op93M0: + StackRelativeIndirectIndexed8 STA2 + Sta16 SRII + +/* STX */ +Op86X1: + Direct8 STX + Stx8 DIR + +Op86X0: + Direct8 STX2 + Stx16 DIR + +Op96X1: + DirectIndexedY8 STX + Stx8 DIY + +Op96X0: + DirectIndexedY8 STX2 + Stx16 DIY + +Op8EX1: + Absolute8 STX + Stx8 ABS + +Op8EX0: + Absolute8 STX2 + Stx16 ABS + +/* STY */ +Op84X1: + Direct8 STY + Sty8 DIR + +Op84X0: + Direct8 STY2 + Sty16 DIR + +Op94X1: + DirectIndexedX8 STY + Sty8 DIX + +Op94X0: + DirectIndexedX8 STY2 + Sty16 DIX + +Op8CX1: + Absolute8 STY + Sty8 ABS + +Op8CX0: + Absolute8 STY2 + Sty16 ABS + +/* STZ */ +Op64M1: + Direct8 STZ + Stz8 DIR + +Op64M0: + Direct8 STZ2 + Stz16 DIR + +Op74M1: + DirectIndexedX8 STZ + Stz8 DIX + +Op74M0: + DirectIndexedX8 STZ2 + Stz16 DIX + +Op9CM1: + Absolute8 STZ + Stz8 ABS + +Op9CM0: + Absolute8 STZ2 + Stz16 ABS + +Op9EM1: + AbsoluteIndexedX8 STZ + Stz8 ABSX + +Op9EM0: + AbsoluteIndexedX8 STZ2 + Stz16 ABSX + +/* TRB */ +Op14M1: + Direct8 TRB + Trb8 DIR + +Op14M0: + Direct8 TRB2 + Trb16 DIR + +Op1CM1: + Absolute8 TRB + Trb8 ABS + +Op1CM0: + Absolute8 TRB2 + Trb16 ABS + +/* TSB */ +Op04M1: + Direct8 TSB + Tsb8 DIR + +Op04M0: + Direct8 TSB2 + Tsb16 DIR + +Op0CM1: + Absolute8 TSB + Tsb8 ABS + +Op0CM0: + Absolute8 TSB2 + Tsb16 ABS + +/* BCC */ +Op90: + Relative + testb $0xff, SA1_Carry + jnz .BCC_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC +.BCC_EXIT: + jmp S9xSA1MainAsmLoop + +/* BCS */ +OpB0: + Relative + testb $0xff, SA1_Carry + jz .BCS_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC +.BCS_EXIT: + jmp S9xSA1MainAsmLoop + +/* BEQ */ +OpF0: + Relative + testb $0xff, SA1_Zero + jnz .BEQ_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BEQ +.BEQ_EXIT: + jmp S9xSA1MainAsmLoop + +/* BMI */ +Op30: + Relative + testb $0x80, SA1_Negative + jz .BMI_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BMI +.BMI_EXIT: + jmp S9xSA1MainAsmLoop + +/* BNE */ +OpD0: + Relative + testb $0xff, SA1_Zero + jz .BNE_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BNE +.BNE_EXIT: + jmp S9xSA1MainAsmLoop + +/* BPL */ +Op10: + Relative + testb $0x80, SA1_Negative + jnz .BPL_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BPL +.BPL_EXIT: + jmp S9xSA1MainAsmLoop + +/* BRA */ +Op80: + Relative + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BRA + jmp S9xSA1MainAsmLoop + +/* BVC */ +Op50: + Relative + testb $0xff, SA1_Overflow + jnz .BVC_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BVC +.BVC_EXIT: + jmp S9xSA1MainAsmLoop + +/* BVS */ +Op70: + Relative + testb $0xff, SA1_Overflow + jz .BVS_EXIT + andl $0xffff, %edx + addl SA1PCBase, %edx + movl %edx, PC + CPUShutdown BVS +.BVS_EXIT: + jmp S9xSA1MainAsmLoop + +/* BRL */ +Op82: + RelativeLong BRL + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* CLC */ +Op18: + movb $0, SA1_Carry + jmp S9xSA1MainAsmLoop + +/* CLD */ +OpD8: + andb $~Decimal, FLAGS + jmp S9xSA1MainAsmLoop + +/* CLI */ +Op58: + andb $~IRQ, FLAGS + cmpb $0, SA1IRQActive + jz .CLI_EXIT + /* XXX: test for Settings.DisableIRQ */ + call S9xSA1Opcode_IRQ +.CLI_EXIT: + jmp S9xSA1MainAsmLoop + +/* CLV */ +OpB8: + movb $0, SA1_Overflow + jmp S9xSA1MainAsmLoop + +/* DEX */ +OpCAX1: + movb XL, %al + decb %al + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpCAX0: + decw XX + setnz SA1_Zero + movb XH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +/* DEY */ +Op88X1: + movb YL, %al + decb %al + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +Op88X0: + decw YY + setnz SA1_Zero + movb YH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +/* INX */ +OpE8X1: + movb XL, %al + incb %al + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpE8X0: + incw XX + setnz SA1_Zero + movb XH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +/* INY */ +OpC8X1: + movb YL, %al + incb %al + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +OpC8X0: + incw YY + setnz SA1_Zero + movb YH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +/* NOP */ +OpEA: + jmp S9xSA1MainAsmLoop + +/* PEA */ +OpF4E1: + Immediate16 PEA + PushWordENew PEA + jmp S9xSA1MainAsmLoop + +OpF4: + Immediate16 PEA + PushWord PEA + jmp S9xSA1MainAsmLoop + +/* PEI */ +OpD4E1: + DirectIndirect8 PEI + movl %edx, %eax + PushWordENew PEI + jmp S9xSA1MainAsmLoop + +OpD4: + DirectIndirect8 PEI + movl %edx, %eax + PushWord PEI + jmp S9xSA1MainAsmLoop + +/* PER */ +Op62E1: + RelativeLong PER + movl %edx, %eax + PushWordENew PER + jmp S9xSA1MainAsmLoop + +Op62: + RelativeLong PER + movl %edx, %eax + PushWord PER + jmp S9xSA1MainAsmLoop + +/* PHA */ +Op48E1: + movb AL, %al + PushByteE PHA + jmp S9xSA1MainAsmLoop + +Op48M1: + movb AL, %al + PushByte PHA + jmp S9xSA1MainAsmLoop + +Op48M0: + movw AA, %ax + PushWord PHA + jmp S9xSA1MainAsmLoop + +/* PHB */ +Op8BE1: + movb DB, %al + PushByteE PHB + jmp S9xSA1MainAsmLoop + +Op8B: + movb DB, %al + PushByte PHB + jmp S9xSA1MainAsmLoop + +/* PHD */ +Op0BE1: + movw DD, %ax + PushWordENew PHD + jmp S9xSA1MainAsmLoop + +Op0B: + movw DD, %ax + PushWord PHD + jmp S9xSA1MainAsmLoop + +/* PHK */ +Op4BE1: + movb PB, %al + PushByteE PHK + jmp S9xSA1MainAsmLoop + +Op4B: + movb PB, %al + PushByte PHK + jmp S9xSA1MainAsmLoop + +/* PHP */ +Op08E1: + S9xSA1PackStatus PHP + movb FLAGS, %al + PushByteE PHP + jmp S9xSA1MainAsmLoop + +Op08: + S9xSA1PackStatus PHP + movb FLAGS, %al + PushByte PHP + jmp S9xSA1MainAsmLoop + +/* PHX */ +OpDAE1: + movb XL, %al + PushByteE PHX + jmp S9xSA1MainAsmLoop + +OpDAX1: + movb XL, %al + PushByte PHX + jmp S9xSA1MainAsmLoop + +OpDAX0: + movw XX, %ax + PushWord PHX + jmp S9xSA1MainAsmLoop + +/* PHY */ +Op5AE1: + movb YL, %al + PushByteE PHY + jmp S9xSA1MainAsmLoop + +Op5AX1: + movb YL, %al + PushByte PHY + jmp S9xSA1MainAsmLoop + +Op5AX0: + movw YY, %ax + PushWord PHY + jmp S9xSA1MainAsmLoop + +/* PLA */ +Op68E1: + PullByteE PLA + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op68M1: + PullByte PLA + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op68M0: + PullWord PLA + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* PLB */ +OpABE1: + PullByteE PLB + movb %al, DB + SetZN + andl $0xff, %eax + sall $16, %eax + movl %eax, SA1ShiftedDB + jmp S9xSA1MainAsmLoop + +OpAB: + PullByte PLB + movb %al, DB + SetZN + andl $0xff, %eax + sall $16, %eax + movl %eax, SA1ShiftedDB + jmp S9xSA1MainAsmLoop + +/* PLD */ +Op2BE1: + PullWordENew PLD + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +Op2B: + PullWord PLD + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* PLP */ +Op28E1: + PullByteE PLPE + movb %al, FLAGS + + testb $IndexFlag, FLAGS + jz .PLP16E + xorb %al, %al + movb %al, XH + movb %al, YH +.PLP16E: + S9xSA1UnpackStatus PLPE + S9xSA1FixCycles PLPE + CheckForIrq PLPE + jmp S9xSA1MainAsmLoop + +Op28: + PullByte PLP + movb %al, FLAGS + + testb $IndexFlag, FLAGS + jz .PLP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.PLP16: + S9xSA1UnpackStatus PLP + S9xSA1FixCycles PLP + CheckForIrq PLP + jmp S9xSA1MainAsmLoop + +/* PLX */ +OpFAE1: + PullByteE PLX + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpFAX1: + PullByte PLX + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpFAX0: + PullWord PLX + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* PLY */ +Op7AE1: + PullByteE PLY + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +Op7AX1: + PullByte PLY + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +Op7AX0: + PullWord PLY + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* SEC */ +Op38: + movb $1, SA1_Carry + jmp S9xSA1MainAsmLoop + +/* SED */ +OpF8: + + orb $Decimal, FLAGS + jmp S9xSA1MainAsmLoop + +/* SEI */ +Op78: + orb $IRQ, FLAGS + jmp S9xSA1MainAsmLoop + +/* TAX */ +OpAAX1: + movb AL, %al + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpAAX0: + movw AA, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TAY */ +OpA8X1: + movb AL, %al + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +OpA8X0: + movw AA, %ax + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TCD */ +Op5B: + movw AA, %ax + movw %ax, DD + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TCS */ +Op1B: + movw AA, %ax + movw %ax, SS + testw $Emulation, FLAGS16 + jz .TCS_EXIT + movb $1, SH +.TCS_EXIT: + jmp S9xSA1MainAsmLoop + +/* TDC */ +Op7B: + movw DD, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TSC */ +Op3B: + movw SS, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TSX */ +OpBAX1: + movb SL, %al + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpBAX0: + movw SS, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TXA */ +Op8AM1: + movb XL, %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op8AM0: + movw XX, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TXS */ +Op9A: + movw XX, %ax + movw %ax, SS + testw $Emulation, FLAGS16 + jz .TXS_EXIT + movb $1, SH +.TXS_EXIT: + jmp S9xSA1MainAsmLoop + +/* TXY */ +Op9BX1: + movb XL, %al + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop + +Op9BX0: + movw XX, %ax + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TYA */ +Op98M1: + movb YL, %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +Op98M0: + movw YY, %ax + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* TYX */ +OpBBX1: + movb YL, %al + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop + +OpBBX0: + movw YY, %ax + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop + +/* XCE */ +OpFB: + movw FLAGS16, %ax + andw $~(Emulation | Carry), FLAGS16 + GetCarry + jnc .XCE_NO_CARRY + orw $Emulation, FLAGS16 +.XCE_NO_CARRY: + testw $Emulation, %ax + setnz SA1_Carry + testw $Emulation, FLAGS16 + jz .XCE_NO_EMULATION2 + orw $(MemoryFlag | IndexFlag), FLAGS16 + movb $1, SH +.XCE_NO_EMULATION2: + testw $IndexFlag, FLAGS16 + jz .XCE_NO_INDEX + xorl %eax, %eax + movb %al, XH + movb %al, YH +.XCE_NO_INDEX: + S9xSA1FixCycles XCE + jmp S9xSA1MainAsmLoop + +.data +.LC0: + .string "*** BRK" +.text + +Op00: +#ifdef DEBUGGER + testb $TRACE_FLAG, SA1Flags + je .BRK_NO_TRACE + pushl $.LC0 + ccall S9xTraceMessage + addl $4,%esp +.BRK_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .BRK_EMULATION + movb PB, %al + PushByte BRK1 + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord BRK2 + + S9xSA1PackStatus BRK + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte BRK3 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB + movl $0xFFE6, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop +.BRK_EMULATION: + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord BRK2 + + S9xSA1PackStatus BRK2 + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte BRK3 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB + movl $0xFFFE, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +.data +.LC1: + .string "*** IRQ" +.text +.globl S9xSA1Opcode_IRQ + +S9xSA1Opcode_IRQ: +#ifdef DEBUGGER + testb $TRACE_FLAG, SA1Flags + je .IRQ_NO_TRACE + pushl $.LC1 + ccall S9xTraceMessage + addl $4, %esp +.IRQ_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .IRQ_EMULATION + movb PB, %al + PushByte IRQ1 + movl PC, %eax + subl SA1PCBase, %eax + PushWord IRQ2 + + S9xSA1PackStatus IRQ + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte IRQ3 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB +// XXX: FIXME: wrong vector + xorl %edx, %edx + movl FillRAM, %eax + movw 0x2207(%eax), %dx + jmp S9xSA1SetPCBase +.IRQ_EMULATION: + movl PC, %eax + subl SA1PCBase, %eax + PushWord IRQ4 + + S9xSA1PackStatus IRQ2 + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte IRQ5 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB +// XXX: FIXME: wrong vector + xorl %edx, %edx + movl FillRAM, %eax + movw 0x2207(%eax), %dx + jmp S9xSA1SetPCBase + +.data +.LC2: + .string "*** NMI" +.text +.globl S9xSA1Opcode_NMI + +S9xSA1Opcode_NMI: +#ifdef DEBUGGER + testb $TRACE_FLAG, SA1Flags + je .NMI_NO_TRACE + pushl $.LC2 + ccall S9xTraceMessage + addl $4, %esp +.NMI_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .NMI_EMULATION + movb PB, %al + PushByte NMI1 + movl PC, %eax + subl SA1PCBase, %eax + PushWord NMI2 + + S9xSA1PackStatus NMI + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte NMI3 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB +// XXX: FIXME: wrong vector + xorl %edx, %edx + movl FillRAM, %eax + movw 0x2205(%eax), %dx + jmp S9xSA1SetPCBase +.NMI_EMULATION: + movl PC, %eax + subl SA1PCBase, %eax + PushWord NMI4 + + S9xSA1PackStatus NMI2 + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte NMI5 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB +// XXX: FIXME: wrong vector + xorl %edx, %edx + movl FillRAM, %eax + movw 0x2205(%eax), %dx + jmp S9xSA1SetPCBase + +.data +.LC3: + .string "*** COP" +.text + +Op02: +#ifdef DEBUGGER + testb $TRACE_FLAG, SA1Flags + je .COP_NO_TRACE + pushl $.LC3 + ccall S9xTraceMessage + addl $4,%esp +.COP_NO_TRACE: +#endif + testw $Emulation, FLAGS16 + jnz .COP_EMULATION + movb PB, %al + PushByte COP1 + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord COP2 + + S9xSA1PackStatus COP + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte COP3 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB + movl $0xFFE4, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop +.COP_EMULATION: + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord COP4 + + S9xSA1PackStatus COP2 + movb FLAGS, %al + andb $~Decimal, FLAGS + orb $IRQ, FLAGS + + PushByte COP5 + xorl %ecx, %ecx + movl %ecx, SA1ShiftedPB + movb %cl, PB + movl $0xFFF4, %edx + call S9xSA1GetWord + movl %eax, %edx + andl $0xffff, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* JML */ +OpDC: + AbsoluteIndirectLong8 JML + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, SA1ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +Op5C: + AbsoluteLong8 JML + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, SA1ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* JMP */ +Op4C: + Absolute8 JMP + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + CPUShutdown JMP + jmp S9xSA1MainAsmLoop + +Op6C: + AbsoluteIndirect8 JMP + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +Op7C: + AbsoluteIndexedIndirect8 JMP + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* JSL */ +Op22E1: + movb PB, %al + PushByte JSL_ABSL_E + movl PC, %eax + subl SA1PCBase, %eax + addl $2, %eax + PushWordENew JSL_ABSL_E + AbsoluteLong8 JSL + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, SA1ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +Op22: + movb PB, %al + PushByte JSL_ABSL + movl PC, %eax + subl SA1PCBase, %eax + addl $2, %eax + PushWord JSL_ABSL + AbsoluteLong8 JSL + movl %edx, %ecx + andl $0xff0000, %ecx + movl %ecx, SA1ShiftedPB + sarl $16, %ecx + movb %cl, PB + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* RTL */ +Op6BE1: + PullWord RTL_E + pushl %eax + PullByte RTL_E + movl SS, %edx + addl $0xFF, %edx + movb $0x01, %dh + movw %dx, SS + popl %edx + movb %al, PB + incw %dx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + movl %eax, SA1ShiftedPB + orl %eax, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +Op6B: + PullWord RTL + pushl %eax + PullByte RTL + popl %edx + movb %al, PB + incw %dx + andl $0xff, %eax + andl $0xffff, %edx + sall $16, %eax + movl %eax, SA1ShiftedPB + orl %eax, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* JSR ABS */ +Op20: + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord JSR_ABS + Absolute8 JSR_ABS + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* JSR ABS INDEXED INDIRECT */ +OpFCE1: + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWordENew JSR_AII_E + AbsoluteIndexedIndirect8 JSR + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +OpFC: + movl PC, %eax + subl SA1PCBase, %eax + incl %eax + PushWord JSR_AII + AbsoluteIndexedIndirect8 JSR + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* RTS */ +Op60: + PullWord RTS + incl %eax + movl %eax, %edx + andl $0xffff, %edx + orl SA1ShiftedPB, %edx + call S9xSA1SetPCBase + jmp S9xSA1MainAsmLoop + +/* MVN */ +Op54X1: + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, SA1ShiftedDB + movb 1(PC), %dl + sall $16, %edx + movw XX, %dx + call S9xSA1GetByte + movl SA1ShiftedDB, %edx + movw YY, %dx + call S9xSA1SetByte + incb XL + incb YL + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVN_EXIT8 + decl PC + jmp S9xSA1MainAsmLoop +.MVN_EXIT8: + addl $2, PC + jmp S9xSA1MainAsmLoop + +Op54X0: + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, SA1ShiftedDB + movb 1(PC), %dl + sall $16, %edx + movw XX, %dx + call S9xSA1GetByte + movl SA1ShiftedDB, %edx + movw YY, %dx + call S9xSA1SetByte + incw XX + incw YY + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVN_EXIT16 + decl PC + jmp S9xSA1MainAsmLoop +.MVN_EXIT16: + addl $2, PC + jmp S9xSA1MainAsmLoop + +/* MVP */ +Op44X1: + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, SA1ShiftedDB + movb 1(PC), %dl + sall $16, %edx + movw XX, %dx + call S9xSA1GetByte + movl SA1ShiftedDB, %edx + movw YY, %dx + call S9xSA1SetByte + decb XL + decb YL + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVP_EXIT8 + decl PC + jmp S9xSA1MainAsmLoop +.MVP_EXIT8: + addl $2, PC + jmp S9xSA1MainAsmLoop + +Op44X0: + xorl %edx, %edx + movb (PC), %dl + movb %dl, DB + sall $16, %edx + movl %edx, SA1ShiftedDB + movb 1(PC), %dl + sall $16, %edx + movw XX, %dx + call S9xSA1GetByte + movl SA1ShiftedDB, %edx + movw YY, %dx + call S9xSA1SetByte + decw XX + decw YY + movw AA, %ax + decw %ax + movw %ax, AA + cmpw $0xffff, %ax + je .MVP_EXIT16 + decl PC + jmp S9xSA1MainAsmLoop +.MVP_EXIT16: + addl $2, PC + jmp S9xSA1MainAsmLoop + +/* REP */ +OpC2: + movb (PC), %al + incl PC + notb %al + andb %al, FLAGS + andb %al, SA1_Negative + andb %al, SA1_Carry + testb $Zero, %al + setz %ah + orb %ah, SA1_Zero + shrb $6, %al + andb %al, SA1_Overflow + + testw $Emulation, FLAGS16 + jz .REP_NO_EMU + orb $(MemoryFlag | IndexFlag), FLAGS + +.REP_NO_EMU: + testb $IndexFlag, FLAGS + jz .REP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.REP16: + S9xSA1FixCycles REP + CheckForIrq REP + jmp S9xSA1MainAsmLoop + +/* SEP */ +OpE2: + movb (PC), %al + incl PC + orb %al, FLAGS + orb %al, SA1_Negative + movb %al, %ah + shrb $6, %ah + andb $1, %ah + orb %ah, SA1_Overflow + test $Zero, %al + jz .SEP_NO_ZERO + movb $0, SA1_Zero +.SEP_NO_ZERO: + andb $1, %al + orb %al, SA1_Carry + testw $Emulation, FLAGS16 + jz .SEP_NO_EMU + orb $(MemoryFlag | IndexFlag), FLAGS + +.SEP_NO_EMU: + testb $IndexFlag, FLAGS + jz .SEP16 + xorb %al, %al + movb %al, XH + movb %al, YH +.SEP16: + S9xSA1FixCycles SEP + jmp S9xSA1MainAsmLoop + +/* XBA */ +OpEB: + movb AL, %ah + movb AH, %al + movb %ah, AH + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop + +/* RTI */ +Op40: + PullByte RTI + movb %al, FLAGS + PullWord RTI + andl $0xffff, %eax + pushl %eax + testw $Emulation, FLAGS16 + jnz .RTI_EMU + PullByte RTI2 + andl $0xff, %eax + jmp .RTI_SKIP_EMU +.RTI_EMU: + orb $(MemoryFlag | IndexFlag), FLAGS + /*XXX: HERE xorl %eax, %eax*/ + movl SA1ShiftedPB, %eax + sarl $16, %eax +.RTI_SKIP_EMU: + movb %al, PB + popl %edx + sall $16, %eax + orl %eax, %edx + movl %eax, SA1ShiftedPB + call S9xSA1SetPCBase + testb $IndexFlag, FLAGS + jz .RTI16 + xorb %al, %al + movb %al, XH + movb %al, YH +.RTI16: + S9xSA1UnpackStatus RTI + S9xSA1FixCycles RTI + CheckForIrq RTI + jmp S9xSA1MainAsmLoop + +/* WAI */ +OpCB: + movb $1, SA1WaitingForInterrupt + decl PC +#if 0 +// XXX: FIXME + movb Shutdown, %al + testb %al, %al + je .NoShutdown + movl NextEvent, CYCLES + cmpb $0, APUExecuting + je S9xSA1MainAsmLoop + movb $0, CPUExecuting +.WAITExecAPU: +#ifdef DEBUGGER + testb $2,APUFlags + je .WAITNoAPUS9xSA1Trace + STORE_REGISTERS + ccall S9xSA1TraceAPU + LOAD_REGISTERS +.WAITNoAPUS9xSA1Trace: +#endif + xorl %eax,%eax +#ifdef SPC700_C + movl APUPC,%edx + SAVE_CYCLES + movb (%edx),%al +#else + movb (APUPC),%al +#endif + movl S9xAPUCycles(,%eax,4), %edx + movl S9xApuOpcodes(,%eax,4),%eax + addl %edx, APUCycles + call *%eax +#ifdef SPC700_C + LOAD_CYCLES +#endif + movl NextEvent, %eax + cmpl %eax, APUCycles + jl .WAITExecAPU + movb $1, CPUExecuting + jmp S9xSA1MainAsmLoop +#endif +.NoShutdown: + jmp S9xSA1MainAsmLoop + +/* ??? */ +OpDB: + decl PC + orb $DEBUG_MODE_FLAG, SA1Flags + jmp S9xSA1MainAsmLoop + +Op42: + jmp S9xSA1MainAsmLoop + +.globl S9xSA1OpcodesM1X1 +.data + .align 4 +S9xSA1OpcodesM1X1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl S9xSA1OpcodesE1 +.data + .align 4 +S9xSA1OpcodesE1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08E1 + .long Op09M1 + .long Op0AM1 + .long Op0BE1 + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22E1 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28E1 + .long Op29M1 + .long Op2AM1 + .long Op2BE1 + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48E1 + .long Op49M1 + .long Op4AM1 + .long Op4BE1 + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AE1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62E1 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68E1 + .long Op69M1 + .long Op6AM1 + .long Op6BE1 + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AE1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8BE1 + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpABE1 + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4E1 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAE1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4E1 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAE1 + .long OpFB + .long OpFCE1 + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + + .globl S9xSA1OpcodesM1X0 + .align 4 +S9xSA1OpcodesM1X0: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X0 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X0 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X0 + .long Op85M1 + .long Op86X0 + .long Op87M1 + .long Op88X0 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX0 + .long Op8DM1 + .long Op8EX0 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X0 + .long Op95M1 + .long Op96X0 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX0 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X0 + .long OpA1M1 + .long OpA2X0 + .long OpA3M1 + .long OpA4X0 + .long OpA5M1 + .long OpA6X0 + .long OpA7M1 + .long OpA8X0 + .long OpA9M1 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM1 + .long OpAEX0 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X0 + .long OpB5M1 + .long OpB6X0 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM1 + .long OpBEX0 + .long OpBFM1 + .long OpC0X0 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X0 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X0 + .long OpC9M1 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X0 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X0 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X0 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl S9xSA1OpcodesM0X0 + .align 4 +S9xSA1OpcodesM0X0: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X0 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X0 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X0 + .long Op85M0 + .long Op86X0 + .long Op87M0 + .long Op88X0 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX0 + .long Op8DM0 + .long Op8EX0 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X0 + .long Op95M0 + .long Op96X0 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX0 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X0 + .long OpA1M0 + .long OpA2X0 + .long OpA3M0 + .long OpA4X0 + .long OpA5M0 + .long OpA6X0 + .long OpA7M0 + .long OpA8X0 + .long OpA9M0 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM0 + .long OpAEX0 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X0 + .long OpB5M0 + .long OpB6X0 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM0 + .long OpBEX0 + .long OpBFM0 + .long OpC0X0 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X0 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X0 + .long OpC9M0 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X0 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X0 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X0 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + +.globl S9xSA1OpcodesM0X1 + .align 4 +S9xSA1OpcodesM0X1: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X1 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X1 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X1 + .long Op85M0 + .long Op86X1 + .long Op87M0 + .long Op88X1 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX1 + .long Op8DM0 + .long Op8EX1 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X1 + .long Op95M0 + .long Op96X1 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX1 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X1 + .long OpA1M0 + .long OpA2X1 + .long OpA3M0 + .long OpA4X1 + .long OpA5M0 + .long OpA6X1 + .long OpA7M0 + .long OpA8X1 + .long OpA9M0 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM0 + .long OpAEX1 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X1 + .long OpB5M0 + .long OpB6X1 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM0 + .long OpBEX1 + .long OpBFM0 + .long OpC0X1 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X1 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X1 + .long OpC9M0 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X1 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X1 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X1 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 diff --git a/src/i386/sa1ops.h b/src/i386/sa1ops.h new file mode 100644 index 0000000..5c75ecf --- /dev/null +++ b/src/i386/sa1ops.h @@ -0,0 +1,650 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro Adc8 K + testb $Decimal, FLAGS + jnz .ADC8Decimal\K + GetCarry + adcb AL, %al + SetZNCV + movb %al, AL + jmp S9xSA1MainAsmLoop + +.ADC8Decimal\K: + GetCarry + adcb AL, %al + daa + movb %al, AL + SetZNCV + jmp S9xSA1MainAsmLoop +.endm + +.macro Adc16 K + testb $Decimal, FLAGS + jnz .ADC16Decimal\K + GetCarry + adcw AA, %ax + movw %ax, AA + setc SA1_Carry + seto SA1_Overflow + setnz SA1_Zero + movb %ah, SA1_Negative + jmp S9xSA1MainAsmLoop + +.ADC16Decimal\K: + GetCarry + adcb AL, %al + daa + movb %al, AL + movb %ah, %al + adcb AH, %al + daa + movb %al, AH + setc SA1_Carry + seto SA1_Overflow + movw AA, %ax + movb %ah, SA1_Negative + orb %ah, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Sbc8 K + testb $Decimal, FLAGS + jnz .SBC8Decimal\K + GetNotCarry + sbbb %al, AL + movb AL, %al + setnc SA1_Carry + SetZNV + jmp S9xSA1MainAsmLoop + +.SBC8Decimal\K: + GetNotCarry + movb %al, %dl + movb AL, %al + sbbb %dl, %al + das + movb %al, AL + setnc SA1_Carry + SetZNV + jmp S9xSA1MainAsmLoop +.endm + +.macro Sbc16 K + testb $Decimal, FLAGS + jnz .SBC16Decimal\K + GetNotCarry + sbbw %ax, AA + setnc SA1_Carry + setnz SA1_Zero + seto SA1_Overflow + movb AH, %al + movb %al, SA1_Negative + jmp S9xSA1MainAsmLoop + +.SBC16Decimal\K: + movl %eax, %edx + movw AA, %ax + GetNotCarry + sbbb %dl, %al + das + movb %al, AL + movb %ah, %al + sbbb %dh, %al + das + movb %al, AH + setnc SA1_Carry + seto SA1_Overflow + movw AA, %ax + movb %ah, SA1_Negative + orb %ah, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Ora8 K + orb AL, %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Ora16 K + orw AA, %ax + movw %ax, AA + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Eor8 K + xorb AL, %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Eor16 K + xorw AA, %ax + movw %ax, AA + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro And8 K + andb AL, %al + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro And16 K + andw AA, %ax + movw %ax, AA + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Lda8 K + movb %al, AL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Lda16 K + movw %ax, AA + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Ldx8 K + movb %al, XL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Ldx16 K + movw %ax, XX + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Ldy8 K + movb %al, YL + SetZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Ldy16 K + movw %ax, YY + testw %ax, %ax + Set16ZN + jmp S9xSA1MainAsmLoop +.endm + +.macro Cmp8 K + movb AL, %ah + subb %al, %ah + setnc SA1_Carry + movb %ah, SA1_Negative + movb %ah, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Cmp16 K + movw AA, %dx + subw %ax, %dx + setnc SA1_Carry + setnz SA1_Zero + movb %dh, SA1_Negative + jmp S9xSA1MainAsmLoop +.endm + +.macro Cpx8 K + movb XL, %ah + subb %al, %ah + setnc SA1_Carry + movb %ah, SA1_Negative + movb %ah, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Cpx16 K + movw XX, %dx + subw %ax, %dx + setnc SA1_Carry + setnz SA1_Zero + movb %dh, SA1_Negative + jmp S9xSA1MainAsmLoop +.endm + +.macro Cpy8 K + movb YL, %ah + subb %al, %ah + setnc SA1_Carry + movb %ah, SA1_Negative + movb %ah, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Cpy16 K + movw YY, %dx + subw %ax, %dx + setnc SA1_Carry + setnz SA1_Zero + movb %dh, SA1_Negative + jmp S9xSA1MainAsmLoop +.endm + +.macro Asl8 K + pushl %edx + call S9xSA1GetByte + salb %al + SetZNC + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Asl16 K + pushl %edx + call S9xSA1GetWord + salw %ax + Set16ZNC + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Lsr8 K + pushl %edx + call S9xSA1GetByte + shrb %al + SetZNC + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Lsr16 K + pushl %edx + call S9xSA1GetWord + shrw %ax + Set16ZNC + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Rol8 K + pushl %edx + call S9xSA1GetByte + GetCarry + rclb %al + SetZNC + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Rol16 K + pushl %edx + call S9xSA1GetWord + GetCarry + rclw %ax + setc SA1_Carry + movb %ah, SA1_Negative + testw %ax, %ax + setnz SA1_Zero + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Ror8 K + pushl %edx + call S9xSA1GetByte + GetCarry + rcrb %al + SetZNC + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Ror16 K + pushl %edx + call S9xSA1GetWord + GetCarry + rcrw %ax + setc SA1_Carry + movb %ah, SA1_Negative + testw %ax, %ax + setnz SA1_Zero + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Bit8 K + call S9xSA1GetByte + movb %al, SA1_Negative + testb $0x40, %al + setnz SA1_Overflow + andb AL, %al + movb %al, SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Bit16 K + call S9xSA1GetWord + movb %ah, SA1_Negative + testb $0x40, %ah + setnz SA1_Overflow + andw AA, %ax + setnz SA1_Zero + jmp S9xSA1MainAsmLoop +.endm + +.macro Dec8 K + pushl %edx + call S9xSA1GetByte + decb %al + SetZN + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Dec16 K + pushl %edx + call S9xSA1GetWord + decw %ax + Set16ZN + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Inc8 K + pushl %edx + call S9xSA1GetByte + incb %al + SetZN + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Inc16 K + pushl %edx + call S9xSA1GetWord + incw %ax + Set16ZN + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Sta8 K + movb AL, %al + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Sta16 K + movw AA, %ax + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Stx8 K + movb XL, %al + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Stx16 K + movw XX, %ax + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Sty8 K + movb YL, %al + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Sty16 K + movw YY, %ax + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Stz8 K + xorb %al, %al + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Stz16 K + xorl %eax, %eax + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Trb8 K + pushl %edx + call S9xSA1GetByte + movb AL, %dl + testb %al, %dl + setnz SA1_Zero + xorb $0xff, %dl + andb %dl, %al + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Trb16 K + pushl %edx + call S9xSA1GetWord + movw AA, %dx + testw %ax, %dx + setnz SA1_Zero + xorl $0xffffffff, %edx + andl %edx, %eax + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro Tsb8 K + pushl %edx + call S9xSA1GetByte + movb AL, %dl + testb %al, %dl + setnz SA1_Zero + orb %dl, %al + popl %edx + call S9xSA1SetByte + jmp S9xSA1MainAsmLoop +.endm + +.macro Tsb16 K + pushl %edx + call S9xSA1GetWord + movw AA, %dx + testw %ax, %dx + setnz SA1_Zero + orw %dx, %ax + popl %edx + call S9xSA1SetWord + jmp S9xSA1MainAsmLoop +.endm + +.macro CheckForIrq K + testb $0xff, SA1IRQActive + jz .CheckForIrqS9xSA1Exit\K + testb $IRQ, FLAGS + jnz .CheckForIrqS9xSA1Exit\K + call S9xSA1Opcode_IRQ +.CheckForIrqS9xSA1Exit\K: +.endm + +.macro S9xSA1FixCycles K + testw $Emulation, FLAGS16 + jz .S9xSA1FixCyclesNoEmulation\K + movl $S9xSA1OpcodesM1X1, SA1Opcodes + jmp .S9xSA1FixCyclesS9xSA1Exit\K + +.S9xSA1FixCyclesNoEmulation\K: + testb $MemoryFlag, FLAGS + jz .S9xSA1FixCyclesNoMemory\K + testb $IndexFlag, FLAGS + jz .S9xSA1FixCyclesNoIndex\K + movl $S9xSA1OpcodesM1X1, SA1Opcodes + jmp .S9xSA1FixCyclesS9xSA1Exit\K +.S9xSA1FixCyclesNoIndex\K: + movl $S9xSA1OpcodesM1X0, SA1Opcodes + jmp .S9xSA1FixCyclesS9xSA1Exit\K + +.S9xSA1FixCyclesNoMemory\K: + testb $IndexFlag, FLAGS + jz .S9xSA1FixCyclesNoIndex2\K + movl $S9xSA1OpcodesM0X1, SA1Opcodes + jmp .S9xSA1FixCyclesS9xSA1Exit\K +.S9xSA1FixCyclesNoIndex2\K: + movl $S9xSA1OpcodesM0X0, SA1Opcodes +.S9xSA1FixCyclesS9xSA1Exit\K: +.endm + +.macro S9xSA1UnpackStatus K + movb FLAGS, %al + movb %al, SA1_Negative + testb $Zero, %al + setz SA1_Zero + testb $Carry, FLAGS + setnz SA1_Carry + testb $Overflow, FLAGS + setnz SA1_Overflow +.endm + +.macro S9xSA1PackStatus K + movb SA1_Carry, %al + andb $~(Zero | Negative | Carry | Overflow), FLAGS + orb %al, FLAGS + movb SA1_Negative, %al + andb $0x80, %al + orb %al, FLAGS + movb SA1_Overflow, %al + salb $6, %al + orb %al, FLAGS + testb $0xff, SA1_Zero + setz %al + salb %al + orb %al, FLAGS +.endm + +.macro CPUShutdown K +// cmpb $0, Shutdown +// jz .NoShutdown\K + cmpl PC, SA1WaitAddress + jnz .NoShutdown\K + cmpl $1, SA1WaitCounter + jl .NotYet\K + movb $0, SA1Executing + jp .NoShutdown\K +.NotYet\K: + incl SA1WaitCounter +.NoShutdown\K: +.endm + diff --git a/src/i386/sa1struc.h b/src/i386/sa1struc.h new file mode 100644 index 0000000..10a7326 --- /dev/null +++ b/src/i386/sa1struc.h @@ -0,0 +1,257 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#if defined(__DJGCC) || defined(MICROSOFT_C) || defined(_WINDOWS) +#define S9xTraceMessage _S9xTraceMessage +#define S9xGetPPU _S9xGetPPU +#define S9xSetPPU _S9xSetPPU +#define S9xSetDSP _S9xSetDSP +#define S9xGetDSP _S9xGetDSP +#define S9xGetCPU _S9xGetCPU +#define S9xSetCPU _S9xSetCPU +#define S9xSyncSpeed _S9xSyncSpeed +#define S9xTrace _S9xTrace +#define S9xDoHBlankProcessing _S9xDoHBlankProcessing +#define S9xTraceAPU _S9xTraceAPU +#define S9xGetWord _S9xGetWord +#define memset _memset +#define S9xDoHDMA _S9xDoHDMA +#define S9xStartHDMA _S9xStartHDMA +#define S9xEndScreenRefresh _S9xEndScreenRefresh +#define S9xStartScreenRefresh _S9xStartScreenRefresh +#define S9xSetAPUControl _S9xSetAPUControl +#define S9xSetAPUDSP _S9xSetAPUDSP +#define S9xGetAPUDSP _S9xGetAPUDSP +#define S9xTextMode _S9xTextMode +#define printf _printf +#define S9xSetAPUTimer _S9xSetAPUTimer +#define S9xAPUOPrint _S9xAPUOPrint +#define S9xSuperFXExec _S9xSuperFXExec +#define S9xGenerateSound _S9xGenerateSound +#define S9xUpdateJoypads _S9xUpdateJoypads +#define S9xMainLoop _S9xMainLoop +#define RenderLine _RenderLine +#define S9xSetIRQ _S9xSetIRQ +#define S9xClearIRQ _S9xClearIRQ +#define SA1 _SA1 +#define CPU _CPU +#define ICPU _ICPU +#define Settings _Settings +#define PPU _PPU +#define IPPU _IPPU +#define SA1Registers _SA1Registers +#define Memory _Memory +#define APU _APU +#define IAPU _IAPU +#define APURegisters _APURegisters +#define S9xBreakpoint _S9xBreakpoint +#define missing _missing +#define OpenBus _OpenBus +#define S9xApuOpcodes _S9xApuOpcodes +#define S9xAPUCycles _S9xAPUCycles +#define S9xMessage _S9xMessage +#define String _String +#define sprintf _sprintf +#define S9xSA1ExecuteDuringSleep _S9xSA1ExecuteDuringSleep +#define S9xGetSA1 _S9xGetSA1 +#define S9xSetSA1 _S9xSetSA1 +#define S9xSA1Trace _S9xSA1Trace +#define S9xSA1OpcodesE1 _S9xSA1OpcodesE1 +#define S9xSA1OpcodesM1X1 _S9xSA1OpcodesM1X1 +#define S9xSA1OpcodesM1X0 _S9xSA1OpcodesM1X0 +#define S9xSA1OpcodesM0X1 _S9xSA1OpcodesM0X1 +#define S9xSA1OpcodesM0X0 _S9xSA1OpcodesM0X0 + +#define A1 _A1 +#define A2 _A2 +#define A3 _A3 +#define A4 _A4 +#define Work8 _Work8 +#define Work16 _Work16 +#define Work32 _Work32 +#define Int8 _Int8 +#define Int16 _Int16 +#define Int32 _Int32 +#define S9xE1M1X1 _S9xE1M1X1 +#define S9xE0M1X1 _S9xE0M1X1 +#define S9xE0M1X0 _S9xE0M1X0 +#define S9xE0M0X1 _S9xE0M0X1 +#define S9xE0M0X0 _S9xE0M0X0 +#define S9xOpcodesM1X1 _S9xOpcodesM1X1 +#define S9xOpcodesM1X0 _S9xOpcodesM1X0 +#define S9xOpcodesM0X1 _S9xOpcodesM0X1 +#define S9xOpcodesM0X0 _S9xOpcodesM0X0 +#define APUROM _APUROM +#define W1 _W1 +#define W2 _W2 +#define W3 _W3 +#define W4 _W4 +#endif + +#include "offsets.h" + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define DEBUG_MODE_FLAG (1 << 0) +#define TRACE_FLAG (1 << 1) +#define SINGLE_STEP_FLAG (1 << 2) +#define BREAK_FLAG (1 << 3) +#define SCAN_KEYS_FLAG (1 << 4) +#define SAVE_SNAPSHOT_FLAG (1 << 5) +#define DELAYED_NMI_FLAG (1 << 6) +#define NMI_FLAG (1 << 7) +#define PROCESS_SOUND_FLAG (1 << 8) +#define FRAME_ADVANCE_FLAG (1 << 9) +#define DELAYED_NMI_FLAG2 (1 << 10) +#define IRQ_PENDING_FLAG (1 << 11) + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT 12 +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) + +#define CYCLES %esi +#define PC %edi +#ifdef SPC700_C +#define APUPC APUPCS +#else +#define APUPC %ebp +#endif + +#define FLAGS %bl +#define FLAGS16 %bx + +#define SA1LOAD_CYCLES +#define SA1SAVE_CYCLES + +.macro LOAD_REGISTERS + SA1LOAD_CYCLES + movl SA1PCS, PC +#ifndef SPC700_C + movl APUPCS, APUPC +#endif + movw PP, FLAGS16 +.endm + +.macro STORE_REGISTERS + SA1SAVE_CYCLES + movl PC, SA1PCS +#ifndef SPC700_C + movl APUPC, APUPCS +#endif + movw FLAGS16, PP +.endm + +.macro PUSH_REGISTERS + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx +.endm + +.macro POP_REGISTERS + popl %ebx + popl %esi + popl %edi + popl %ebp +.endm + +.macro ccall name + call \name +.endm + + diff --git a/src/i386/sfxproc.asm b/src/i386/sfxproc.asm new file mode 100644 index 0000000..264118e --- /dev/null +++ b/src/i386/sfxproc.asm @@ -0,0 +1,678 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +%include "src/i386/macros.mac" + +EXTSYM NumberOfOpcodes,SfxB,SfxBRAMR,SfxCBR,SfxCFGR,SfxCLSR,SfxCPB,SfxCROM +EXTSYM SfxCarry,SfxMemTable,SfxOverflow,SfxPBR,SfxPIPE,SfxR0,SfxR1,SfxR10 +EXTSYM SfxR11,SfxR12,SfxR13,SfxR14,SfxR15,SfxR2,SfxR3,SfxR4,SfxR5,SfxR6 +EXTSYM SfxR7,SfxR8,SfxR9,SfxRAMBR,SfxRAMMem,SfxROMBR,SfxSCBR,SfxSCMR,SfxSFR +EXTSYM SfxSignZero,SfxnRamBanks,StartSFX,regptr,regptw,sfxramdata +EXTSYM SfxPOR,sfxclineloc,UpdatePORSCMR,UpdateCLSR,UpdateSCBRCOLR,SfxAC +EXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc + +NEWSYM SfxProcAsmStart + +%include "src/i386/regs.mac" +%include "src/i386/regsw.mac" + + + + + + +%macro AssembleSFXFlags 0 + and word[SfxSFR],8F60h + test byte[SfxCarry],1 + jz .nosfxcarry + or word[SfxSFR],04h +.nosfxcarry + cmp word[SfxSignZero],0 + jne .nozero + or word[SfxSFR],02h +.nozero + test word[SfxSignZero],8000h + jz .noneg + or word[SfxSFR],08h +.noneg + cmp byte[SfxOverflow],0 + je .noof + or word[SfxSFR],10h +.noof + cmp byte[SfxB],0 + je .bzero + or word[SfxSFR],1000h +.bzero +%endmacro + + +NEWSYM initsfxregsr + setreg 3000h*4,reg3000r + setreg 3001h*4,reg3001r + setreg 3002h*4,reg3002r + setreg 3003h*4,reg3003r + setreg 3004h*4,reg3004r + setreg 3005h*4,reg3005r + setreg 3006h*4,reg3006r + setreg 3007h*4,reg3007r + setreg 3008h*4,reg3008r + setreg 3009h*4,reg3009r + setreg 300Ah*4,reg300Ar + setreg 300Bh*4,reg300Br + setreg 300Ch*4,reg300Cr + setreg 300Dh*4,reg300Dr + setreg 300Eh*4,reg300Er + setreg 300Fh*4,reg300Fr + setreg 3010h*4,reg3010r + setreg 3011h*4,reg3011r + setreg 3012h*4,reg3012r + setreg 3013h*4,reg3013r + setreg 3014h*4,reg3014r + setreg 3015h*4,reg3015r + setreg 3016h*4,reg3016r + setreg 3017h*4,reg3017r + setreg 3018h*4,reg3018r + setreg 3019h*4,reg3019r + setreg 301Ah*4,reg301Ar + setreg 301Bh*4,reg301Br + setreg 301Ch*4,reg301Cr + setreg 301Dh*4,reg301Dr + setreg 301Eh*4,reg301Er + setreg 301Fh*4,reg301Fr + setreg 3030h*4,reg3030r + setreg 3031h*4,reg3031r + setreg 3032h*4,reg3032r + setreg 3033h*4,reg3033r + setreg 3034h*4,reg3034r + setreg 3035h*4,reg3035r + setreg 3036h*4,reg3036r + setreg 3037h*4,reg3037r + setreg 3038h*4,reg3038r + setreg 3039h*4,reg3039r + setreg 303Ah*4,reg303Ar + setreg 303Bh*4,reg303Br + setreg 303Ch*4,reg303Cr + setreg 303Dh*4,reg303Dr + setreg 303Eh*4,reg303Er + setreg 303Fh*4,reg303Fr + ; set 3100-31FF to cacheregr + mov edi,3100h*4 + add edi,[regptr] + mov eax,cacheregr + mov ecx,200h +.loop + mov [edi],eax + add edi,4 + dec ecx + jnz .loop + ret + +NEWSYM initsfxregsw + setregw 3000h*4,reg3000w + setregw 3001h*4,reg3001w + setregw 3002h*4,reg3002w + setregw 3003h*4,reg3003w + setregw 3004h*4,reg3004w + setregw 3005h*4,reg3005w + setregw 3006h*4,reg3006w + setregw 3007h*4,reg3007w + setregw 3008h*4,reg3008w + setregw 3009h*4,reg3009w + setregw 300Ah*4,reg300Aw + setregw 300Bh*4,reg300Bw + setregw 300Ch*4,reg300Cw + setregw 300Dh*4,reg300Dw + setregw 300Eh*4,reg300Ew + setregw 300Fh*4,reg300Fw + setregw 3010h*4,reg3010w + setregw 3011h*4,reg3011w + setregw 3012h*4,reg3012w + setregw 3013h*4,reg3013w + setregw 3014h*4,reg3014w + setregw 3015h*4,reg3015w + setregw 3016h*4,reg3016w + setregw 3017h*4,reg3017w + setregw 3018h*4,reg3018w + setregw 3019h*4,reg3019w + setregw 301Ah*4,reg301Aw + setregw 301Bh*4,reg301Bw + setregw 301Ch*4,reg301Cw + setregw 301Dh*4,reg301Dw + setregw 301Eh*4,reg301Ew + setregw 301Fh*4,reg301Fw + setregw 3030h*4,reg3030w + setregw 3031h*4,reg3031w + setregw 3032h*4,reg3032w + setregw 3033h*4,reg3033w + setregw 3034h*4,reg3034w + setregw 3035h*4,reg3035w + setregw 3036h*4,reg3036w + setregw 3037h*4,reg3037w + setregw 3038h*4,reg3038w + setregw 3039h*4,reg3039w + setregw 303Ah*4,reg303Aw + setregw 303Bh*4,reg303Bw + setregw 303Ch*4,reg303Cw + setregw 303Dh*4,reg303Dw + setregw 303Eh*4,reg303Ew + setregw 303Fh*4,reg303Fw + ; set 3100-31FF to cacheregw + mov edi,3100h*4 + add edi,[regptw] + mov eax,cacheregw + mov ecx,200h +.loop + mov [edi],eax + add edi,4 + dec ecx + jnz .loop + ret + +NEWSYM cacheregr + or byte[cachewarning],1 + ret + +NEWSYM cacheregw + or byte[cachewarning],2 + ret + +SECTION .bss +NEWSYM cachewarning, resb 1 +NEWSYM SFXProc, resd 1 +NEWSYM ChangeOps, resd 1 + +SECTION .text + +; SFX Registers + +NEWSYM reg3000r + mov al,[SfxR0] + ret +NEWSYM reg3001r + mov al,[SfxR0+1] + ret +NEWSYM reg3002r + mov al,[SfxR1] + ret +NEWSYM reg3003r + mov al,[SfxR1+1] + ret +NEWSYM reg3004r + mov al,[SfxR2] + ret +NEWSYM reg3005r + mov al,[SfxR2+1] + ret +NEWSYM reg3006r + mov al,[SfxR3] + ret +NEWSYM reg3007r + mov al,[SfxR3+1] + ret +NEWSYM reg3008r + mov al,[SfxR4] + ret +NEWSYM reg3009r + mov al,[SfxR4+1] + ret +NEWSYM reg300Ar + mov al,[SfxR5] + ret +NEWSYM reg300Br + mov al,[SfxR5+1] + ret +NEWSYM reg300Cr + mov al,[SfxR6] + ret +NEWSYM reg300Dr + mov al,[SfxR6+1] + ret +NEWSYM reg300Er + mov al,[SfxR7] + ret +NEWSYM reg300Fr + mov al,[SfxR7+1] + ret +NEWSYM reg3010r + mov al,[SfxR8] + ret +NEWSYM reg3011r + mov al,[SfxR8+1] + ret +NEWSYM reg3012r + mov al,[SfxR9] + ret +NEWSYM reg3013r + mov al,[SfxR9+1] + ret +NEWSYM reg3014r + mov al,[SfxR10] + ret +NEWSYM reg3015r + mov al,[SfxR10+1] + ret +NEWSYM reg3016r + mov al,[SfxR11] + ret +NEWSYM reg3017r + mov al,[SfxR11+1] + ret +NEWSYM reg3018r + mov al,[SfxR12] + ret +NEWSYM reg3019r + mov al,[SfxR12+1] + ret +NEWSYM reg301Ar + mov al,[SfxR13] + ret +NEWSYM reg301Br + mov al,[SfxR13+1] + ret +NEWSYM reg301Cr + mov al,[SfxR14] + ret +NEWSYM reg301Dr + mov al,[SfxR14+1] + ret +NEWSYM reg301Er + mov al,[SfxR15] + ret +NEWSYM reg301Fr + mov al,[SfxR15+1] + ret + +; Other SFX stuff + +NEWSYM reg3030r + AssembleSFXFlags + mov al,[SfxSFR] + ret +NEWSYM reg3031r + cmp byte[SfxAC],1 + je .alwaysclear + cmp dword[ChangeOps],-350*240 + jl .noclear +.alwaysclear + and byte[SfxSFR+1],07fh ; clear IRQ flag + jmp .cleared +.noclear + cmp dword[ChangeOps],-350*240*4 + jge .clear + mov dword[ChangeOps],-350*240*4 + jmp .cleared +.clear + add dword[ChangeOps],350*240 +.cleared + mov al,[SfxSFR+1] + ret +SECTION .bss +.test resb 1 +SECTION .text + +NEWSYM reg3032r ; Unused + xor al,al + ret +NEWSYM reg3033r ; BRAMR Backup Ram Read only on/off (bits 1-15 unused) + mov al,[SfxBRAMR] + ret +NEWSYM reg3034r ; PBR (Program Bank) + mov al,[SfxPBR] + ret +NEWSYM reg3035r ; Unused + xor al,al + ret +NEWSYM reg3036r ; ROMBR (Gamepak Rom Bank Register) + mov al,[SfxROMBR] + ret +NEWSYM reg3037r ; CFGR (Control Flags Register) + mov al,[SfxCFGR] + ret +NEWSYM reg3038r ; SCBR (Screen Bank Register) + mov al,[SfxSCBR] + ret +NEWSYM reg3039r ; CLSR (Clock Speed Register) + mov al,[SfxCLSR] + ret +NEWSYM reg303Ar ; SCMR (Screen Mode Register) + mov al,[SfxSCMR] + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov [sfxclineloc],eax + ret +NEWSYM reg303Br ; VCR (Version Code Register) + mov al,20h + ret +NEWSYM reg303Cr ; RAMBR (Ram bank register) + mov al,[SfxRAMBR] + ret +NEWSYM reg303Dr ; Unused + xor al,al + ret +NEWSYM reg303Er ; CBR (Cache Base Register), lower byte + mov al,[SfxCBR] + ret +NEWSYM reg303Fr ; CBR (Cache Base Register), upper byte + mov al,[SfxCBR+1] + ret + +; SFX Write Registers + +NEWSYM reg3000w + mov [SfxR0],al + ret +NEWSYM reg3001w + mov [SfxR0+1],al + ret +NEWSYM reg3002w + mov [SfxR1],al + ret +NEWSYM reg3003w + mov [SfxR1+1],al + ret +NEWSYM reg3004w + mov [SfxR2],al + ret +NEWSYM reg3005w + mov [SfxR2+1],al + ret +NEWSYM reg3006w + mov [SfxR3],al + ret +NEWSYM reg3007w + mov [SfxR3+1],al + ret +NEWSYM reg3008w + mov [SfxR4],al + ret +NEWSYM reg3009w + mov [SfxR4+1],al + ret +NEWSYM reg300Aw + mov [SfxR5],al + ret +NEWSYM reg300Bw + mov [SfxR5+1],al + ret +NEWSYM reg300Cw + mov [SfxR6],al + ret +NEWSYM reg300Dw + mov [SfxR6+1],al + ret +NEWSYM reg300Ew + mov [SfxR7],al + ret +NEWSYM reg300Fw + mov [SfxR7+1],al + ret +NEWSYM reg3010w + mov [SfxR8],al + ret +NEWSYM reg3011w + mov [SfxR8+1],al + ret +NEWSYM reg3012w + mov [SfxR9],al + ret +NEWSYM reg3013w + mov [SfxR9+1],al + ret +NEWSYM reg3014w + mov [SfxR10],al + ret +NEWSYM reg3015w + mov [SfxR10+1],al + ret +NEWSYM reg3016w + mov [SfxR11],al + ret +NEWSYM reg3017w + mov [SfxR11+1],al + ret +NEWSYM reg3018w + mov [SfxR12],al + ret +NEWSYM reg3019w + mov [SfxR12+1],al + ret +NEWSYM reg301Aw + mov [SfxR13],al + ret +NEWSYM reg301Bw + mov [SfxR13+1],al + ret +NEWSYM reg301Cw + mov [SfxR14],al + ret +NEWSYM reg301Dw + mov [SfxR14+1],al + ret +NEWSYM reg301Ew + mov [SfxR15],al + ret +NEWSYM reg301Fw + mov [SfxR15+1],al + ; start execution + push edx + mov edx,[SfxPBR] + mov edx,[SfxMemTable+edx*4] + add edx,[SfxR15] + mov dl,[edx] + mov [SfxPIPE],dl + pop edx + inc word[SfxR15] + or byte[SfxSFR],20h + or dword [SfxSFR],08000h ; Set IRQ Flag + mov dword[SFXProc],1 +; call StartSFXret + ret + +; Other SFX stuff + +NEWSYM reg3030w + mov [SfxSFR],al +; mov dh,10 + ; Disassemble Flags + test al,20h + jz .noexec + mov dword [NumberOfOpcodes],100 + call StartSFX +.noexec + ret +NEWSYM reg3031w + mov [SfxSFR+1],al + ret +NEWSYM reg3032w ; Unused + ret +NEWSYM reg3033w ; BRAMR Backup Ram Read only on/off (bits 1-15 unused) + and al,0FEh + mov [SfxBRAMR],al + ret +NEWSYM reg3034w ; PBR (Program Bank) + mov [SfxPBR],al + xor ebx,ebx + mov bl,al + mov ebx,[SfxMemTable+ebx*4] + mov [SfxCPB],ebx + ret +NEWSYM reg3035w ; Unused + ret +NEWSYM reg3036w ; ROMBR (Gamepak Rom Bank Register) + mov [SfxROMBR],al + xor ebx,ebx + mov bl,al + mov ebx,[SfxMemTable+ebx*4] + mov [SfxCROM],ebx + ret +NEWSYM reg3037w ; CFGR (Control Flags Register) + mov [SfxCFGR],al + ret +NEWSYM reg3038w ; SCBR (Screen Bank Register) + mov [SfxSCBR],al + call UpdateSCBRCOLR + ret +NEWSYM reg3039w ; CLSR (Clock Speed Register) + and al,0FEh + mov [SfxCLSR],al + call UpdateCLSR + ret +NEWSYM reg303Aw ; SCMR (Screen Mode Register) + mov [SfxSCMR],al + call UpdatePORSCMR + ret +NEWSYM reg303Bw ; VCR (Version Code Register) + ret +NEWSYM reg303Cw ; RAMBR (Ram bank register) + mov bl,[SfxnRamBanks] + dec bl + and al,bl + mov ebx,[SfxnRamBanks] + dec ebx + and eax,ebx + mov [SfxRAMBR],eax + xor ebx,ebx + mov bl,al + shl ebx,16 + add ebx,[sfxramdata] + mov dword [SfxRAMMem],ebx + ret +NEWSYM reg303Dw ; Unused + ret +NEWSYM reg303Ew ; CBR (Cache Base Register), lower byte + mov [SfxCBR],al + ret +NEWSYM reg303Fw ; CBR (Cache Base Register), upper byte + mov [SfxCBR+1],al + ret + +NEWSYM sfxaccessbankr8 + mov ebx,[sfxramdata] + mov al,[ebx+ecx] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw8 + mov ebx,[sfxramdata] + mov [ebx+ecx],al + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr16 + mov ebx,[sfxramdata] + mov ax,[ebx+ecx] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw16 + mov ebx,[sfxramdata] + mov [ebx+ecx],ax + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr8b + mov ebx,[sfxramdata] + mov al,[ebx+ecx+65536] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw8b + mov ebx,[sfxramdata] + mov [ebx+ecx+65536],al + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr16b + mov ebx,[sfxramdata] + mov ax,[ebx+ecx+65536] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw16b + mov ebx,[sfxramdata] + mov [ebx+ecx+65536],ax + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr8c + mov ebx,[sfxramdata] + mov al,[ebx+ecx+65536*2] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw8c + mov ebx,[sfxramdata] + mov [ebx+ecx+65536*2],al + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr16c + mov ebx,[sfxramdata] + mov ax,[ebx+ecx+65536*2] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw16c + mov ebx,[sfxramdata] + mov [ebx+ecx+65536*2],ax + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr8d + mov ebx,[sfxramdata] + mov al,[ebx+ecx+65536*3] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw8d + mov ebx,[sfxramdata] + mov [ebx+ecx+65536*3],al + xor ebx,ebx + ret + +NEWSYM sfxaccessbankr16d + mov ebx,[sfxramdata] + mov ax,[ebx+ecx+65536*3] + xor ebx,ebx + ret + +NEWSYM sfxaccessbankw16d + mov ebx,[sfxramdata] + mov [ebx+ecx+65536*3],ax + xor ebx,ebx + ret + +NEWSYM SfxProcAsmEnd diff --git a/src/i386/spc.asm b/src/i386/spc.asm new file mode 100644 index 0000000..199220c --- /dev/null +++ b/src/i386/spc.asm @@ -0,0 +1,520 @@ +[BITS 32] + +;Bit-Rate Expand Waveform +; +;Desc: +; Decompresses a 9-byte bit-rate reduced block into 16 16-bit samples. +; This procedure is designed to be recursively called to decompress a series of blocks. +;In: +; ESI-> Sample Block +; EDI -> Output buffer +; EDX =3D Last sample of previous block (32-bit) +; EBX =3D Next to last sample (sign extended from 16-bits) +;Out: +; ESI -> Next Block +; EDI -> After last sample +; EDX =3D Last sample (32-bit) +; EBX =3D Next to last sample (16-bit) +;Destroys: +; EAX + +%ifdef __DJGPP__ +%define DecodeBlockAsm _DecodeBlockAsm +%define DecodeBlockAsm2 _DecodeBlockAsm2 +%endif + +SECTION .text + +global DecodeBlockAsm + +DecodeBlockAsm: + push ebx + push esi + push edi + push ebp + + mov esi,dword[esp+20] + mov edi,dword[esp+24] + mov edx,dword[esp+28] + mov edx,dword[edx] + mov ebx,dword[esp+32] + mov ebx,dword[ebx] + + call BREWave + + mov eax,dword[esp+28] + mov dword[eax],edx + mov eax,dword[esp+32] + mov dword[eax],ebx + pop ebp + pop edi + pop esi + pop ebx + ret + +BREWave: +ALIGN 16 + Mov AL,[ESI] ;Get header byte + Inc ESI + Mov CL,0CFh + Sub CL,AL + SetC AH + Dec AH + And CL,AH + ShR CL,4 ;Isolate range + + Mov CH,8 ;Decompress 8 bytes (16 nybbles) + Test AL,0Ch ;Does block use ADPCM compression? + JZ Short @@Method0 ; No + + Test AL,08h ;Does block use method 1? + JZ Short @@Method1 ; Yes + + Test AL,04h ;Does block use method 2? + JZ short @@ZZZ ; Yes + + Jmp @@Method3 ;Must use method 3 + +ALIGN 16 +@@ZZZ: + jmp @@Method2 + +ALIGN 16 + ;[Smp] ---------------------------------- +@@Method0: + XOr EAX,EAX + XOr EDX,EDX + Mov AH,byte[ESI] ;Get byte + Mov DH,AH + And AH,0F0h ;AH = High nybble << 12 + ShL DH,4 ;DH = Low nybble << 12 + + SAR AX,CL ;Reduce samples according to range + SAR DX,CL + Mov word[EDI],AX + Mov word[2+EDI],DX + Add EDI,4 + + Inc ESI + + Dec CH + JNZ Short @@Method0 + MovSX EDX,DX + MovSX EBX,AX + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](15/16) ----------------- +@@Method1: + MovSX EBX,byte[ESI] ;Sign extend upper nybble into EBX + And BL,0F0h + ShL EBX,8 + SAR EBX,CL + + MovSX EAX,DX + Add EBX,EAX + SAR EAX,4 + Sub EBX,EAX + + Mov word[EDI],BX + + Mov DL,byte[ESI] + ShL EDX,12 + MovSX EDX,DX + SAR EDX,CL + + MovSX EAX,BX + Add EDX,EAX + SAR EAX,4 + Sub EDX,EAX + + Mov word[2+EDI],DX + Add EDI,4 + + Inc ESI + + Dec CH + JNZ Short @@Method1 + MovSX EBX,BX + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) -- +@@Method2: + MovSX EAX,Byte[ESI] ;EAX = Delta + + And AL,0F0h + ShL EAX,8 + SAR EAX,CL + + ;Subtract 15/16 of second sample ----- + Sub EAX,EBX + SAR EBX,4 + Add EAX,EBX + MovSX EBX,DX + + ;Add 61/32 of last sample ------------ + And DL,~3 + Add EAX,EDX + Add EAX,EDX + SAR EDX,4 + Sub EAX,EDX + SAR EDX,1 + MovSX EDX,DX + Sub EAX,EDX + + Mov word[EDI],AX + + Mov DL,byte[ESI] + + ShL EDX,12 + MovSX EDX,DX + SAR EDX,CL + + Sub EDX,EBX + SAR EBX,4 + Add EDX,EBX + MovSX EBX,AX + + And AL,~3 + Add EDX,EAX + Add EDX,EAX + SAR EAX,4 + Sub EDX,EAX + SAR EAX,1 + MovSX EAX,AX + Sub EDX,EAX + + Mov word[2+EDI],DX + Add EDI,4 + + Inc ESI + + Dec CH + JNZ @@Method2 + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) - +@@Method3: + MovSX EAX,Byte[ESI] + + And AL,0F0h + ShL EAX,8 + SAR EAX,CL + + ;Subtract 13/16 of second sample ----- + Sub EAX,EBX + SAR EBX,3 + Add EAX,EBX + SAR EBX,1 + Add EAX,EBX + MovSX EBX,DX + + ;Add 115/64 of last sample ----------- + And DL, ~3 + Add EAX,EDX + Add EAX,EDX + SAR EDX,3 + Sub EAX,EDX + SAR EDX,1 + Sub EAX,EDX + SAR EDX,2 + Sub EAX,EDX + + Mov word[EDI],AX + + Mov DL,byte[ESI] + + ShL EDX,12 + MovSX EDX,DX + SAR EDX,CL + + Sub EDX,EBX + SAR EBX,3 + Add EDX,EBX + SAR EBX,1 + Add EDX,EBX + MovSX EBX,AX + + And AL, ~3 + Add EDX,EAX + Add EDX,EAX + SAR EAX,3 + Sub EDX,EAX + SAR EAX,1 + Sub EDX,EAX + SAR EAX,2 + Sub EDX,EAX + + Mov word[2+EDI],DX + Add EDI,4 + + Inc ESI + + Dec CH + JNZ @@Method3 + Ret + +global DecodeBlockAsm2 + +DecodeBlockAsm2: + push ebx + push esi + push edi + push ebp + + mov esi,dword[esp+20] + mov edi,dword[esp+24] + mov edx,dword[esp+28] + mov edx,dword[edx] + mov ebx,dword[esp+32] + mov ebx,dword[ebx] + + call BREWave2 + + mov eax,dword[esp+28] + mov dword[eax],edx + mov eax,dword[esp+32] + mov dword[eax],ebx + pop ebp + pop edi + pop esi + pop ebx + ret + +ALIGN 16 +BREWave2: + + Push CX + + Mov AL,byte [esi] ;Get header byte + Inc esi + Mov CL,0CFh + Sub CL,AL ;Invert range + ShR CL,4 ;Isolate range + + Mov CH,8 ;Decompress 8 bytes (16 nybbles) + Test AL,0Ch ;Does block use ADPCM compression? + JZ @@Method02 ; No + + Test AL,8 ;Does block use method 1? + JZ @@Method12 ; Yes + + Test AL,4 ;Does block use method 2? + jnz @@Method332 ; Yes + jmp @@Method22 + +@@Method332: + Jmp @@Method32 ;Must use method 3 + +ALIGN 16 + ;[Smp] ---------------------------------- +@@Method02: + shr al, 4 + mov cl, al + cmp cl, 12 + jbe @@Method022 + sub cl, 4 +@@Method022: + XOr AX,AX + XOr DX,DX + Mov al,byte [esi] ;Get byte + mov dl, al + sar al, 4 + sal dl, 4 + sar dl, 4 + movsx eax, al + movsx edx, dl + sal eax,cl ;Reduce samples according to range + sal edx,cl + + call SMP12CLIP16 + + Mov [edi],AX + Mov [2+edi],DX + Add edi,4 + + Inc esi + + Dec CH + JNZ @@Method022 + Pop CX + MovSX EDX,DX + MovSX EBX,AX + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](15/16) ----------------- +@@Method12: + MovSX EBX,byte [esi] ;Sign extend upper nybble into EBX + And BL,0F0h + ShL BX,8 + SAR BX,CL + + MovSX EAX,DX + Add EBX,EAX + SAR EAX,4 + Sub EBX,EAX + + Mov [edi],BX + + Mov DL,byte [esi] + ShL DX,12 + SAR DX,CL + MovSX EDX,DX + + MovSX EAX,BX + Add EDX,EAX + SAR EAX,4 + Sub EDX,EAX + + Mov [2+edi],DX + Add edi,4 + + Inc esi + + Dec CH + JNZ @@Method12 + Pop CX + MovSX EBX,BX + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) -- +@@Method22: + MovSX EAX,byte [esi] ;EAX =3D Delta + And AL,0F0h + ShL AX,8 + SAR AX,CL + + ;Subtract 15/16 of second sample ----- + Sub EAX,EBX + SAR EBX,4 + Add EAX,EBX + MovSX EBX,DX ;Truncate lower 16-bits + + ;Add 61/32 of last sample ------------ + And DL,~3 ;(Lose lower 2-bits of precision) + Add EAX,EDX + Add EAX,EDX + SAR EDX,5 + Sub EAX,EDX + ShL EDX,1 + MovSX EDX,DX + Sub EAX,EDX + + Mov [edi],AX + + Mov DL,byte [esi] + ShL DX,12 + SAR DX,CL + MovSX EDX,DX + + Sub EDX,EBX + SAR EBX,4 + Add EDX,EBX + MovSX EBX,AX + + And AL,~3 + Add EDX,EAX + Add EDX,EAX + SAR EAX,5 + Sub EDX,EAX + ShL EAX,1 + MovSX EAX,AX + Sub EDX,EAX + + Mov [2+edi],DX + Add edi,4 + + Inc esi + + Dec CH + JNZ @@Method22 + Pop CX + Ret + +ALIGN 16 + ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) - +@@Method32: + MovSX EAX,byte [esi] + And AL,0F0h + ShL AX,8 + SAR AX,CL + + ;Subtract 13/16 of second sample ----- + Sub EAX,EBX + SAR EBX,3 + Add EAX,EBX + SAR EBX,1 + Add EAX,EBX + MovSX EBX,DX + + ;Add 115/64 of last sample ----------- +; And DL,~3 + Add EAX,EDX + Add EAX,EDX + SAR EDX,3 + Sub EAX,EDX + SAR EDX,1 + Sub EAX,EDX + SAR EDX,2 + Sub EAX,EDX + + Mov [edi],AX + + Mov DL, [esi] + ShL DX,12 + SAR DX,CL + MovSX EDX,DX + + Sub EDX,EBX + SAR EBX,3 + Add EDX,EBX + SAR EBX,1 + Add EDX,EBX + MovSX EBX,AX + +; And AL,~3 + Add EDX,EAX + Add EDX,EAX + SAR EAX,3 + Sub EDX,EAX + SAR EAX,1 + Sub EDX,EAX + SAR EAX,2 + Sub EDX,EAX + + Mov [2+edi],DX + Add edi,4 + + Inc esi + + Dec CH + JNZ @@Method32 + Pop CX + Ret + +SMP12CLIP16: + cmp eax, -32768 + jg CLIP16SMP1SKIP0 + je CLIP16SMP1SKIP1 + mov eax, -32768 + jmp CLIP16SMP1SKIP1 +CLIP16SMP1SKIP0: + cmp eax, 32767 + jle CLIP16SMP1SKIP1 + mov eax, 32767 +CLIP16SMP1SKIP1: + cmp edx, -32768 + jg CLIP16SMP2SKIP0 + je CLIP16SMP2SKIP1 + mov edx, -32768 + jmp CLIP16SMP2SKIP1 +CLIP16SMP2SKIP0: + cmp edx, 32767 + jle CLIP16SMP2SKIP1 + mov edx, 32767 +CLIP16SMP2SKIP1: + ret diff --git a/src/i386/spc700.S b/src/i386/spc700.S new file mode 100644 index 0000000..ece28f3 --- /dev/null +++ b/src/i386/spc700.S @@ -0,0 +1,7485 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + S-DD1 decompression code + (c) Copyright 2003 Jose Luis Bravo + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "asmstruc.h" +#include "spcops.h" + +.section .rodata +.LC2: + .string "Sound CPU in unknown state executing %s at %04X\n%s\n" +.text + +STOP: + subl $100,%esp + pushl %esi + pushl %ebx + movl APUPC,%edx + movl APURAM,%eax + subl %eax,%edx + movl %edx,%eax + andl $65535,%eax + movl 112(%esp),%esi + pushl %eax + leal 12(%esp),%ebx + pushl %ebx +#ifdef DEBUGGER + call S9xAPUOPrint +#endif + pushl %ebx + movl APUPC,%edx + movl APURAM,%eax + subl %eax,%edx + movl %edx,%eax + pushl %eax + pushl %esi + pushl $.LC2 + pushl $String + call sprintf + pushl $String + pushl $5 + pushl $4 + call S9xMessage + xorl %edx,%edx + movl CPU,%ecx + addl $40,%esp + movb %dl,APUTimerEnabled+2 + movb %dl,APUTimerEnabled+1 + popl %ebx + movb %dl,APUTimerEnabled + orl $1,%ecx + popl %esi + movb %dl,APUExecuting + movl %ecx,CPU + addl $100,%esp + ret + +ApuOp00: + movl APUPC,%eax + incl %eax + movl %eax,APUPC + ret + +ApuOp01: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb ApuS,%dl + addb $-2,%dl + movb APUExtraRAM+31,%al + movb %dl,ApuS + andl $255,%eax + movb APUExtraRAM+30,%dl + sall $8,%eax + andl $255,%edx + movl APURAM,%ecx + addl %eax,%edx + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp11: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+29,%al + movb APUExtraRAM+28,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp21: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+27,%al + movb APUExtraRAM+26,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp31: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+25,%al + movb APUExtraRAM+24,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp41: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+23,%al + movb APUExtraRAM+22,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp51: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+21,%al + movb APUExtraRAM+20,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp61: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+19,%al + movb APUExtraRAM+18,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp71: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+17,%al + movb APUExtraRAM+16,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp81: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+15,%al + movb APUExtraRAM+14,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp91: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+13,%al + movb APUExtraRAM+12,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpA1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+11,%al + movb APUExtraRAM+10,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpB1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+9,%al + movb APUExtraRAM+8,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpC1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+7,%al + movb APUExtraRAM+6,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpD1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+5,%al + movb APUExtraRAM+4,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpE1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+3,%al + movb APUExtraRAM+2,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOpF1: + pushl %ebx + movl APURAM,%edx + movl APUPC,%ebx + movl %edx,%eax + subl %eax,%ebx + movb ApuS,%cl + movl %ebx,%eax + andl $255,%ecx + incl %eax + movw %ax,255(%edx,%ecx) + movb APUExtraRAM+1,%al + movb APUExtraRAM+0,%dl + andl $255,%eax + movb ApuS,%bl + andl $255,%edx + sall $8,%eax + movl APURAM,%ecx + addb $-2,%bl + addl %eax,%edx + movb %bl,ApuS + addl %ecx,%edx + popl %ebx + movl %edx,APUPC + ret + +ApuOp3F: + pushl %ebx + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl APURAM,%edx + movl %eax,APUAddress + movl %edx,%eax + movb ApuS,%cl + movl APUPC,%ebx + addl $-3,%eax + andl $255,%ecx + subl %eax,%ebx + movw %bx,255(%edx,%ecx) + movb ApuS,%bl + movl APUAddress,%eax + movl APURAM,%edx + addb $-2,%bl + addl %edx,%eax + movb %bl,ApuS + movl %eax,APUPC + popl %ebx + ret + +ApuOp4F: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%cl + movl APURAM,%edx + movb %cl,Work8 + movl %edx,%eax + movl APUPC,%ebx + movb ApuS,%cl + addl $-2,%eax + andl $255,%ecx + subl %eax,%ebx + movw %bx,255(%edx,%ecx) + movb Work8,%al + movb ApuS,%bl + andl $255,%eax + movl APURAM,%edx + addb $-2,%bl + addl $65280,%eax + movb %bl,ApuS + addl %edx,%eax + popl %ebx + movl %eax,APUPC + ret + +ApuOp02: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $1,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret + +ApuOp22: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $2,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp42: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $4,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp62: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $8,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp82: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $16,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpA2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $32,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpC2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $64,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpE2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb $128,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp12: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $254,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp32: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $253,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp52: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $251,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp72: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $247,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp92: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $239,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpB2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $223,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpD2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $191,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOpF2: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $127,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret + +ApuOp03: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $1,%al + je .L292 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L292: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp23: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $2,%al + je .L300 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L300: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp43: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $4,%al + je .L308 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L308: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp63: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $8,%al + je .L316 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L316: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp83: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $16,%al + je .L324 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L324: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpA3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $32,%al + je .L332 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L332: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpC3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $64,%al + je .L340 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L340: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpE3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb %al,%al + jge .L348 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L348: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp13: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $1,%al + jne .L356 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L356: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp33: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $2,%al + jne .L364 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L364: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp53: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $4,%al + jne .L372 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L372: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp73: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $8,%al + jne .L380 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L380: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp93: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $16,%al + jne .L388 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L388: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpB3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $32,%al + jne .L396 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L396: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpD3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb $64,%al + jne .L404 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L404: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOpF3: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + testb %al,%al + jl .L412 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L412: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp04: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + orb %cl,%al + addl $4,%esp + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret + +ApuOp05: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%cl + movl APUPC,%edx + orb %cl,%al + addl $4,%esp + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret + +ApuOp06: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + orb %cl,%al + addl $4,%esp + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret + +ApuOp07: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + orb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret + +ApuOp08: + movl APUPC,%edx + movb ApuA,%al + movb 1(%edx),%cl + addl $2,%edx + orb %cl,%al + movl %edx,APUPC + movb %al,ApuA + movb %al,APU_Zero + ret + +ApuOp09: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + orb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $16,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret + +ApuOp14: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movl APUPC,%ecx + orb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret + +ApuOp15: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + orb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret + +ApuOp16: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + orb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret + +ApuOp17: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + orb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret + +ApuOp18: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + orb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $12,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret + +ApuOp19: + pushl %ebx + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + orb %bl,%al + movb %al,Work8 + movb %al,APU_Zero + movb ApuX,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $16,%esp + incl %ecx + popl %ebx + movl %ecx,APUPC + ret + +ApuOp0A: + movb APU_Carry,%dl + testb %dl,%dl + jnz .L468 + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %al,%dl + movb APUBit,%al + andl $255,%eax + addl $4,%esp + btl %eax,%edx + jnc .L468 + movb $1,APU_Carry +.L468: + addl $3,APUPC + ret + +ApuOp2A: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + movb APU_Carry,%dl + testb %dl,%dl + jne .L476 + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %al,%dl + movb APUBit,%al + andl $255,%eax + addl $4,%esp + btl %eax,%edx + jc .L476 + movl $1,%ecx + movb %cl,APU_Carry +.L476: + movl APUPC,%eax + addl $3,%eax + movl %eax,APUPC + ret + +ApuOp4A: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + movb APU_Carry,%dl + testb %dl,%dl + je .L484 + pushl %eax + call S9xAPUGetByte__FUl + movb APUBit,%cl + andl $255,%eax + andl $255,%ecx + sarl %cl,%eax + andl $1,%eax + addl $4,%esp + testl %eax,%eax + jne .L484 + movb %al,APU_Carry +.L484: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret + +ApuOp6A: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + movb APU_Carry,%dl + testb %dl,%dl + je .L492 + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %al,%dl + movb APUBit,%al + andl $255,%eax + addl $4,%esp + btl %eax,%edx + jnc .L492 + xorl %ecx,%ecx + movb %cl,APU_Carry +.L492: + movl APUPC,%eax + addl $3,%eax + movl %eax,APUPC + ret + +ApuOp8A: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + movb APU_Carry,%dl + testb %dl,%dl + je .L502 + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %al,%dl + movb APUBit,%al + andl $255,%eax + addl $4,%esp + btl %eax,%edx + jnc .L504 + xorl %ecx,%ecx + movb %cl,APU_Carry + jmp .L504 +.L502: + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %al,%dl + movb APUBit,%al + andl $255,%eax + addl $4,%esp + btl %eax,%edx + jnc .L504 + movl $1,%eax + movb %al,APU_Carry +.L504: + movl APUPC,%edx + addl $3,%edx + movl %edx,APUPC + ret + +ApuOpAA: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb APUBit,%cl + andl $255,%eax + andl $255,%ecx + sarl %cl,%eax + andl $1,%eax + addl $4,%esp + testb %al,%al + je .L512 + movl $1,%ecx + movb %cl,APU_Carry + jmp .L513 +.L512: + movb %al,APU_Carry +.L513: + movl APUPC,%eax + addl $3,%eax + movl %eax,APUPC + ret + +ApuOpCA: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,%edx + movl %eax,APUAddress + shrl $13,%edx + andl $8191,%eax + movb %dl,APUBit + movl %eax,APUAddress + movb APU_Carry,%dl + testb %dl,%dl + je .L520 + pushl %eax + pushl %eax + call S9xAPUGetByte__FUl + movb APUBit,%cl + movb %al,%dl + movl $1,%eax + andl $255,%ecx + sall %cl,%eax + orb %dl,%al + jmp .L523 +.L520: + pushl %eax + pushl %eax + call S9xAPUGetByte__FUl + movb APUBit,%cl + movb %al,%dl + movl $-2,%eax + andl $255,%ecx + roll %cl,%eax + andb %dl,%al +.L523: + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + addl $8,%esp + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret +ApuOpEA: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + movl %eax,%edx + andl $8191,%eax + shrl $13,%edx + pushl %eax + movb %dl,APUBit + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb APUBit,%cl + movb %al,%dl + movl $1,%eax + andl $255,%ecx + sall %cl,%eax + xorb %dl,%al + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%eax + addl $3,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOp0B: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb %al,%dl + addb %al,%al + shrb $7,%dl + movb %al,Work8 + movb %al,APU_Zero + movb %dl,APU_Carry + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $12,%esp + movl %eax,APUPC + ret +ApuOp0C: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb %al,Work8 + shrb $7,%dl + addb %al,%al + movb %dl,APU_Carry + movb %al,Work8 + movb %al,APU_Zero + movl APUAddress,%edx + andl $255,%eax + pushl %edx + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%ecx + addl $3,%ecx + addl $12,%esp + movl %ecx,APUPC + ret +ApuOp1B: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb %al,%cl + addb %al,%al + movl APUPC,%edx + shrb $7,%cl + movb %al,Work8 + movb %al,APU_Zero + movb %cl,APU_Carry + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $12,%esp + movl %eax,APUPC + ret +ApuOp1C: + movb ApuA,%al + movb %al,%dl + shrb $7,%dl + movb %dl,APU_Carry + movl APUPC,%edx + addb %al,%al + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp0D: + pushl %edi + pushl %esi + pushl %ebx + movb ApuP,%cl + movb APU_Zero,%dl + andb $60,%cl + movb %dl,%bl + movb %cl,ApuP + movzbl APU_Overflow,%esi + andb $128,%bl + movzbl APU_Carry,%edi + sall $6,%esi + andl $255,%ebx + andl $255,%ecx + testb %dl,%dl + jne .L552 + movl %ebx,%eax + orb $2,%al + orl %edi,%eax + jmp .L556 +.L552: + movl %edi,%eax + orl %ebx,%eax +.L556: + orl %esi,%eax + orl %ecx,%eax + movb ApuS,%cl + movl APURAM,%edx + movb %al,ApuP + andl $255,%ecx + movb %al,256(%edx,%ecx) + movb ApuS,%cl + movl APUPC,%eax + popl %ebx + decb %cl + incl %eax + popl %esi + movb %cl,ApuS + movl %eax,APUPC + popl %edi + ret +ApuOp2D: + movb ApuS,%cl + movl APURAM,%edx + movb ApuA,%al + andl $255,%ecx + movb %al,256(%edx,%ecx) + movb ApuS,%dl + movl APUPC,%ecx + decb %dl + incl %ecx + movb %dl,ApuS + movl %ecx,APUPC + ret +ApuOp4D: + movb ApuS,%cl + movl APURAM,%edx + movb ApuX,%al + andl $255,%ecx + movb %al,256(%edx,%ecx) + movb ApuS,%al + movl APUPC,%edx + decb %al + incl %edx + movb %al,ApuS + movl %edx,APUPC + ret +ApuOp6D: + movb ApuS,%cl + movl APURAM,%edx + movb ApuY,%al + andl $255,%ecx + movb %al,256(%edx,%ecx) + movb ApuS,%cl + movl APUPC,%eax + decb %cl + incl %eax + movb %cl,ApuS + movl %eax,APUPC + ret +ApuOp8E: + pushl %esi + pushl %ebx + movb ApuS,%dl + incb %dl + xorl %eax,%eax + movl APURAM,%ebx + movb %dl,%al + movb %dl,ApuS + movb 256(%ebx,%eax),%dl + movb %dl,%al + shrb $1,%al + movb %dl,%cl + notl %eax + andb $128,%cl + andl $1,%eax + movl %ecx,%esi + orb %al,%cl + movb %cl,APU_Zero + movb %dl,%al + movb %dl,%cl + andb $64,%al + andb $1,%cl + shrb $6,%al + movb %dl,ApuP + movb %cl,APU_Carry + movb %al,APU_Overflow + testb $32,%dl + je .L578 + addl $256,%ebx +.L578: + movl %ebx,APUDirectPage + movl APUPC,%ecx + popl %ebx + incl %ecx + popl %esi + movl %ecx,APUPC + ret +ApuOpAE: + movb ApuS,%dl + incb %dl + xorl %eax,%eax + movb %dl,ApuS + movb %dl,%al + movl APURAM,%ecx + movl APUPC,%edx + movb 256(%ecx,%eax),%al + incl %edx + movb %al,ApuA + movl %edx,APUPC + ret +ApuOpCE: + movb ApuS,%cl + incb %cl + xorl %eax,%eax + movl APURAM,%edx + movb %cl,ApuS + movb %cl,%al + movb 256(%edx,%eax),%al + movl APUPC,%edx + incl %edx + movb %al,ApuX + movl %edx,APUPC + ret +ApuOpEE: + movb ApuS,%cl + incb %cl + xorl %eax,%eax + movl APURAM,%edx + movb %cl,ApuS + movb %cl,%al + movb 256(%edx,%eax),%al + movl APUPC,%edx + incl %edx + movb %al,ApuY + movl %edx,APUPC + ret +ApuOp0E: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUAddress,%ecx + movb %al,%dl + pushl %ecx + movb ApuA,%cl + orb %cl,%al + andl $255,%eax + movb %dl,Work8 + pushl %eax + call S9xAPUSetByte__FUcUl + movb Work8,%al + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $12,%esp + addl $3,%ecx + movb %al,Work8 + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp4E: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUAddress,%ecx + pushl %ecx + movb %al,%dl + movb ApuA,%al + notb %al + andb %dl,%al + andl $255,%eax + movb %dl,Work8 + pushl %eax + call S9xAPUSetByte__FUcUl + movb Work8,%al + movb ApuA,%cl + movl APUPC,%edx + andb %cl,%al + addl $12,%esp + addl $3,%edx + movb %al,Work8 + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp0F: + pushl %ebp + pushl %edi + pushl %esi + pushl %ebx + movl APURAM,%edx + movl %edx,%eax + movb ApuS,%cl + movl APUPC,%ebx + decl %eax + andl $255,%ecx + subl %eax,%ebx + movw %bx,255(%edx,%ecx) + movb ApuS,%al + addb $-2,%al + movb APU_Zero,%dl + movb %al,ApuS + movb %dl,%al + movb ApuP,%cl + movzbl APU_Carry,%edi + andb $128,%al + andb $60,%cl + movzbl APU_Overflow,%esi + movl %eax,%ebp + movb %cl,ApuP + sall $6,%esi + andl $255,%ebp + andl $255,%ecx + testb %dl,%dl + jne .L603 + movl %ebp,%eax + orb $2,%al + orl %edi,%eax + jmp .L607 +.L603: + movl %edi,%eax + orl %ebp,%eax +.L607: + orl %esi,%eax + orl %ecx,%eax + movb ApuS,%cl + movl APURAM,%edx + movb %al,ApuP + andl $255,%ecx + movb %al,256(%edx,%ecx) + movb ApuP,%al + movb ApuS,%dl + orb $16,%al + decb %dl + andb $251,%al + movb %dl,ApuS + movb %al,ApuP + movl APURAM,%ecx + movb APUExtraRAM+0x20,%dl + movb APUExtraRAM+0x21,%al + popl %ebx + andl $255,%edx + andl $255,%eax + popl %esi + addl %ecx,%edx + sall $8,%eax + popl %edi + addl %eax,%edx + popl %ebp + movl %edx,APUPC + ret +ApuOpEF: + movl APUPC,%edx + xorl %eax,%eax + incl %edx + movb %al,APUExecuting + movl %edx,APUPC + ret +ApuOpFF: + movl APUPC,%eax + xorl %ecx,%ecx + incl %eax + movb %cl,APUExecuting + movl %eax,APUPC + ret +ApuOp10: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Zero,%al + testb %al,%al + jl .L617 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + testb $0xff,Shutdown + jz .L627 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L619 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L627 +.L619: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L620 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L621 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L621: + movb %al,APUExecuting + ret +.L620: + cmpl $1,%eax + jbe .L624 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L624: + decl %eax + movl %eax,APUWaitCounter + ret +.L617: + addl $2,%ecx + movl %ecx,APUPC +.L627: + ret +ApuOp30: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Zero,%al + testb %al,%al + jge .L629 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L639 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L631 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L639 +.L631: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L632 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L633 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L633: + movb %al,APUExecuting + ret +.L632: + cmpl $1,%eax + jbe .L636 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L636: + decl %eax + movl %eax,APUWaitCounter + ret +.L629: + addl $2,%ecx + movl %ecx,APUPC +.L639: + ret +ApuOp90: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Carry,%al + testb %al,%al + jne .L641 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L651 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L643 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L651 +.L643: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L644 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L645 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L645: + movb %al,APUExecuting + ret +.L644: + cmpl $1,%eax + jbe .L648 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L648: + decl %eax + movl %eax,APUWaitCounter + ret +.L641: + addl $2,%ecx + movl %ecx,APUPC +.L651: + ret +ApuOpB0: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Carry,%al + testb %al,%al + je .L653 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L663 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L655 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L663 +.L655: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L656 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L657 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L657: + movb %al,APUExecuting + ret +.L656: + cmpl $1,%eax + jbe .L660 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L660: + decl %eax + movl %eax,APUWaitCounter + ret +.L653: + addl $2,%ecx + movl %ecx,APUPC +.L663: + ret +ApuOpD0: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Zero,%al + testb %al,%al + je .L665 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L675 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L667 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L675 +.L667: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L668 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L669 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L669: + movb %al,APUExecuting + ret +.L668: + cmpl $1,%eax + jbe .L672 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L672: + decl %eax + movl %eax,APUWaitCounter + ret +.L665: + addl $2,%ecx + movl %ecx,APUPC +.L675: + ret +ApuOpF0: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Zero,%al + testb %al,%al + jne .L677 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L687 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L679 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L687 +.L679: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L680 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L681 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L681: + movb %al,APUExecuting + ret +.L680: + cmpl $1,%eax + jbe .L684 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L684: + decl %eax + movl %eax,APUWaitCounter + ret +.L677: + addl $2,%ecx + movl %ecx,APUPC +.L687: + ret +ApuOp50: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Overflow,%al + testb %al,%al + jne .L693 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + ret +.L693: + addl $2,%ecx + movl %ecx,APUPC + ret +ApuOp70: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movw %dx,Int16 + movb APU_Overflow,%al + testb %al,%al + je .L701 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + ret +.L701: + addl $2,%ecx + movl %ecx,APUPC + ret +ApuOp2F: + movl APUPC,%eax + movb 1(%eax),%dl + addl $2,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + movl APURAM,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUPC + ret +ApuOp80: + movl APUPC,%eax + movl $1,%ecx + incl %eax + movb %cl,APU_Carry + movl %eax,APUPC + ret +ApuOpED: + movb APU_Carry,%dl + movl APUPC,%ecx + xorb $1,%dl + incl %ecx + movb %dl,APU_Carry + movl %ecx,APUPC + ret +ApuOp40: + movb ApuP,%dl + movl APURAM,%eax + movl APUPC,%ecx + orb $32,%dl + addl $256,%eax + incl %ecx + movb %dl,ApuP + movl %eax,APUDirectPage + movl %ecx,APUPC + ret +ApuOp1A: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + xorl %eax,%eax + movb %bl,%al + salw $8,%dx + addl %edx,%eax + decl %eax + movl APUPC,%edx + movw %ax,Work16 + movb 1(%edx),%al + andl $255,%eax + pushl %eax + movb Work16,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + movb Work16+1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work16+1,%al + addl $24,%esp + andl $255,%eax + cmpw $0,Work16 + je .L724 + orb $1,%al +.L724: + movl APUPC,%edx + addl $2,%edx + movb %al,APU_Zero + popl %ebx + movl %edx,APUPC + ret +ApuOp5A: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + xorl %edx,%edx + movb %bl,%dl + salw $8,%ax + addl %eax,%edx + movw %dx,Work16 + xorl %eax,%eax + movw ApuA,%ax + andl $65535,%edx + subl %edx,%eax + movl %eax,Int32 + notl %eax + shrl $31,%eax + movb %al,APU_Carry + movb Int32+1,%al + addl $8,%esp + andl $255,%eax + cmpw $0,Int32 + je .L730 + orb $1,%al +.L730: + movl APUPC,%ecx + addl $2,%ecx + movb %al,APU_Zero + popl %ebx + movl %ecx,APUPC + ret +ApuOp3A: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + xorl %eax,%eax + movb %bl,%al + salw $8,%dx + addl %edx,%eax + incl %eax + movl APUPC,%edx + movw %ax,Work16 + movb 1(%edx),%al + andl $255,%eax + pushl %eax + movb Work16,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + movb Work16+1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work16+1,%al + addl $24,%esp + andl $255,%eax + cmpw $0,Work16 + je .L736 + orb $1,%al +.L736: + movl APUPC,%edx + addl $2,%edx + movb %al,APU_Zero + popl %ebx + movl %edx,APUPC + ret +ApuOp7A: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + xorl %edx,%edx + movb %bl,%dl + salw $8,%ax + xorl %ecx,%ecx + addl %eax,%edx + movw ApuA,%cx + xorl %eax,%eax + movw %dx,%ax + addl %eax,%ecx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpl $65535,%ecx + seta %al + movb %al,APU_Carry + movw ApuA,%ax + movw %dx,Work16 + xorl %edx,%eax + xorl %ecx,%edx + notw %ax + andl %edx,%eax + addl $8,%esp + movl %ecx,Work32 + andl $-32768,%eax + testw %ax,%ax + je .L739 + movl $1,%edx + movb %dl,APU_Overflow + jmp .L740 +.L739: + movb %al,APU_Overflow +.L740: + movw Work32,%ax + movl %eax,%edx + shrw $8,%dx + movw %ax,ApuA + andl $65535,%edx + testw %ax,%ax + je .L741 + orl $1,%edx +.L741: + movl APUPC,%ecx + addl $2,%ecx + movb %dl,APU_Zero + popl %ebx + movl %ecx,APUPC + ret +ApuOp9A: + pushl %ebx + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + xorl %ecx,%ecx + movb %bl,%cl + salw $8,%ax + xorl %edx,%edx + addl %eax,%ecx + xorl %eax,%eax + movw ApuA,%ax + movw %cx,%dx + subl %edx,%eax + movb ApuP,%dl + movl %eax,Int32 + andb $247,%dl + notl %eax + movb %dl,ApuP + shrl $31,%eax + movw ApuA,%dx + movb %al,APU_Carry + movl %edx,%eax + movw %cx,Work16 + xorl %ecx,%eax + addl $8,%esp + testw %ax,%ax + jge .L744 + movl %edx,%eax + xorw Int32,%ax + jns .L744 + movl $1,%ecx + movb %cl,APU_Overflow + jmp .L745 +.L744: + xorl %eax,%eax + movb %al,APU_Overflow +.L745: + movb ApuA,%dl + movb Work16,%cl + movb %dl,%al + xorb %cl,%al + jns .L746 + movb %dl,%al + movb Int32,%cl + xorb %cl,%al + jns .L746 + movb ApuP,%al + orb $8,%al + movb %al,ApuP +.L746: + movw Int32,%ax + movl %eax,%edx + shrw $8,%dx + movw %ax,ApuA + andl $65535,%edx + testw %ax,%ax + je .L747 + orl $1,%edx +.L747: + movl APUPC,%ecx + addl $2,%ecx + movb %dl,APU_Zero + popl %ebx + movl %ecx,APUPC + ret +ApuOpBA: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,ApuA + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,ApuY + addl $8,%esp + andl $255,%eax + cmpw $0,ApuA + je .L753 + orb $1,%al +.L753: + movl APUPC,%edx + addl $2,%edx + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOpDA: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + movb 1(%eax),%al + incb %al + andl $255,%eax + pushl %eax + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $16,%esp + movl %ecx,APUPC + ret +ApuOp64: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + movl APUPC,%eax + movb Int16,%cl + addl $2,%eax + addl $4,%esp + movb %cl,APU_Zero + movl %eax,APUPC + ret +ApuOp65: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $3,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp66: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movl APUPC,%edx + movb %al,APU_Carry + incl %edx + movb Int16,%al + addl $4,%esp + movl %edx,APUPC + movb %al,APU_Zero + ret +ApuOp67: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $2,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp68: + movl APUPC,%ecx + movb 1(%ecx),%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + addl $2,%ecx + movb Int16,%al + movl %ecx,APUPC + movb %al,APU_Zero + ret +ApuOp69: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,W1 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb W1,%dl + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movl APUPC,%edx + movb %al,APU_Carry + addl $3,%edx + movb Int16,%al + addl $8,%esp + movl %edx,APUPC + movb %al,APU_Zero + ret +ApuOp74: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $2,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp75: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movl APUPC,%edx + movb %al,APU_Carry + addl $3,%edx + movb Int16,%al + addl $4,%esp + movl %edx,APUPC + movb %al,APU_Zero + ret +ApuOp76: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + movl APUPC,%eax + movb Int16,%cl + addl $3,%eax + addl $4,%esp + movb %cl,APU_Zero + movl %eax,APUPC + ret +ApuOp77: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuA,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $2,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp78: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,W1 + movb Work8,%dl + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movl APUPC,%edx + movb %al,APU_Carry + addl $3,%edx + movb Int16,%al + addl $4,%esp + movl %edx,APUPC + movb %al,APU_Zero + ret +ApuOp79: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,W1 + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb W1,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + movl APUPC,%eax + movb Int16,%cl + incl %eax + addl $8,%esp + movb %cl,APU_Zero + movl %eax,APUPC + ret +ApuOp1E: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuX,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $3,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp3E: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb ApuX,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + movl APUPC,%eax + movb Int16,%cl + addl $2,%eax + addl $4,%esp + movb %cl,APU_Zero + movl %eax,APUPC + ret +ApuOpC8: + movl APUPC,%ecx + movb ApuX,%al + movb 1(%ecx),%dl + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + addl $2,%ecx + movb Int16,%al + movl %ecx,APUPC + movb %al,APU_Zero + ret +ApuOp5E: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb ApuY,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + movl APUPC,%ecx + addl $4,%esp + notw %ax + addl $3,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp7E: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%dl + movb ApuY,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + shrw $15,%ax + movb %al,APU_Carry + movl APUPC,%eax + movb Int16,%cl + addl $2,%eax + addl $4,%esp + movb %cl,APU_Zero + movl %eax,APUPC + ret +ApuOpAD: + movl APUPC,%ecx + movb 1(%ecx),%dl + movb ApuY,%al + movb %dl,Work8 + andl $255,%eax + andl $255,%edx + subl %edx,%eax + movw %ax,Int16 + notw %ax + addl $2,%ecx + movb Int16,%dl + shrw $15,%ax + movl %ecx,APUPC + movb %dl,APU_Zero + movb %al,APU_Carry + ret +ApuOp1F: + pushl %ebx + movl APUPC,%eax + movw 1(%eax),%ax + movb ApuX,%dl + andl $65535,%eax + andl $255,%edx + movl %eax,APUAddress + addl %edx,%eax + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%bl + movb ApuX,%al + movl APUAddress,%ecx + andl $255,%eax + addl %ecx,%eax + incl %eax + pushl %eax + call S9xAPUGetByte__FUl + xorl %edx,%edx + movb %bl,%dl + movl APURAM,%ecx + andl $255,%eax + addl %ecx,%edx + sall $8,%eax + addl $8,%esp + addl %eax,%edx + popl %ebx + movl %edx,APUPC + ret +ApuOp5F: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl APURAM,%edx + movl %eax,APUAddress + addl %edx,%eax + movl %eax,APUPC + ret +ApuOp20: + movb ApuP,%cl + movl APUPC,%edx + movl APURAM,%eax + andb $223,%cl + incl %edx + movl %eax,APUDirectPage + movb %cl,ApuP + movl %edx,APUPC + ret +ApuOp60: + movl APUPC,%eax + xorl %ecx,%ecx + incl %eax + movb %cl,APU_Carry + movl %eax,APUPC + ret +ApuOpE0: + movb ApuP,%dl + movl APUPC,%eax + xorl %ecx,%ecx + andb $247,%dl + incl %eax + movb %cl,APU_Overflow + movb %dl,ApuP + movl %eax,APUPC + ret +ApuOp24: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + andb %cl,%al + addl $4,%esp + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp25: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%cl + movl APUPC,%edx + andb %cl,%al + addl $4,%esp + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp26: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + andb %cl,%al + addl $4,%esp + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp27: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp28: + movl APUPC,%edx + movb ApuA,%al + movb 1(%edx),%cl + addl $2,%edx + andb %cl,%al + movl %edx,APUPC + movb %al,ApuA + movb %al,APU_Zero + ret +ApuOp29: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + andb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $16,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp34: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp35: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp36: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp37: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + andb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp38: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + andb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $12,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp39: + pushl %ebx + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + andb %bl,%al + movb %al,Work8 + movb %al,APU_Zero + movb ApuX,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $16,%esp + incl %ecx + popl %ebx + movl %ecx,APUPC + ret +ApuOp2B: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb APU_Carry,%dl + andl $255,%eax + andl $255,%edx + addw %ax,%ax + orl %edx,%eax + movw %ax,Work16 + cmpw $255,%ax + seta %al + movb %al,APU_Carry + movb Work16,%al + movl APUPC,%ecx + movb %al,Work8 + movb %al,APU_Zero + movb 1(%ecx),%al + addl $4,%esp + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOp2C: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,Work8 + movb APU_Carry,%dl + andl $255,%eax + andl $255,%edx + addw %ax,%ax + orl %edx,%eax + movw %ax,Work16 + cmpw $255,%ax + seta %al + movb %al,APU_Carry + movb Work16,%al + movb %al,Work8 + movb %al,APU_Zero + addl $4,%esp + movl APUAddress,%edx + movb Work8,%al + pushl %edx + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOp3B: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb APU_Carry,%dl + andl $255,%eax + andl $255,%edx + addw %ax,%ax + orl %edx,%eax + movw %ax,Work16 + cmpw $255,%ax + seta %al + movb %al,APU_Carry + movb Work16,%al + movb %al,Work8 + movb %al,APU_Zero + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + addl $4,%esp + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOp3C: + movb ApuA,%al + movb APU_Carry,%dl + andl $255,%eax + andl $255,%edx + addw %ax,%ax + orl %edx,%eax + movw %ax,Work16 + cmpw $255,%ax + seta %al + movl APUPC,%edx + movb %al,APU_Carry + incl %edx + movb Work16,%al + movl %edx,APUPC + movb %al,ApuA + movb %al,APU_Zero + ret +ApuOp2E: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + movb ApuA,%cl + cmpb %cl,%al + je .L916 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + movb Shutdown,%cl + testb %cl,%cl + je .L926 + movl APUWaitAddress1,%edx + cmpl %edx,%eax + je .L918 + movl APUWaitAddress2,%ecx + cmpl %ecx,%eax + jne .L926 +.L918: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L919 + movb CPUExecuting,%dl + testb %dl,%dl + jne .L920 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L920: + movb %al,APUExecuting + ret +.L919: + cmpl $1,%eax + jbe .L923 + movl $1,%ecx + movl %ecx,APUWaitCounter + ret +.L923: + decl %eax + movl %eax,APUWaitCounter + ret +.L916: + movl APUPC,%eax + addl $3,%eax + movl %eax,APUPC +.L926: + ret +ApuOpDE: + movl APUPC,%ecx + movb ApuX,%al + movb 1(%ecx),%dl + andl $255,%eax + andl $255,%edx + addl %eax,%edx + movw %dx,Work16 + movl APUPC,%eax + movb 2(%ecx),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + movb Work16,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + movb ApuA,%dl + cmpb %dl,%al + je .L928 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + movb Shutdown,%dl + testb %dl,%dl + je .L938 + movl APUWaitAddress1,%ecx + cmpl %ecx,%eax + je .L930 + movl APUWaitAddress2,%edx + cmpl %edx,%eax + jne .L938 +.L930: + movl APUWaitCounter,%eax + testl %eax,%eax + jne .L931 + movb CPUExecuting,%cl + testb %cl,%cl + jne .L932 + movl NextEvent,%eax + movl %eax,CYCLES + SAVE_CYCLES + ccall S9xUpdateAPUTimer + ret +.L932: + movb %al,APUExecuting + ret +.L931: + cmpl $1,%eax + jbe .L935 + movl $1,%eax + movl %eax,APUWaitCounter + ret +.L935: + decl %eax + movl %eax,APUWaitCounter + ret +.L928: + movl APUPC,%edx + addl $3,%edx + movl %edx,APUPC +.L938: + ret +ApuOp3D: + movb ApuX,%al + incb %al + movb %al,ApuX + movb %al,APU_Zero + movl APUWaitCounter,%ecx + movl APUPC,%eax + incl %ecx + incl %eax + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOpFC: + movb ApuY,%al + movl APUWaitCounter,%edx + movl APUPC,%ecx + incb %al + incl %edx + incl %ecx + movb %al,ApuY + movb %al,APU_Zero + movl %edx,APUWaitCounter + movl %ecx,APUPC + ret +ApuOp1D: + movb ApuX,%al + movl APUWaitCounter,%edx + movl APUPC,%ecx + decb %al + incl %edx + incl %ecx + movb %al,ApuX + movb %al,APU_Zero + movl %edx,APUWaitCounter + movl %ecx,APUPC + ret +ApuOpDC: + movb ApuY,%al + movl APUWaitCounter,%edx + movl APUPC,%ecx + decb %al + incl %edx + incl %ecx + movb %al,ApuY + movb %al,APU_Zero + movl %edx,APUWaitCounter + movl %ecx,APUPC + ret +ApuOpAB: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + incb %al + movb %al,Work8 + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work8,%dl + movl APUWaitCounter,%ecx + movl APUPC,%eax + addl $12,%esp + incl %ecx + addl $2,%eax + movb %dl,APU_Zero + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOpAC: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + incb %al + movl APUAddress,%edx + movb %al,Work8 + pushl %edx + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movb Work8,%al + movb %al,APU_Zero + movl APUWaitCounter,%ecx + movl APUPC,%eax + incl %ecx + addl $3,%eax + addl $12,%esp + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOpBB: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + incb %al + movb %al,Work8 + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work8,%dl + movl APUWaitCounter,%ecx + movl APUPC,%eax + addl $12,%esp + incl %ecx + addl $2,%eax + movb %dl,APU_Zero + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOpBC: + movb ApuA,%al + movl APUWaitCounter,%edx + movl APUPC,%ecx + incb %al + incl %edx + incl %ecx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUWaitCounter + movl %ecx,APUPC + ret +ApuOp8B: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + decb %al + movb %al,Work8 + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work8,%dl + movl APUWaitCounter,%ecx + movl APUPC,%eax + addl $12,%esp + incl %ecx + addl $2,%eax + movb %dl,APU_Zero + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOp8C: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + decb %al + movl APUAddress,%edx + movb %al,Work8 + pushl %edx + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movb Work8,%al + movb %al,APU_Zero + movl APUWaitCounter,%ecx + movl APUPC,%eax + incl %ecx + addl $3,%eax + addl $12,%esp + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOp9B: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + decb %al + movb %al,Work8 + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movb Work8,%dl + movl APUWaitCounter,%ecx + movl APUPC,%eax + addl $12,%esp + incl %ecx + addl $2,%eax + movb %dl,APU_Zero + movl %ecx,APUWaitCounter + movl %eax,APUPC + ret +ApuOp9C: + movb ApuA,%al + movl APUWaitCounter,%edx + movl APUPC,%ecx + decb %al + incl %edx + incl %ecx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUWaitCounter + movl %ecx,APUPC + ret +ApuOp44: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + xorb %cl,%al + addl $4,%esp + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp45: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%cl + movl APUPC,%edx + xorb %cl,%al + addl $4,%esp + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp46: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%cl + movl APUPC,%edx + xorb %cl,%al + addl $4,%esp + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp47: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + xorb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp48: + movl APUPC,%edx + movb ApuA,%al + movb 1(%edx),%cl + addl $2,%edx + xorb %cl,%al + movl %edx,APUPC + movb %al,ApuA + movb %al,APU_Zero + ret +ApuOp49: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + xorb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $16,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp54: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movl APUPC,%ecx + xorb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp55: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + xorb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp56: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + xorb %dl,%al + addl $4,%esp + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp57: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movl APUPC,%ecx + xorb %dl,%al + addl $4,%esp + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOp58: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb Work8,%dl + xorb %al,%dl + movb %dl,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + movb Work8,%al + addl $3,%edx + addl $12,%esp + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp59: + pushl %ebx + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%bl + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + xorb %bl,%al + movb %al,Work8 + movb %al,APU_Zero + movb ApuX,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $16,%esp + incl %ecx + popl %ebx + movl %ecx,APUPC + ret +ApuOp4B: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb %al,%dl + shrb $1,%al + andb $1,%dl + movb %al,Work8 + movb %al,APU_Zero + movb %dl,APU_Carry + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $12,%esp + movl %eax,APUPC + ret +ApuOp4C: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%dl + movb %al,Work8 + andb $1,%dl + shrb $1,%al + movb %dl,APU_Carry + movb %al,Work8 + movb %al,APU_Zero + movl APUAddress,%edx + andl $255,%eax + pushl %edx + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%ecx + addl $3,%ecx + addl $12,%esp + movl %ecx,APUPC + ret +ApuOp5B: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movb %al,%cl + shrb $1,%al + movl APUPC,%edx + andb $1,%cl + movb %al,Work8 + movb %al,APU_Zero + movb %cl,APU_Carry + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $12,%esp + movl %eax,APUPC + ret +ApuOp5C: + movb ApuA,%al + movb %al,%dl + andb $1,%dl + movb %dl,APU_Carry + movl APUPC,%edx + shrb $1,%al + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp7D: + movl APUPC,%ecx + movb ApuX,%al + incl %ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpDD: + movl APUPC,%edx + movb ApuY,%al + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp5D: + movl APUPC,%ecx + movb ApuA,%al + incl %ecx + movb %al,ApuX + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpFD: + movl APUPC,%edx + movb ApuA,%al + incl %edx + movb %al,ApuY + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp9D: + movl APUPC,%ecx + movb ApuS,%al + incl %ecx + movb %al,ApuX + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpBD: + movl APUPC,%edx + movb ApuX,%al + incl %edx + movb %al,ApuS + movl %edx,APUPC + ret +ApuOp6B: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + xorl %edx,%edx + movb %al,%dl + movb APU_Carry,%al + andl $255,%eax + salw $8,%ax + orl %eax,%edx + movw %dx,Work16 + movb %dl,%cl + shrw $1,%dx + andb $1,%cl + movw %dx,Work16 + movb %dl,%al + movb %cl,APU_Carry + movl APUPC,%edx + movb %al,Work8 + movb %al,APU_Zero + movb 1(%edx),%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $12,%esp + movl %ecx,APUPC + ret +ApuOp6C: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,Work8 + xorl %edx,%edx + movb %al,%dl + movb APU_Carry,%al + andl $255,%eax + salw $8,%ax + orl %eax,%edx + movw %dx,Work16 + movb %dl,%cl + shrw $1,%dx + movb %dl,%al + movb %al,Work8 + movb %al,APU_Zero + movl APUAddress,%eax + pushl %eax + movb Work8,%al + andb $1,%cl + andl $255,%eax + movb %cl,APU_Carry + movw %dx,Work16 + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%edx + addl $3,%edx + addl $12,%esp + movl %edx,APUPC + ret +ApuOp7B: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + xorl %edx,%edx + movb %al,%dl + movb APU_Carry,%al + andl $255,%eax + salw $8,%ax + orl %eax,%edx + movw %dx,Work16 + movb %dl,%cl + shrw $1,%dx + andb $1,%cl + movb %dl,%al + movb %cl,APU_Carry + movw %dx,Work16 + movb %al,Work8 + movb %al,APU_Zero + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $12,%esp + movl %eax,APUPC + ret +ApuOp7C: + movb APU_Carry,%dl + movb ApuA,%al + andl $255,%edx + andl $255,%eax + salw $8,%dx + orl %edx,%eax + movl APUPC,%edx + movb %al,%cl + movw %ax,Work16 + incl %edx + andb $1,%cl + shrw $1,%ax + movl %edx,APUPC + movb %cl,APU_Carry + movw %ax,Work16 + movb %al,ApuA + movb %al,APU_Zero + ret +ApuOp6E: + movl APUPC,%eax + movb 1(%eax),%cl + movb %cl,Work8 + movb 2(%eax),%dl + addl $3,%eax + movb %dl,Int8 + subw APURAM,%ax + movsbw %dl,%dx + addl %edx,%eax + movw %ax,Int16 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + decb %al + movb %al,W1 + movb Work8,%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + addl $12,%esp + movb W1,%cl + testb %cl,%cl + je .L1096 + xorl %eax,%eax + movw Int16,%ax + movl APURAM,%edx + addl %edx,%eax + movl %eax,APUPC + ret +.L1096: + movl APUPC,%ecx + addl $3,%ecx + movl %ecx,APUPC + ret +ApuOpFE: + movl APUPC,%ecx + movl %ecx,%edx + movb 1(%ecx),%al + addl $2,%edx + movb %al,Int8 + subw APURAM,%dx + cbtw + addl %eax,%edx + movb ApuY,%al + decb %al + movw %dx,Int16 + movb %al,ApuY + je .L1104 + xorl %eax,%eax + movw %dx,%ax + movl APURAM,%ecx + addl %ecx,%eax + movl %eax,APUPC + ret +.L1104: + addl $2,%ecx + movl %ecx,APUPC + ret +ApuOp6F: + movb ApuS,%al + addb $2,%al + movb %al,ApuS + movl APURAM,%edx + andl $255,%eax + movw 255(%edx,%eax),%ax + movw %ax,ApuPC + andl $65535,%eax + addl %eax,%edx + movl %edx,APUPC + ret +ApuOp7F: + pushl %esi + pushl %ebx + movb ApuS,%al + incb %al + movb %al,ApuS + movl APURAM,%ebx + andl $255,%eax + movb 256(%ebx,%eax),%dl + movb %dl,%al + shrb $1,%al + movb %dl,%cl + notl %eax + andb $128,%cl + andl $1,%eax + movl %ecx,%esi + orb %al,%cl + movb ApuS,%al + movb %cl,APU_Zero + movb %dl,ApuP + addb $2,%al + movb %dl,%cl + andb $64,%dl + movb %al,ApuS + andb $1,%cl + shrb $6,%dl + andl $255,%eax + movb %cl,APU_Carry + movb %dl,APU_Overflow + movw 255(%ebx,%eax),%ax + movw %ax,ApuPC + andl $65535,%eax + addl %eax,%ebx + movl %ebx,APUPC + popl %ebx + popl %esi + ret +ApuOp84: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1124 + movl $1,%eax +.L1124: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp85: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1132 + movl $1,%eax +.L1132: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp86: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1140 + movl $1,%eax +.L1140: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + incl %edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp87: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1144 + movl $1,%eax +.L1144: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp88: + movl APUPC,%eax + movb 1(%eax),%cl + movb ApuA,%al + xorl %edx,%edx + andl $255,%eax + movb %cl,%dl + addl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + movw %ax,Work16 + movb ApuP,%dl + cmpw $255,%ax + seta %al + andb $247,%dl + movb %al,APU_Carry + movb %dl,ApuP + movb ApuA,%al + movb %cl,Work8 + movb Work16,%dl + xorb %cl,%al + xorb %dl,%cl + notb %al + andb %cl,%al + andb $-128,%al + je .L1152 + movl $1,%ecx + movb %cl,APU_Overflow + jmp .L1153 +.L1152: + movb %al,APU_Overflow +.L1153: + movl APUPC,%edx + movb Work16,%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp89: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movl APUPC,%eax + movb 2(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb Work8,%al + xorl %edx,%edx + movb %cl,%dl + andl $255,%eax + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movw %dx,Work16 + movb %al,APU_Carry + movb %cl,W1 + movb Work8,%dl + movb %cl,%al + movb Work16,%cl + xorb %dl,%al + xorb %cl,%dl + notb %al + andb %dl,%al + addl $8,%esp + andb $-128,%al + je .L1156 + movl $1,%eax +.L1156: + movb %al,APU_Overflow + movb Work16,%al + movl APUPC,%edx + movb %al,W1 + movb %al,APU_Zero + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOp94: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1164 + movl $1,%eax +.L1164: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp95: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1168 + movl $1,%eax +.L1168: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp96: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1172 + movl $1,%eax +.L1172: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $3,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp97: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb %al,%cl + movb ApuA,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb ApuA,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1176 + movl $1,%eax +.L1176: + movb %al,APU_Overflow + movl APUPC,%edx + movb Work16,%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp98: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb Work8,%al + xorl %edx,%edx + movb %cl,%dl + andl $255,%eax + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movw %dx,Work16 + movb %al,APU_Carry + movb %cl,W1 + movb Work8,%dl + movb %cl,%al + movb Work16,%cl + xorb %dl,%al + xorb %cl,%dl + notb %al + andb %dl,%al + addl $4,%esp + andb $-128,%al + je .L1180 + movl $1,%eax +.L1180: + movb %al,APU_Overflow + movb Work16,%al + movl APUPC,%edx + movb %al,W1 + movb %al,APU_Zero + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOp99: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,W1 + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb W1,%al + xorl %edx,%edx + movb %al,%dl + xorl %eax,%eax + movb %cl,%al + addl %eax,%edx + movb APU_Carry,%al + andl $255,%eax + addl %eax,%edx + movb ApuP,%al + andb $247,%al + movb %al,ApuP + cmpw $255,%dx + seta %al + movb %al,APU_Carry + movw %dx,Work16 + movb W1,%al + movb %cl,Work8 + movb %cl,%dl + xorb %cl,%al + movb Work16,%cl + notb %al + xorb %cl,%dl + andb %dl,%al + addl $8,%esp + andb $-128,%al + je .L1184 + movl $1,%eax +.L1184: + movb %al,APU_Overflow + movb Work16,%al + movb %al,W1 + movb %al,APU_Zero + movb ApuX,%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + incl %edx + addl $8,%esp + movl %edx,APUPC + ret +ApuOp8D: + movl APUPC,%edx + movb 1(%edx),%al + addl $2,%edx + movb %al,ApuY + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp8F: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb Work8,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOp9E: + movb ApuX,%al + testb %al,%al + jne .L1200 + movl $1,%edx + movl $255,%ecx + movb %dl,APU_Overflow + movb %cl,ApuY + jmp .L1203 +.L1200: + xorl %eax,%eax + movb ApuX,%cl + movb %al,APU_Overflow + andl $255,%ecx + movw ApuA,%ax + movl %eax,%edx + sarl $31,%edx + idivl %ecx + movl %eax,%ecx + movb %dl,ApuY + movb %cl,Work8 +.L1203: + movb %cl,ApuA + movl APUPC,%edx + movb ApuA,%al + incl %edx + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOp9F: + movb ApuA,%al + movl APUPC,%ecx + rolb $4,%al + incl %ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA4: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1213 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1213 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1214 +.L1213: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1214: + movl APUPC,%ecx + movb Int16,%al + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA5: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1217 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1217 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1218 +.L1217: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1218: + movl APUPC,%ecx + movb Int16,%al + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA6: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1225 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1225 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1226 +.L1225: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1226: + movl APUPC,%ecx + movb Int16,%al + incl %ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA7: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1229 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1229 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1230 +.L1229: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1230: + movl APUPC,%ecx + movb Int16,%al + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA8: + movl APUPC,%eax + movb ApuA,%dl + movb 1(%eax),%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + jns .L1237 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1237 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1238 +.L1237: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1238: + movl APUPC,%ecx + movb Int16,%al + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpA9: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,Work8 + movl APUPC,%eax + movb 2(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb Work8,%dl + xorl %eax,%eax + movb %cl,%al + andl $255,%edx + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movw %ax,Int16 + movb ApuP,%dl + notw %ax + andb $247,%dl + shrw $15,%ax + movb %dl,ApuP + movb %al,APU_Carry + movb Work8,%dl + movb %cl,%al + movb %cl,W1 + xorb %dl,%al + addl $8,%esp + testb %al,%al + jge .L1241 + movb %cl,%al + movb Int16,%dl + xorb %dl,%al + jns .L1241 + movl $1,%ecx + movb %cl,APU_Overflow + jmp .L1242 +.L1241: + xorl %eax,%eax + movb %al,APU_Overflow +.L1242: + movb Int16,%al + movl APUPC,%edx + movb %al,W1 + movb %al,APU_Zero + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpB4: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1245 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1245 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1246 +.L1245: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1246: + movl APUPC,%ecx + movb Int16,%al + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpB5: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1249 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1249 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1250 +.L1249: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1250: + movl APUPC,%ecx + movb Int16,%al + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpB6: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1253 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1253 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1254 +.L1253: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1254: + movl APUPC,%ecx + movb Int16,%al + addl $3,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpB7: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movb ApuA,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb ApuA,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $4,%esp + testb %al,%al + jge .L1257 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1257 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1258 +.L1257: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1258: + movl APUPC,%ecx + movb Int16,%al + addl $2,%ecx + movb %al,ApuA + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpB8: + movl APUPC,%edx + movb 1(%edx),%al + movb %al,Work8 + movb 2(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,%cl + movb Work8,%dl + xorl %eax,%eax + movb %cl,%al + andl $255,%edx + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movw %ax,Int16 + movb ApuP,%dl + notw %ax + andb $247,%dl + shrw $15,%ax + movb %dl,ApuP + movb %al,APU_Carry + movb Work8,%dl + movb %cl,%al + movb %cl,W1 + xorb %dl,%al + addl $4,%esp + testb %al,%al + jge .L1261 + movb %cl,%al + movb Int16,%dl + xorb %dl,%al + jns .L1261 + movl $1,%ecx + movb %cl,APU_Overflow + jmp .L1262 +.L1261: + xorl %eax,%eax + movb %al,APU_Overflow +.L1262: + movb Int16,%al + movl APUPC,%edx + movb %al,W1 + movb %al,APU_Zero + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpB9: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb %al,W1 + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movb W1,%dl + movb %al,%cl + xorl %eax,%eax + movb %dl,%al + xorl %edx,%edx + movb %cl,%dl + subl %edx,%eax + movb APU_Carry,%dl + andl $255,%edx + addl %edx,%eax + decl %eax + movb ApuP,%dl + movw %ax,Int16 + andb $247,%dl + notw %ax + movb %dl,ApuP + shrw $15,%ax + movb W1,%dl + movb %al,APU_Carry + movb %dl,%al + movb %cl,Work8 + xorb %cl,%al + addl $8,%esp + testb %al,%al + jge .L1265 + movb %dl,%al + movb Int16,%cl + xorb %cl,%al + jns .L1265 + movl $1,%eax + movb %al,APU_Overflow + jmp .L1266 +.L1265: + xorl %edx,%edx + movb %dl,APU_Overflow +.L1266: + movb Int16,%al + movb %al,W1 + movb %al,APU_Zero + movb ApuX,%al + andl $255,%eax + pushl %eax + movb W1,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + incl %ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpAF: + movb ApuX,%al + andl $255,%eax + pushl %eax + movb ApuX,%dl + movb ApuA,%al + incb %dl + andl $255,%eax + movb %dl,ApuX + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + incl %ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpBE: + movl APUPC,%eax + incl %eax + movl %eax,APUPC + ret +ApuOpBF: + movb ApuX,%al + andl $255,%eax + pushl %eax + movb ApuX,%dl + incb %dl + movb %dl,ApuX + call S9xAPUGetByteZ__FUc + movl APUPC,%ecx + movb %al,ApuA + incl %ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpC0: + movb ApuP,%al + movl APUPC,%edx + andb $251,%al + incl %edx + movb %al,ApuP + movl %edx,APUPC + ret +ApuOpA0: + movb ApuP,%cl + movl APUPC,%eax + orb $4,%cl + incl %eax + movb %cl,ApuP + movl %eax,APUPC + ret +ApuOpC4: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpC5: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%eax + addl $3,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpC6: + movb ApuX,%al + andl $255,%eax + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%edx + incl %edx + addl $8,%esp + movl %edx,APUPC + ret +ApuOpC7: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpC9: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%edx + addl $3,%edx + addl $8,%esp + movl %edx,APUPC + ret +ApuOpCB: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpCC: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%edx + addl $3,%edx + addl $8,%esp + movl %edx,APUPC + ret +ApuOpCD: + movl APUPC,%edx + movb 1(%edx),%al + addl $2,%edx + movb %al,ApuX + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOpCF: + movb ApuA,%al + mulb ApuY + movl %eax,%edx + shrw $8,%ax + movw %dx,ApuA + andl $65535,%eax + testw %dx,%dx + je .L1324 + orb $1,%al +.L1324: + movl APUPC,%ecx + incl %ecx + movb %al,APU_Zero + movl %ecx,APUPC + ret +ApuOpD4: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpD5: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%edx + addl $3,%edx + addl $8,%esp + movl %edx,APUPC + ret +ApuOpD6: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpD7: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + movb ApuA,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByte__FUcUl + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpD8: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $2,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpD9: + movl APUPC,%edx + movb ApuY,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpDB: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + movb ApuY,%al + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%eax + addl $2,%eax + addl $8,%esp + movl %eax,APUPC + ret +ApuOpDF: + movb ApuA,%al + movb %al,%dl + xorl %ecx,%ecx + shrb $4,%al + andb $15,%dl + movb %cl,APU_Carry + movb %al,W2 + movb %dl,W1 + cmpb $9,%dl + jbe .L1359 + addb $-10,%dl + incb %al + movb %dl,W1 + movb %al,W2 +.L1359: + movb W2,%al + cmpb $9,%al + jbe .L1360 + addb $-10,%al + movl $1,%edx + movb %al,W2 + movb %dl,APU_Carry +.L1360: + movb W2,%al + movb W1,%cl + movl APUPC,%edx + salb $4,%al + incl %edx + orb %cl,%al + movl %edx,APUPC + movb %al,ApuA + movb %al,APU_Zero + ret +ApuOpE4: + movl APUPC,%eax + movb 1(%eax),%cl + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%edx + movb %al,ApuA + addl $2,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpE5: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%ecx + movb %al,ApuA + addl $3,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpE6: + movb ApuX,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%edx + movb %al,ApuA + incl %edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpE7: + movb ApuX,%al + movl APUPC,%edx + andl $255,%eax + movb 1(%edx),%cl + addb %cl,%al + xorl %edx,%edx + movb %al,%dl + movl APUDirectPage,%eax + movw (%edx,%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%edx + movb %al,ApuA + addl $2,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpE8: + movl APUPC,%edx + movb 1(%edx),%al + addl $2,%edx + movb %al,ApuA + movb %al,APU_Zero + movl %edx,APUPC + ret +ApuOpE9: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%ecx + movb %al,ApuX + addl $3,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpEB: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%ecx + movb %al,ApuY + addl $2,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpEC: + movl APUPC,%eax + movw 1(%eax),%ax + andl $65535,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%edx + movb %al,ApuY + addl $3,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpF4: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%edx + movb %al,ApuA + addl $2,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpF5: + movl APUPC,%eax + movb ApuX,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%ecx + movb %al,ApuA + addl $3,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpF6: + movl APUPC,%eax + movb ApuY,%dl + movw 1(%eax),%ax + andl $255,%edx + andl $65535,%eax + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%edx + movb %al,ApuA + addl $3,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpF7: + movl APUPC,%eax + movb 1(%eax),%dl + movl APUDirectPage,%eax + andl $255,%edx + movw (%edx,%eax),%ax + movb ApuY,%dl + andl $65535,%eax + andl $255,%edx + addl %edx,%eax + movl %eax,APUAddress + pushl %eax + call S9xAPUGetByte__FUl + movl APUPC,%ecx + movb %al,ApuA + addl $2,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpF8: + movl APUPC,%eax + movb 1(%eax),%dl + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%ecx + movb %al,ApuX + addl $2,%ecx + movb %al,APU_Zero + addl $4,%esp + movl %ecx,APUPC + ret +ApuOpF9: + movl APUPC,%edx + movb ApuY,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%edx + movb %al,ApuX + addl $2,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret +ApuOpFA: + movl APUPC,%edx + movb 2(%edx),%al + andl $255,%eax + pushl %eax + movb 1(%edx),%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + addl $4,%esp + andl $255,%eax + pushl %eax + call S9xAPUSetByteZ__FUcUc + movl APUPC,%ecx + addl $3,%ecx + addl $8,%esp + movl %ecx,APUPC + ret +ApuOpFB: + movl APUPC,%edx + movb ApuX,%al + movb 1(%edx),%cl + addb %cl,%al + andl $255,%eax + pushl %eax + call S9xAPUGetByteZ__FUc + movl APUPC,%edx + movb %al,ApuY + addl $2,%edx + movb %al,APU_Zero + addl $4,%esp + movl %edx,APUPC + ret + +#if 0 +S9xAPUGetByteZ__FUc: + movb 4(%esp),%dl + cmpb $239,%dl + jbe .L1434 + movl APUDirectPage,%ecx + movl APURAM,%eax + cmpl %eax,%ecx + jne .L1434 + movb %dl,%al + addb $12,%al + cmpb $3,%al + ja .L1435 + movl APUWaitAddress1,%eax + movl %eax,APUWaitAddress2 + movl APUPC,%eax + movl %eax,APUWaitAddress1 +.L1441: + xorl %eax,%eax + movb %dl,%al + movb (%eax,%ecx),%dl + xorl %eax,%eax + movb %dl,%al + ret +.L1435: + cmpb $243,%dl + jne .L1436 + call S9xGetAPUDSP + andl $255,%eax + ret +.L1436: + cmpb $252,%dl + jbe .L1441 + movl APUWaitAddress1,%eax + movl %eax,APUWaitAddress2 + movl APUPC,%eax + andl $255,%edx + movl %eax,APUWaitAddress1 + movb (%edx,%ecx),%al + movb %al,W4 + xorl %eax,%eax + movb %al,(%edx,%ecx) + movb W4,%al + andl $255,%eax + ret +.L1434: + andl $255,%edx + movl APUDirectPage,%eax + movb (%edx,%eax),%cl + xorl %eax,%eax + movb %cl,%al + ret +S9xAPUSetByteZ__FUcUc: + pushl %ebx + movl 8(%esp),%ebx + movb 12(%esp),%dl + movb %bl,%cl + cmpb $239,%dl + jbe .L1454 + movl APURAM,%eax + cmpl %eax,APUDirectPage + jne .L1454 + movb %dl,%al + addb $12,%al + cmpb $3,%al + ja .L1455 + xorl %eax,%eax + movb %dl,%al + movb %bl,APU-237(%eax) + jmp .L1463 +.L1455: + cmpb $241,%dl + jne .L1457 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xSetAPUControl + addl $4,%esp + jmp .L1463 +.L1457: + cmpb $243,%dl + jne .L1459 + xorl %eax,%eax + movb %cl,%al + pushl %eax + call S9xSetAPUDSP + addl $4,%esp + jmp .L1463 +.L1459: + cmpb $252,%dl + ja .L1463 + xorl %eax,%eax + movb %cl,%al + pushl %eax + xorl %eax,%eax + movb %dl,%al + pushl %eax + call S9xSetAPUTimer + addl $8,%esp + jmp .L1463 +.L1454: + andl $255,%edx + movl APUDirectPage,%eax + movb %cl,(%edx,%eax) +.L1463: + popl %ebx + ret + +S9xAPUGetByte__FUl: + xorl %ecx,%ecx + movw 4(%esp),%cx + leal -240(%ecx),%eax + cmpl $15,%eax + ja .L1465 + leal -244(%ecx),%eax + cmpl $3,%eax + ja .L1466 + movl APUWaitAddress1,%eax + movl APUPC,%edx + movl %eax,APUWaitAddress2 + movl %edx,APUWaitAddress1 +.L1477: + movl APURAM,%eax + movb (%ecx,%eax),%dl + xorl %eax,%eax + movb %dl,%al + ret +.L1466: + cmpl $243,%ecx + jne .L1467 + call S9xGetAPUDSP + andl $255,%eax + ret +.L1467: + cmpl $252,%ecx + jbe .L1477 + movl APUPC,%edx + movl APUWaitAddress1,%eax + movl %edx,APUWaitAddress1 + movl %eax,APUWaitAddress2 + movl APURAM,%edx + movb (%ecx,%edx),%al + movb %al,W4 + xorl %eax,%eax + movb %al,(%ecx,%edx) + movb W4,%al + andl $255,%eax + ret +.L1465: + cmpl $65471,%ecx + jbe .L1471 + movb APUShowROM,%al + testb %al,%al + je .L1472 + movb APUROM-65472(%ecx),%al + andl $255,%eax + ret +.L1472: + movb APUExtraRAM-0xffc0(%ecx),%al + andl $255,%eax + ret +.L1471: + movl APURAM,%eax + movb (%ecx,%eax),%dl + xorl %eax,%eax + movb %dl,%al + ret + +S9xAPUSetByte__FUcUl: + pushl %ebx + xorl %edx,%edx + movl 8(%esp),%ecx + movw 12(%esp),%dx + movb %cl,%bl + leal -240(%edx),%eax + cmpl $15,%eax + ja .L1492 + leal -244(%edx),%eax + cmpl $3,%eax + ja .L1493 + movb %cl,APUOutPorts-0xf4(%edx) + jmp .L1503 +.L1493: + cmpl $241,%edx + jne .L1495 + xorl %eax,%eax + movb %bl,%al + pushl %eax + call S9xSetAPUControl + addl $4,%esp + jmp .L1503 +.L1495: + cmpl $243,%edx + jne .L1497 + xorl %eax,%eax + movb %bl,%al + pushl %eax + call S9xSetAPUDSP + addl $4,%esp + jmp .L1503 +.L1497: + cmpl $252,%edx + ja .L1503 + xorl %eax,%eax + movb %bl,%al + pushl %eax + pushl %edx + call S9xSetAPUTimer + addl $8,%esp + jmp .L1503 +.L1492: + cmpl $65471,%edx + ja .L1501 + movl APURAM,%eax + movb %cl,(%edx,%eax) + jmp .L1503 +.L1501: + movb %cl,APUExtraRAM-0xffc0(%edx) +.L1503: + popl %ebx + ret +#else + +S9xAPUGetByteZ__FUc: + movb 4(%esp),%dl + movl APUDirectPage,%ecx + cmpb $239,%dl + jbe .L1435 + movl APURAM,%eax + cmpl %eax,%ecx + jne .L1435 + movb %dl,%al + addb $12,%al + cmpb $3,%al + ja .L1436 + movl APUWaitAddress1,%eax + movl %eax,APUWaitAddress2 + movl APUPC,APUWaitAddress1 +.L1444: + xorl %eax,%eax + movb %dl,%al + movb (%eax,%ecx),%dl +.L1443: + xorl %eax,%eax + movb %dl,%al + ret +.L1436: + cmpb $252,%dl + jbe .L1437 + movl APUWaitAddress1,%eax + movl APUPC,APUWaitAddress1 + movl %eax,APUWaitAddress2 + xorl %eax,%eax + movb %dl,%al + movb (%eax,%ecx),%dl + movb $0,(%eax,%ecx) + jmp .L1443 +.L1437: + cmpb $243,%dl + jne .L1444 + call S9xGetAPUDSP + ret +.L1435: + andl $255,%edx + xorl %eax,%eax + movb (%edx,%ecx),%al + ret + +S9xAPUSetByteZ__FUcUc: + pushl %eax + pushl %edi + pushl %esi + pushl %ebx + movl 20(%esp),%ebx + movb 24(%esp),%dl + movb %bl,15(%esp) + cmpb $239,%dl + jbe .L1460 + movl APUDirectPage,%esi + movl APURAM,%eax + cmpl %eax,%esi + jne .L1460 + cmpb $243,%dl + jne .L1461 + xorl %eax,%eax + movb %bl,%al + pushl %eax + call S9xSetAPUDSP + addl $4,%esp + jmp .L1472 +.L1461: + movb %dl,%al + addb $12,%al + cmpb $3,%al + ja .L1463 + xorl %eax,%eax + movb %dl,%al + movb %bl,APUOutPorts-0xf4(%eax) + jmp .L1472 +.L1463: + cmpb $241,%dl + jne .L1465 + movb 15(%esp),%al + andl $255,%eax + pushl %eax + call S9xSetAPUControl + addl $4,%esp + jmp .L1472 +.L1465: + cmpb $252,%dl + ja .L1472 + movl %edx,%edi + andl $255,%edi + movb %bl,(%edi,%esi) + cmpb $249,%dl + jbe .L1472 + testb %bl,%bl + jne .L1469 + movw $256,APUTimerTarget-0xfa * 2(,%edi,2) + jmp .L1472 +.L1469: + movb 15(%esp),%al + andl $255,%eax + movw %ax,APUTimerTarget-0xfa * 2(,%edi,2) + jmp .L1472 +.L1460: + andl $255,%edx + movl APUDirectPage,%eax + movb 15(%esp),%cl + movb %cl,(%edx,%eax) +.L1472: + popl %ebx + popl %esi + popl %edi + addl $4,%esp + ret + +S9xAPUGetByte__FUl: + movl 4(%esp),%ecx + andl $0xffff,%eax + leal -240(%ecx),%eax + cmpl $15,%eax + ja .L1474 + leal -244(%ecx),%eax + cmpl $3,%eax + ja .L1475 + movl APUWaitAddress1,%eax + movl APUPC,APUWaitAddress2 + movl %edx,APUWaitAddress1 +.L1487: + xorl %eax,%eax + movl APURAM,%edx + movb (%ecx,%edx),%al + ret +.L1475: + cmpl $243,%ecx + jne .L1476 + call S9xGetAPUDSP + ret +.L1476: + cmpl $252,%ecx + jbe .L1487 + movl APUWaitAddress1,%eax + movl APUPC,APUWaitAddress1 + movl %eax,APUWaitAddress2 + xorl %eax,%eax + movl APURAM,%edx + movb (%ecx,%edx),%al + movb $0,(%ecx,%edx) + ret +.L1474: + cmpl $65471,%ecx + jbe .L1480 + movb APUShowROM,%al + testb %al,%al + je .L1481 + movb APUROM-65472(%ecx),%al + andl $255,%eax + ret +.L1481: + xorl %eax,%eax + movb APUExtraRAM-0xffc0(%ecx),%al + ret +.L1480: + xorl %eax,%eax + movl APURAM,%edx + movb (%ecx,%edx),%al + ret + +S9xAPUSetByte__FUcUl: + pushl %ebx + xorl %edx,%edx + movl 8(%esp),%ecx + movw 12(%esp),%dx + movb %cl,%bl + leal -240(%edx),%eax + cmpl $15,%eax + ja .L1505 + cmpl $243,%edx + jne .L1506 + xorl %eax,%eax + movb %bl,%al + pushl %eax + call S9xSetAPUDSP + addl $4,%esp + jmp .L1519 +.L1506: + leal -244(%edx),%eax + cmpl $3,%eax + ja .L1508 + movb %cl,APUOutPorts-0xf4(%edx) + jmp .L1519 +.L1508: + cmpl $241,%edx + jne .L1510 + xorl %eax,%eax + movb %bl,%al + pushl %eax + call S9xSetAPUControl + addl $4,%esp + jmp .L1519 +.L1510: + cmpl $252,%edx + ja .L1519 + movl APURAM,%eax + movb %cl,(%edx,%eax) + cmpl $249,%edx + jbe .L1519 + testb %cl,%cl + jne .L1514 + movw $256,APUTimerTarget-0xfa*2(,%edx,2) + jmp .L1519 +.L1514: + xorl %eax,%eax + movb %bl,%al + movw %ax,APUTimerTarget-0xfa*2(,%edx,2) + jmp .L1519 +.L1505: + cmpl $0xffbf,%edx + ja .L1517 + movl APURAM,%eax + movb %cl,(%edx,%eax) + jmp .L1519 +.L1517: + movb %cl,APUExtraRAM - 0xffc0(%edx) +.L1519: + popl %ebx + ret +#endif + +.data + .align 4 +.globl S9xApuOpcodes +S9xApuOpcodes: + .long ApuOp00 + .long ApuOp01 + .long ApuOp02 + .long ApuOp03 + .long ApuOp04 + .long ApuOp05 + .long ApuOp06 + .long ApuOp07 + .long ApuOp08 + .long ApuOp09 + .long ApuOp0A + .long ApuOp0B + .long ApuOp0C + .long ApuOp0D + .long ApuOp0E + .long ApuOp0F + .long ApuOp10 + .long ApuOp11 + .long ApuOp12 + .long ApuOp13 + .long ApuOp14 + .long ApuOp15 + .long ApuOp16 + .long ApuOp17 + .long ApuOp18 + .long ApuOp19 + .long ApuOp1A + .long ApuOp1B + .long ApuOp1C + .long ApuOp1D + .long ApuOp1E + .long ApuOp1F + .long ApuOp20 + .long ApuOp21 + .long ApuOp22 + .long ApuOp23 + .long ApuOp24 + .long ApuOp25 + .long ApuOp26 + .long ApuOp27 + .long ApuOp28 + .long ApuOp29 + .long ApuOp2A + .long ApuOp2B + .long ApuOp2C + .long ApuOp2D + .long ApuOp2E + .long ApuOp2F + .long ApuOp30 + .long ApuOp31 + .long ApuOp32 + .long ApuOp33 + .long ApuOp34 + .long ApuOp35 + .long ApuOp36 + .long ApuOp37 + .long ApuOp38 + .long ApuOp39 + .long ApuOp3A + .long ApuOp3B + .long ApuOp3C + .long ApuOp3D + .long ApuOp3E + .long ApuOp3F + .long ApuOp40 + .long ApuOp41 + .long ApuOp42 + .long ApuOp43 + .long ApuOp44 + .long ApuOp45 + .long ApuOp46 + .long ApuOp47 + .long ApuOp48 + .long ApuOp49 + .long ApuOp4A + .long ApuOp4B + .long ApuOp4C + .long ApuOp4D + .long ApuOp4E + .long ApuOp4F + .long ApuOp50 + .long ApuOp51 + .long ApuOp52 + .long ApuOp53 + .long ApuOp54 + .long ApuOp55 + .long ApuOp56 + .long ApuOp57 + .long ApuOp58 + .long ApuOp59 + .long ApuOp5A + .long ApuOp5B + .long ApuOp5C + .long ApuOp5D + .long ApuOp5E + .long ApuOp5F + .long ApuOp60 + .long ApuOp61 + .long ApuOp62 + .long ApuOp63 + .long ApuOp64 + .long ApuOp65 + .long ApuOp66 + .long ApuOp67 + .long ApuOp68 + .long ApuOp69 + .long ApuOp6A + .long ApuOp6B + .long ApuOp6C + .long ApuOp6D + .long ApuOp6E + .long ApuOp6F + .long ApuOp70 + .long ApuOp71 + .long ApuOp72 + .long ApuOp73 + .long ApuOp74 + .long ApuOp75 + .long ApuOp76 + .long ApuOp77 + .long ApuOp78 + .long ApuOp79 + .long ApuOp7A + .long ApuOp7B + .long ApuOp7C + .long ApuOp7D + .long ApuOp7E + .long ApuOp7F + .long ApuOp80 + .long ApuOp81 + .long ApuOp82 + .long ApuOp83 + .long ApuOp84 + .long ApuOp85 + .long ApuOp86 + .long ApuOp87 + .long ApuOp88 + .long ApuOp89 + .long ApuOp8A + .long ApuOp8B + .long ApuOp8C + .long ApuOp8D + .long ApuOp8E + .long ApuOp8F + .long ApuOp90 + .long ApuOp91 + .long ApuOp92 + .long ApuOp93 + .long ApuOp94 + .long ApuOp95 + .long ApuOp96 + .long ApuOp97 + .long ApuOp98 + .long ApuOp99 + .long ApuOp9A + .long ApuOp9B + .long ApuOp9C + .long ApuOp9D + .long ApuOp9E + .long ApuOp9F + .long ApuOpA0 + .long ApuOpA1 + .long ApuOpA2 + .long ApuOpA3 + .long ApuOpA4 + .long ApuOpA5 + .long ApuOpA6 + .long ApuOpA7 + .long ApuOpA8 + .long ApuOpA9 + .long ApuOpAA + .long ApuOpAB + .long ApuOpAC + .long ApuOpAD + .long ApuOpAE + .long ApuOpAF + .long ApuOpB0 + .long ApuOpB1 + .long ApuOpB2 + .long ApuOpB3 + .long ApuOpB4 + .long ApuOpB5 + .long ApuOpB6 + .long ApuOpB7 + .long ApuOpB8 + .long ApuOpB9 + .long ApuOpBA + .long ApuOpBB + .long ApuOpBC + .long ApuOpBD + .long ApuOpBE + .long ApuOpBF + .long ApuOpC0 + .long ApuOpC1 + .long ApuOpC2 + .long ApuOpC3 + .long ApuOpC4 + .long ApuOpC5 + .long ApuOpC6 + .long ApuOpC7 + .long ApuOpC8 + .long ApuOpC9 + .long ApuOpCA + .long ApuOpCB + .long ApuOpCC + .long ApuOpCD + .long ApuOpCE + .long ApuOpCF + .long ApuOpD0 + .long ApuOpD1 + .long ApuOpD2 + .long ApuOpD3 + .long ApuOpD4 + .long ApuOpD5 + .long ApuOpD6 + .long ApuOpD7 + .long ApuOpD8 + .long ApuOpD9 + .long ApuOpDA + .long ApuOpDB + .long ApuOpDC + .long ApuOpDD + .long ApuOpDE + .long ApuOpDF + .long ApuOpE0 + .long ApuOpE1 + .long ApuOpE2 + .long ApuOpE3 + .long ApuOpE4 + .long ApuOpE5 + .long ApuOpE6 + .long ApuOpE7 + .long ApuOpE8 + .long ApuOpE9 + .long ApuOpEA + .long ApuOpEB + .long ApuOpEC + .long ApuOpED + .long ApuOpEE + .long ApuOpEF + .long ApuOpF0 + .long ApuOpF1 + .long ApuOpF2 + .long ApuOpF3 + .long ApuOpF4 + .long ApuOpF5 + .long ApuOpF6 + .long ApuOpF7 + .long ApuOpF8 + .long ApuOpF9 + .long ApuOpFA + .long ApuOpFB + .long ApuOpFC + .long ApuOpFD + .long ApuOpFE + .long ApuOpFF diff --git a/src/i386/spcops.h b/src/i386/spcops.h new file mode 100644 index 0000000..df27d2a --- /dev/null +++ b/src/i386/spcops.h @@ -0,0 +1,268 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro APUS9xPackStatus K + movb ApuP, %dl + andb $~(Zero | Negative | Carry | Overflow), %dl + orb APU_Carry, %dl + movb APU_Zero, %al + andb $0x80, %al + orb %al, %dl + movb APU_Overflow, %al + salb $6, %al + orb %al, %dl + movb APU_Zero, %al + orb %al, %al + setz %al + salb $1, %al + orb %al, %dl + movb %dl, ApuP +.endm + +.macro APUS9xUnpackStatus K +.endm + +.macro Absolute K + movw (APUPC), %dx + addl $2, APUPC + andl $0xffff, %edx +.endm + +.macro Direct K + movb (APUPC), %dl + incl APUPC + andl $0xff, %edx +.endm + +.macro Immediate8 K + movb (APUPC), %al + incl APUPC +.endm + +.macro IndirectX K + movb ApuX, %dl + andl $0xff, %edx +.endm + +.macro IndexedXIndirect K + xorl %eax, %eax + xorl %edx, %edx + movb ApuX, %al + movl APUDirectPage, %ecx + addb (APUPC), %al + movw (%ecx, %eax), %dx + incl APUPC +.endm + +.macro DirectX K + movb (APUPC), %dl + addb ApuX, %dl + andl $0xff, %edx + incl APUPC +.endm + +.macro AbsoluteX K + movb ApuX, %dl + andl $0xff, %edx + addw (APUPC), %dx + addl $2, APUPC +.endm + +.macro AbsoluteY K + movb ApuY, %dl + andl $0xff, %edx + addw (APUPC), %dx + addl $2, APUPC +.endm + +.macro IndirectIndexedY K + xorl %edx, %edx + xorl %eax, %eax + movl APUDirectPage, %ecx + movb ApuY, %dl + movb (APUPC), %al + addw (%ecx, %eax), %dx + incl APUPC +.endm + +.macro MemBit K + xorl %ecx, %ecx + movw (APUPC), %dx + movb 1(APUPC), %cl + shrb $5, %cl + andl $0x1fff, %edx + addl $2, APUPC +.endm + +.macro ApuPushWord + movb ApuS, %cl + movl APURAM, %edx + andl $0xff, %ecx + movw %ax,0xff(%edx, %ecx) + subl $2, %ecx + movb %cl, ApuS +.endm + +.macro ApuPushByte + movb ApuS, %cl + movl APURAM, %edx + andl $0xff, %ecx + movb %al,0x100(%edx, %ecx) + decb %cl + movb %cl, ApuS +.endm + +.macro Tcall N + movl APUPC, %eax + subl APURAM, %eax + ApuPushWord + movw APUExtraRAM + ((15 - \N) << 1), %cx + movl APURAM, APUPC + andl $0xffff, %ecx + addl %ecx, APUPC + ret +.endm + +.macro Set K + Direct SET\K + pushl %edx + call S9xAPUGetByteZ + orb $(1 << \K), %al + popl %edx + call S9xAPUSetByteZ + ret +.endm + +.macro Clr K + Direct CLR\K + pushl %edx + call S9xAPUGetByteZ + andb $~(1 << \K), %al + popl %edx + call S9xAPUSetByteZ + ret +.endm + +.macro BBS K + movb (APUPC), %dl + andl $0xff, %edx + call S9xAPUGetByteZ + andb $(1 << \K), %al + jz .BBS\K + movsbl 1(APUPC), %eax + addl $2, APUPC + addl %eax, APUPC + ret +.BBS\K: + addl $2, APUPC + ret +.endm + +.macro BBC K + movb (APUPC), %dl + andl $0xff, %edx + call S9xAPUGetByteZ + andb $(1 << \K), %al + jnz .BBC\K + movsbl 1(APUPC), %eax + addl $2, APUPC + addl %eax, APUPC + ret +.BBC\K: + addl $2, APUPC + ret +.endm + +.macro ORA K + orb ApuA, %al + movb %al, ApuA + movb %al, APU_Zero + movb %al, APU_Negative + ret +.endm + diff --git a/src/i386/zsnes.asm b/src/i386/zsnes.asm new file mode 100644 index 0000000..0311a52 --- /dev/null +++ b/src/i386/zsnes.asm @@ -0,0 +1,403 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +; ZSNES SuperFX emulation code and wrappers +; (C) Copyright 1997-8 zsKnight and _Demo_ + +; Used with the kind permission of the copyright holders. +; + +%include "src/i386/macros.mac" + +EXTSYM SfxR1,SfxR2,InitFxTables,SfxSFR,SfxSCMR,initsfxregsw,initsfxregsr +EXTSYM SfxPBR,SfxSCMR,NumberOfOpcodes,SfxCLSR,MainLoop,SfxCROM +EXTSYM SfxRomBuffer,SfxRAMMem,SfxLastRamAdr,SfxR0 +EXTSYM PHnum2writesfxreg, SfxCPB, SfxROMBR, SfxRAMBR, SfxnRamBanks +EXTSYM SfxSignZero + +[BITS 32] +SECTION .data + +NEWSYM flagnz, dd 0 +NEWSYM romdata, dd 0 ; rom data (4MB = 4194304) + +NEWSYM regptr, dd 0 ; pointer to registers +NEWSYM regptw, dd 0 ; pointer to registers +NEWSYM regptra, times 49152 db 0 +NEWSYM regptwa, times 49152 db 0 + +NEWSYM debstop, db 0 +NEWSYM sfxramdata, dd 0 ; SuperFX Ram Data +NEWSYM sfxplottable, dd 0 +NEWSYM FxTable, times 256 dd 0 +NEWSYM FxTableA1, times 256 dd 0 +NEWSYM FxTableA2, times 256 dd 0 +NEWSYM FxTableA3, times 256 dd 0 +NEWSYM FxTableb, times 256 dd 0 +NEWSYM FxTablebA1, times 256 dd 0 +NEWSYM FxTablebA2, times 256 dd 0 +NEWSYM FxTablebA3, times 256 dd 0 +NEWSYM FxTablec, times 256 dd 0 +NEWSYM FxTablecA1, times 256 dd 0 +NEWSYM FxTablecA2, times 256 dd 0 +NEWSYM FxTablecA3, times 256 dd 0 +NEWSYM FxTabled, times 256 dd 0 +NEWSYM FxTabledA1, times 256 dd 0 +NEWSYM FxTabledA2, times 256 dd 0 +NEWSYM FxTabledA3, times 256 dd 0 +NEWSYM SfxMemTable, times 256 dd 0 +NEWSYM fxxand, times 256 dd 0 +NEWSYM fxbit01, times 256 dd 0 +NEWSYM fxbit23, times 256 dd 0 +NEWSYM fxbit45, times 256 dd 0 +NEWSYM fxbit67, times 256 dd 0 +NEWSYM PLOTJmpa, times 64 dd 0 +NEWSYM PLOTJmpb, times 64 dd 0 + +NEWSYM NumberOfOpcodes2, dd 350 +NEWSYM SFXCounter, dd 0 +NEWSYM SfxAC, dd 0 + +;%INCLUDE "i386/fxtable.asm" +;%INCLUDE "i386/sfxproc.asm" +;%INCLUDE "i386/fxemu2.asm" +;%INCLUDE "i386/fxemu2b.asm" +;%INCLUDE "i386/fxemu2c.asm" + +; +; Snes9x wrapper functions for the zsnes SuperFX code +; (C) Copyright 1998 Gary Henderson + +SECTION .data + +%ifdef __DJGPP__ +%define SRAM _SRAM +%define ROM _ROM +%define RegRAM _RegRAM +%define S9xResetSuperFX _S9xResetSuperFX +%define S9xSuperFXWriteReg _S9xSuperFXWriteReg +%define S9xSuperFXReadReg _S9xSuperFXReadReg +%define S9xSuperFXExec _S9xSuperFXExec +%define S9xSuperFXPreSaveState _S9xSuperFXPreSaveState +%define S9xSuperFXPostSaveState _S9xSuperFXPostSaveState +%define S9xSuperFXPostLoadState _S9xSuperFXPostLoadState +%define SFXPlotTable _SFXPlotTable +%define WinterGold _WinterGold +%endif + +EXTERN SRAM +EXTERN ROM +EXTERN RegRAM +EXTERN SFXPlotTable +EXTERN WinterGold + +SECTION .text + +GLOBAL S9xResetSuperFX +GLOBAL S9xSuperFXWriteReg +GLOBAL S9xSuperFXReadReg +GLOBAL S9xSuperFXExec +GLOBAL S9xSuperFXPreSaveState +GLOBAL S9xSuperFXPostSaveState +GLOBAL S9xSuperFXPostLoadState +GLOBAL StartSFX + +StartSFX: +StartSFXret: + jmp S9xSuperFXExec + +S9xResetSuperFX: + push ebx + push esi + push edi + push ebp + + mov dword[SfxR1],0 + mov dword[SfxR2],0 + mov dword[SfxSignZero],1 ; clear z flag + + mov eax,dword[SRAM] + mov dword[sfxramdata],eax + mov eax,dword[ROM] + mov dword[romdata],eax + mov eax,dword[SFXPlotTable] + mov dword[sfxplottable],eax + + call InitFxTables + + mov dword[SfxSFR],0 + mov byte[SfxSCMR],0 + mov dword[regptr],regptra + sub dword[regptr],8000h ; Since register address starts @ 2000h + mov dword[regptw],regptwa + sub dword[regptw],8000h ; Since register address starts @ 2000h + call initsfxregsw + call initsfxregsr + +NEWSYM preparesfx + mov byte[SFXCounter],0 + mov esi,[romdata] + add esi,07FC0h + cmp dword[esi],'FX S' + je .yessfxcounter + cmp dword[esi],'Stun' + jne .nosfxcounter +.yessfxcounter + mov byte[SFXCounter],1 +.nosfxcounter + + ; make table + mov byte[SfxAC],0 + mov eax,[romdata] + cmp dword[eax+02B80h],0AB6CAB6Ch + jne .noac + mov byte[SfxAC],1 +.noac + call UpdateSFX + + pop ebp + pop edi + pop esi + pop ebx + ret + +S9xSuperFXWriteReg: + mov eax,dword[esp+4] + mov ecx,dword[esp+8] + push ebx + push esi + push edi + push ebp + test dword[regptwa+ecx*4-8000h], ~0 + jz .skipwrite + call dword[regptwa+ecx*4-8000h] +.skipwrite: + pop ebp + pop edi + pop esi + pop ebx + ret + +S9xSuperFXReadReg: + mov ecx,dword[esp+4] + push ebx + push esi + push edi + push ebp + test dword[regptra+ecx*4-8000h], ~0 + jz .skipread + call dword[regptra+ecx*4-8000h] +.skipread: + pop ebp + pop edi + pop esi + pop ebx + and eax, 255 +endfx: + ret + +EXTSYM SfxPBR,SCBRrel,SfxSCBR,SfxCOLR,SfxPOR +EXTSYM sfx128lineloc,sfx160lineloc,sfx192lineloc,sfxobjlineloc,sfxclineloc +EXTSYM fxbit01pcal,fxbit23pcal,fxbit45pcal,fxbit67pcal +S9xSuperFXExec: + test byte[SfxSFR],20h + jz endfx + + push ebx + push esi + push edi + push ebp + + xor ebx,ebx + mov bl,[SfxPBR] + mov al,[SfxSCMR] + and bl,7Fh + cmp bl,70h + jae .ram + test al,10h + jz .noaccess + jmp .noram +.ram + test al,08h + jz .noaccess +.noram + mov eax,[NumberOfOpcodes2] + mov [NumberOfOpcodes],eax + call MainLoop +.noaccess + pop ebp + pop edi + pop esi + pop edx + ret + +S9xSuperFXPreSaveState: + mov ecx,dword[SfxCROM] + sub dword[SfxRomBuffer],ecx + mov ecx,dword[SfxRAMMem] + sub dword[SfxLastRamAdr],ecx +; Copy num2writesfxreg bytes from SfxR0 to a free area in RegRAM. + push ebx + mov ecx,SfxR0 + mov edx,dword[RegRAM] + add edx,7000h + mov ebx,[PHnum2writesfxreg] +.loop + mov al,[ecx] + mov [edx],al + inc ecx + inc edx + dec ebx + jnz .loop + pop ebx + mov ecx,dword[SfxCROM] + add dword[SfxRomBuffer],ecx + mov ecx,dword[SfxRAMMem] + add dword[SfxLastRamAdr],ecx + ret + +S9xSuperFXPostSaveState: + ret + +S9xSuperFXPostLoadState: +; Copy num2writesfxreg bytes from a free area in RegRAM to SfxR0 + push ebx + mov ecx,SfxR0 + mov edx,dword[RegRAM] + add edx,7000h + mov ebx,[PHnum2writesfxreg] +.loop + mov al,[edx] + mov [ecx],al + inc ecx + inc edx + dec ebx + jnz .loop + pop ebx + xor ecx,ecx + mov cl,byte[SfxPBR] + mov ecx,dword[SfxMemTable+ecx*4] + mov dword[SfxCPB],ecx + + xor ecx,ecx + mov cl,byte[SfxROMBR] + mov ecx,dword[SfxMemTable+ecx*4] + mov dword[SfxCROM],ecx + + xor ecx,ecx + mov cl,byte[SfxRAMBR] + shl ecx,16 + add ecx,dword[sfxramdata] + mov dword [SfxRAMMem],ecx + + mov ecx,dword[SfxCROM] + add dword[SfxRomBuffer],ecx + mov ecx,dword[SfxRAMMem] + add dword[SfxLastRamAdr],ecx +; Fix for mystery zeroing of SfxnRamBanks, allowing junk RAMBR values to be +; set in turn causing a crash when the code tries to access the junk RAM bank. + mov dword [SfxnRamBanks], 4 + call UpdateSFX + ret + +NEWSYM UpdatePORSCMR + push ebx + push eax + test byte[SfxPOR],10h + jnz .objmode + mov al,[SfxSCMR] + and al,00100100b ; 4 + 32 + cmp al,4 + je .lines160 + cmp al,32 + je .lines192 + cmp al,36 + je .objmode + mov eax,[sfx128lineloc] + jmp .donelines +.lines160 + mov eax,[sfx160lineloc] + jmp .donelines +.lines192 + mov eax,[sfx192lineloc] + jmp .donelines +.objmode + mov eax,[sfxobjlineloc] +.donelines + mov [sfxclineloc],eax + + mov al,[SfxSCMR] + and eax,00000011b + mov bl,[SfxPOR] + and bl,0Fh + shl bl,2 + or al,bl + mov ebx,[PLOTJmpb+eax*4] + mov eax,[PLOTJmpa+eax*4] + mov dword [FxTable+4Ch*4],eax + mov dword [FxTableb+4Ch*4],eax + mov dword [FxTablec+4Ch*4],eax + mov dword [FxTabled+4Ch*4],ebx + pop eax + pop ebx + ret + +NEWSYM UpdateSCBRCOLR + push eax + push ebx + mov ebx,[SfxSCBR] + shl ebx,10 + add ebx,[sfxramdata] + mov [SCBRrel],ebx + mov eax,[SfxCOLR] + mov ebx,[fxbit01+eax*4] + mov [fxbit01pcal],ebx + mov ebx,[fxbit23+eax*4] + mov [fxbit23pcal],ebx + mov ebx,[fxbit45+eax*4] + mov [fxbit45pcal],ebx + mov ebx,[fxbit67+eax*4] + mov [fxbit67pcal],ebx + pop ebx + pop eax + ret + +NEWSYM UpdateCLSR + mov dword [NumberOfOpcodes2],350 ; 0FFFFFFFh;350 + test byte[SfxCLSR],01h + jz .nohighsfx + mov dword [NumberOfOpcodes2],700 ;700 +.nohighsfx + cmp byte[SFXCounter],1 + je .noyi + mov dword [NumberOfOpcodes2],0FFFFFFFh +.noyi + ret + +NEWSYM UpdateSFX + call UpdatePORSCMR + call UpdatePORSCMR + call UpdateCLSR + ret diff --git a/src/i386/zsnesc4.asm b/src/i386/zsnesc4.asm new file mode 100644 index 0000000..97533f7 --- /dev/null +++ b/src/i386/zsnesc4.asm @@ -0,0 +1,103 @@ +; Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. +; +; Super FX assembler emulator code +; (c) Copyright 1998, 1999 zsKnight and _Demo_. +; +; Permission to use, copy, modify and distribute Snes9x in both binary and +; source form, for non-commercial purposes, is hereby granted without fee, +; providing that this license information and copyright notice appear with +; all copies and any derived work. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event shall the authors be held liable for any damages +; arising from the use of this software. +; +; Snes9x is freeware for PERSONAL USE only. Commercial users should +; seek permission of the copyright holders first. Commercial use includes +; charging money for Snes9x or software derived from Snes9x. +; +; The copyright holders request that bug fixes and improvements to the code +; should be forwarded to them so everyone can benefit from the modifications +; in future versions. +; +; Super NES and Super Nintendo Entertainment System are trademarks of +; Nintendo Co., Limited and its subsidiary companies. +; +; ZSNES SuperFX emulation code and wrappers +; (C) Copyright 1997-8 zsKnight and _Demo_ + +; Used with the kind permission of the copyright holders. +; + +%include "src/i386/macros.mac" + +EXTSYM InitC4, C4RegFunction, C4ReadReg, C4WriteReg +EXTSYM romdata + +[BITS 32] +SECTION .data + +NEWSYM C4Ram, dd 0 +NEWSYM C4RamR, dd 0 +NEWSYM C4RamW, dd 0 + +NEWSYM pressed, dd 0 ; used by C4Edit (unused function) +NEWSYM vidbuffer,dd 0 ; used by C4Edit +NEWSYM oamram, times 544 db 0 ; Sprite PPU data used by C4 routines + +; +; Snes9x wrapper functions for the zsnes C4 code +; (C) Copyright 2000 Gary Henderson + +SECTION .data + +%ifdef __DJGPP__ +%define ROM _ROM +%define RegRAM _RegRAM +%define S9xInitC4 _S9xInitC4 +%define S9xSetC4 _S9xSetC4 +%define S9xSetC4RAM _S9xSetC4RAM +%define S9xGetC4 _S9xGetC4 +%define S9xGetC4RAM _S9xGetC4RAM +%endif + +EXTERN ROM +EXTERN RegRAM + +SECTION .text + +NEWSYM S9xInitC4 + pushad + mov eax,dword[ROM] + mov dword[romdata],eax + call InitC4 +; mov eax,dword[RegRAM] +; add eax,06000h +; mov dword[C4Ram],eax + popad + ret + +NEWSYM S9xSetC4 +NEWSYM S9xSetC4RAM + mov ecx, dword[esp+8] + mov eax, dword[esp+4] + and ecx, 0ffffh + push ebx + push esi + push edi + push ebp + sub ecx, 6000h + call C4RegFunction + pop ebp + pop edi + pop esi + pop ebx + ret + +NEWSYM S9xGetC4 +NEWSYM S9xGetC4RAM + mov ecx, dword[esp+4] + xor eax, eax + and ecx, 0ffffh + sub ecx, 06000h + jmp C4ReadReg diff --git a/src/include/3d.h b/src/include/3d.h new file mode 100644 index 0000000..da82860 --- /dev/null +++ b/src/include/3d.h @@ -0,0 +1,150 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _3D_H_ +#define _3D_H_ + +#if defined(USE_OPENGL) +#include +#include + +#ifdef __linux__ +#include +#endif + +typedef struct +{ + bool8 packed_pixels_extension_present; + bool8 draw_cube; + uint32 version; + // Texture format + GLint internal_format; + GLint format; + GLint type; + + GLint max_texture_size;// 256 or 512 + GLint texture_size; + uint32 num_textures; // 1 if max_texture_size == 256, 2 otherwise + GLuint textures [2]; +} OpenGLData; + +extern OpenGLData OpenGL; + +bool8 S9xOpenGLInit (); +bool8 S9xOpenGLInit2 (); +void S9xOpenGLPutImage (int width, int height); +void S9xOpenGLDeinit (); + +#endif + +#ifdef USE_GLIDE +#include + +typedef struct +{ + bool8 voodoo_present; + GrVertex sq[4]; + GrTexInfo texture; + int32 texture_mem_size; + int32 texture_mem_start; + float x_offset, y_offset; + float x_scale, y_scale; + float voodoo_width; + float voodoo_height; +} GlideData; + +extern GlideData Glide; +bool8 S9xGlideEnable (bool8 enable); +void S9xGlideDeinit (); +bool8 S9xGlideInit (); +bool8 S9xVoodooInitialise (); +#endif + +#endif + diff --git a/src/include/65c816.h b/src/include/65c816.h new file mode 100644 index 0000000..a82de8d --- /dev/null +++ b/src/include/65c816.h @@ -0,0 +1,172 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _65c816_h_ +#define _65c816_h_ + +#define AL A.B.l +#define AH A.B.h +#define XL X.B.l +#define XH X.B.h +#define YL Y.B.l +#define YH Y.B.h +#define SL S.B.l +#define SH S.B.h +#define DL D.B.l +#define DH D.B.h +#define PL P.B.l +#define PH P.B.h + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define ClearCarry() (ICPU._Carry = 0) +#define SetCarry() (ICPU._Carry = 1) +#define SetZero() (ICPU._Zero = 0) +#define ClearZero() (ICPU._Zero = 1) +#define SetIRQ() (Registers.PL |= IRQ) +#define ClearIRQ() (Registers.PL &= ~IRQ) +#define SetDecimal() (Registers.PL |= Decimal) +#define ClearDecimal() (Registers.PL &= ~Decimal) +#define SetIndex() (Registers.PL |= IndexFlag) +#define ClearIndex() (Registers.PL &= ~IndexFlag) +#define SetMemory() (Registers.PL |= MemoryFlag) +#define ClearMemory() (Registers.PL &= ~MemoryFlag) +#define SetOverflow() (ICPU._Overflow = 1) +#define ClearOverflow() (ICPU._Overflow = 0) +#define SetNegative() (ICPU._Negative = 0x80) +#define ClearNegative() (ICPU._Negative = 0) + +#define CheckZero() (ICPU._Zero == 0) +#define CheckCarry() (ICPU._Carry) +#define CheckIRQ() (Registers.PL & IRQ) +#define CheckDecimal() (Registers.PL & Decimal) +#define CheckIndex() (Registers.PL & IndexFlag) +#define CheckMemory() (Registers.PL & MemoryFlag) +#define CheckOverflow() (ICPU._Overflow) +#define CheckNegative() (ICPU._Negative & 0x80) +#define CheckEmulation() (Registers.P.W & Emulation) + +#define ClearFlags(f) (Registers.P.W &= ~(f)) +#define SetFlags(f) (Registers.P.W |= (f)) +#define CheckFlag(f) (Registers.PL & (f)) + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 l,h; } B; +#else + struct { uint8 h,l; } B; +#endif + uint16 W; +} pair; + +struct SRegisters{ + uint8 PB; + uint8 DB; + pair P; + pair A; + pair D; + pair S; + pair X; + pair Y; + uint16 PC; +}; + +EXTERN_C struct SRegisters Registers; + +#endif + diff --git a/src/include/apu.h b/src/include/apu.h new file mode 100644 index 0000000..3050b21 --- /dev/null +++ b/src/include/apu.h @@ -0,0 +1,221 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _apu_h_ +#define _apu_h_ + +#include "spc700.h" + +struct SIAPU +{ + uint8 _Carry; + uint8 _Zero; + uint8 _Overflow; + bool8 APUExecuting; + uint8 Bit; + uint8 __pad1__; + uint8 __pad2__; + uint8 __pad3__; + uint32 Address; + uint32 WaitCounter; + uint8 *PC; + uint8 *RAM; + uint8 *DirectPage; + uint8 *WaitAddress1; + uint8 *WaitAddress2; + uint8 *ShadowRAM; + uint8 *CachedSamples; + uint32 TimerErrorCounter; + int32 NextAPUTimerPos; + int32 APUTimerCounter; + uint32 Scanline; + int32 OneCycle; + int32 TwoCycles; +}; + +struct SAPU +{ + int32 Cycles; + bool8 ShowROM; + uint8 Flags; + uint8 KeyedChannels; + uint8 OutPorts [4]; + uint8 DSP [0x80]; + uint8 ExtraRAM [64]; + uint16 Timer [3]; + uint16 TimerTarget [3]; + bool8 TimerEnabled [3]; + bool8 TimerValueWritten [3]; +}; + +EXTERN_C struct SAPU APU; +EXTERN_C struct SIAPU IAPU; +extern int spc_is_dumping; +extern int spc_is_dumping_temp; +extern uint8 spc_dump_dsp[0x100]; +static __inline__ void S9xAPUUnpackStatus() +{ + IAPU._Zero = ((APURegisters.P & Zero) == 0) | (APURegisters.P & Negative); + IAPU._Carry = (APURegisters.P & Carry); + IAPU._Overflow = (APURegisters.P & Overflow) >> 6; +} + +static __inline__ void S9xAPUPackStatus() +{ + APURegisters.P &= ~(Zero | Negative | Carry | Overflow); + APURegisters.P |= IAPU._Carry | ((IAPU._Zero == 0) << 1) | + (IAPU._Zero & 0x80) | (IAPU._Overflow << 6); +} + +START_EXTERN_C +void S9xResetAPU (void); +bool8 S9xInitAPU (); +void S9xDeinitAPU (); +void S9xDecacheSamples (); +int S9xTraceAPU (); +int S9xAPUOPrint (char *buffer, uint16 Address); +void S9xSetAPUControl (uint8 byte); +void S9xSetAPUDSP (uint8 byte); +uint8 S9xGetAPUDSP (); +void S9xSetAPUTimer (uint16 Address, uint8 byte); +void S9xUpdateAPUTimer (void); +bool8 S9xInitSound (int quality, bool8 stereo, int buffer_size); +void S9xOpenCloseSoundTracingFile (bool8); +void S9xPrintAPUState (); +extern int32 S9xAPUCycles [256]; // Scaled cycle lengths +extern int32 S9xAPUCycleLengths [256]; // Raw data. +extern void (*S9xApuOpcodes [256]) (void); +END_EXTERN_C + +extern "C" { void S9xApuExecute(void); } + +#define APU_VOL_LEFT 0x00 +#define APU_VOL_RIGHT 0x01 +#define APU_P_LOW 0x02 +#define APU_P_HIGH 0x03 +#define APU_SRCN 0x04 +#define APU_ADSR1 0x05 +#define APU_ADSR2 0x06 +#define APU_GAIN 0x07 +#define APU_ENVX 0x08 +#define APU_OUTX 0x09 + +#define APU_MVOL_LEFT 0x0c +#define APU_MVOL_RIGHT 0x1c +#define APU_EVOL_LEFT 0x2c +#define APU_EVOL_RIGHT 0x3c +#define APU_KON 0x4c +#define APU_KOFF 0x5c +#define APU_FLG 0x6c +#define APU_ENDX 0x7c + +#define APU_EFB 0x0d +#define APU_PMON 0x2d +#define APU_NON 0x3d +#define APU_EON 0x4d +#define APU_DIR 0x5d +#define APU_ESA 0x6d +#define APU_EDL 0x7d + +#define APU_C0 0x0f +#define APU_C1 0x1f +#define APU_C2 0x2f +#define APU_C3 0x3f +#define APU_C4 0x4f +#define APU_C5 0x5f +#define APU_C6 0x6f +#define APU_C7 0x7f + +#define APU_SOFT_RESET 0x80 +#define APU_MUTE 0x40 +#define APU_ECHO_DISABLED 0x20 + +#define FREQUENCY_MASK 0x3fff +#endif + diff --git a/src/include/apumem.h b/src/include/apumem.h new file mode 100644 index 0000000..8f6dfa4 --- /dev/null +++ b/src/include/apumem.h @@ -0,0 +1,248 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _apumemory_h_ +#define _apumemory_h_ + +START_EXTERN_C +extern uint8 W4; +extern uint8 APUROM[64]; +END_EXTERN_C + +INLINE uint8 S9xAPUGetByteZ (uint8 Address) +{ + if (Address >= 0xf0 && IAPU.DirectPage == IAPU.RAM) + { + if (Address >= 0xf4 && Address <= 0xf7) + { +#ifdef SPC700_SHUTDOWN + IAPU.WaitAddress2 = IAPU.WaitAddress1; + IAPU.WaitAddress1 = IAPU.PC; +#endif + return (IAPU.RAM [Address]); + } + if (Address >= 0xfd) + { +#ifdef SPC700_SHUTDOWN + IAPU.WaitAddress2 = IAPU.WaitAddress1; + IAPU.WaitAddress1 = IAPU.PC; +#endif + uint8 t = IAPU.RAM [Address]; + IAPU.RAM [Address] = 0; + return (t); + } + else + if (Address == 0xf3) + return (S9xGetAPUDSP ()); + + return (IAPU.RAM [Address]); + } + else + return (IAPU.DirectPage [Address]); +} + +INLINE void S9xAPUSetByteZ (uint8 byte, uint8 Address) +{ + if (Address >= 0xf0 && IAPU.DirectPage == IAPU.RAM) + { + if (Address == 0xf3) + S9xSetAPUDSP (byte); + else + if (Address >= 0xf4 && Address <= 0xf7) + APU.OutPorts [Address - 0xf4] = byte; + else + if (Address == 0xf1) + S9xSetAPUControl (byte); + else + if (Address < 0xfd) + { + IAPU.RAM [Address] = byte; + if (Address >= 0xfa) + { + if (byte == 0) + APU.TimerTarget [Address - 0xfa] = 0x100; + else + APU.TimerTarget [Address - 0xfa] = byte; + } + } + } + else + IAPU.DirectPage [Address] = byte; +} + +INLINE uint8 S9xAPUGetByte (uint32 Address) +{ + Address &= 0xffff; + + if (Address <= 0xff && Address >= 0xf0) + { + if (Address >= 0xf4 && Address <= 0xf7) + { +#ifdef SPC700_SHUTDOWN + IAPU.WaitAddress2 = IAPU.WaitAddress1; + IAPU.WaitAddress1 = IAPU.PC; +#endif + return (IAPU.RAM [Address]); + } + else + if (Address == 0xf3) + return (S9xGetAPUDSP ()); + if (Address >= 0xfd) + { +#ifdef SPC700_SHUTDOWN + IAPU.WaitAddress2 = IAPU.WaitAddress1; + IAPU.WaitAddress1 = IAPU.PC; +#endif + uint8 t = IAPU.RAM [Address]; + IAPU.RAM [Address] = 0; + return (t); + } + return (IAPU.RAM [Address]); + } + else + return (IAPU.RAM [Address]); +} + +INLINE void S9xAPUSetByte (uint8 byte, uint32 Address) +{ + Address &= 0xffff; + + if (Address <= 0xff && Address >= 0xf0) + { + if (Address == 0xf3) + S9xSetAPUDSP (byte); + else + if (Address >= 0xf4 && Address <= 0xf7) + APU.OutPorts [Address - 0xf4] = byte; + else + if (Address == 0xf1) + S9xSetAPUControl (byte); + else + if (Address < 0xfd) + { + IAPU.RAM [Address] = byte; + if (Address >= 0xfa) + { + if (byte == 0) + APU.TimerTarget [Address - 0xfa] = 0x100; + else + APU.TimerTarget [Address - 0xfa] = byte; + } + } + } + else + { +#if 0 +if (Address >= 0x2500 && Address <= 0x2504) +printf ("%06d %04x <- %02x\n", ICPU.Scanline, Address, byte); +if (Address == 0x26c6) +{ + extern FILE *apu_trace; + extern FILE *trace; + APU.Flags |= TRACE_FLAG; + CPU.Flags |= TRACE_FLAG; + if (apu_trace == NULL) + apu_trace = fopen ("aputrace.log", "wb"); + if (trace == NULL) + trace = fopen ("trace.log", "wb"); + printf ("TRACING SWITCHED ON\n"); +} +#endif + if (Address < 0xffc0) + IAPU.RAM [Address] = byte; + else + { + APU.ExtraRAM [Address - 0xffc0] = byte; + if (!APU.ShowROM) + IAPU.RAM [Address] = byte; + } + } +} +#endif + diff --git a/src/include/c4.h b/src/include/c4.h new file mode 100644 index 0000000..f7957d4 --- /dev/null +++ b/src/include/c4.h @@ -0,0 +1,124 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _C4_H_ +#define _C4_H_ + +#include "port.h" + +extern "C" { + +extern int16 C4WFXVal; +extern int16 C4WFYVal; +extern int16 C4WFZVal; +extern int16 C4WFX2Val; +extern int16 C4WFY2Val; +extern int16 C4WFDist; +extern int16 C4WFScale; + +void C4TransfWireFrame(); +void C4TransfWireFrame2(); +void C4CalcWireFrame(); + +extern int16 C41FXVal; +extern int16 C41FYVal; +extern int16 C41FAngleRes; +extern int16 C41FDist; +extern int16 C41FDistVal; + +void C4Op1F(); +void C4Op15(); +void C4Op0D(); + +extern int16 C4CosTable[]; +extern int16 C4SinTable[]; + +} + +#endif + diff --git a/src/include/cheats.h b/src/include/cheats.h new file mode 100644 index 0000000..b2db107 --- /dev/null +++ b/src/include/cheats.h @@ -0,0 +1,158 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _CHEATS_H_ +#define _CHEATS_H_ + +struct SCheat +{ + uint32 address; + uint8 byte; + uint8 saved_byte; + bool8 enabled; + bool8 saved; + char name [22]; +}; + +#define MAX_CHEATS 75 + +struct SCheatData +{ + struct SCheat c [MAX_CHEATS]; + uint32 num_cheats; + uint8 CWRAM [0x20000]; + uint8 CSRAM [0x10000]; + uint8 CIRAM [0x2000]; + uint8 *RAM; + uint8 *FillRAM; + uint8 *SRAM; + uint32 WRAM_BITS [0x20000 >> 3]; + uint32 SRAM_BITS [0x10000 >> 3]; + uint32 IRAM_BITS [0x2000 >> 3]; +}; + +typedef enum +{ + S9X_LESS_THAN, S9X_GREATER_THAN, S9X_LESS_THAN_OR_EQUAL, + S9X_GREATER_THAN_OR_EQUAL, S9X_EQUAL, S9X_NOT_EQUAL +} S9xCheatComparisonType; + +typedef enum +{ + S9X_8_BITS, S9X_16_BITS, S9X_24_BITS, S9X_32_BITS +} S9xCheatDataSize; + +void S9xInitCheatData (); + +const char *S9xGameGenieToRaw (const char *code, uint32 *address, uint8 *byte); +const char *S9xProActionReplayToRaw (const char *code, uint32 *address, uint8 *byte); +const char *S9xGoldFingerToRaw (const char *code, uint32 *address, bool8 *sram, + uint8 *num_bytes, uint8 *bytes); +void S9xApplyCheats (); +void S9xApplyCheat (uint32 which1); +void S9xRemoveCheats (); +void S9xRemoveCheat (uint32 which1); +void S9xEnableCheat (uint32 which1); +void S9xDisableCheat (uint32 which1); +void S9xAddCheat (bool8 enable, bool8 save_current_value, uint32 address, + uint8 byte); +void S9xDeleteCheats (); +void S9xDeleteCheat (uint32 which1); +bool8 S9xLoadCheatFile (const char *filename); +bool8 S9xSaveCheatFile (const char *filename); + +void S9xStartCheatSearch (struct SCheatData *); +void S9xSearchForChange (struct SCheatData *, S9xCheatComparisonType cmp, + S9xCheatDataSize size, bool8 is_signed, bool8 update); +void S9xSearchForValue (struct SCheatData *, S9xCheatComparisonType cmp, + S9xCheatDataSize size, uint32 value, + bool8 is_signed, bool8 update); +void S9xOutputCheatSearchResults (struct SCheatData *); + +#endif + diff --git a/src/include/copyright.h b/src/include/copyright.h new file mode 100644 index 0000000..f53dd80 --- /dev/null +++ b/src/include/copyright.h @@ -0,0 +1,159 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code + * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. + * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. + * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). + * + * DOS port code contains the works of other authors. See headers in + * individual files. + * + * Snes9x homepage: http://www.snes9x.com + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996, 1997, 1998, 1999 Gary Henderson (gary@daniver.demon.co.uk) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code (c) Copyright 1997, 1998 Ivar and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ + diff --git a/src/include/cpuaddr.h b/src/include/cpuaddr.h new file mode 100644 index 0000000..aa90920 --- /dev/null +++ b/src/include/cpuaddr.h @@ -0,0 +1,500 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _CPUADDR_H_ +#define _CPUADDR_H_ + +EXTERN_C long OpAddress; + +typedef enum { + NONE = 0, + READ = 1, + WRITE = 2, + MODIFY = 3, + JUMP = 4 +} AccessMode; + +static __inline__ void Immediate8 (AccessMode a) +{ + OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; + CPU.PC++; +} + +static __inline__ void Immediate16 (AccessMode a) +{ + OpAddress = ICPU.ShiftedPB + CPU.PC - CPU.PCBase; + CPU.PC += 2; +} + +static __inline__ void Relative (AccessMode a) +{ + Int8 = *CPU.PC++; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + OpAddress = ((int) (CPU.PC - CPU.PCBase) + Int8) & 0xffff; +} + +static __inline__ void RelativeLong (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = *(uint16 *) CPU.PC; +#else + OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2 + ONE_CYCLE; +#else + CPU.Cycles += 16 + ONE_CYCLE; +#endif +#endif + CPU.PC += 2; + OpAddress += (CPU.PC - CPU.PCBase); + OpAddress &= 0xffff; +} + +static __inline__ void AbsoluteIndexedIndirect (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = (Registers.X.W + *(uint16 *) CPU.PC) & 0xffff; +#else + OpAddress = (Registers.X.W + *CPU.PC + (*(CPU.PC + 1) << 8)) & 0xffff; +#endif +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif + OpenBus = *(CPU.PC + 1); + CPU.PC += 2; + OpAddress = S9xGetWord (ICPU.ShiftedPB + OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); +} + +static __inline__ void AbsoluteIndirectLong (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = *(uint16 *) CPU.PC; +#else + OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif + OpenBus = *(CPU.PC + 1); + CPU.PC += 2; + if(a&READ) { + OpAddress = S9xGetWord (OpAddress) | ((OpenBus=S9xGetByte (OpAddress + 2)) << 16); + } else { + OpAddress = S9xGetWord (OpAddress) | (S9xGetByte (OpAddress + 2) << 16); + } +} + +static __inline__ void AbsoluteIndirect (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = *(uint16 *) CPU.PC; +#else + OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8); +#endif + +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif + OpenBus = *(CPU.PC + 1); + CPU.PC += 2; + OpAddress = S9xGetWord (OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); + OpAddress += ICPU.ShiftedPB; +} + +static __inline__ void Absolute (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = *(uint16 *) CPU.PC + ICPU.ShiftedDB; +#else + OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8) + ICPU.ShiftedDB; +#endif + if(a&READ) OpenBus = *(CPU.PC+1); + CPU.PC += 2; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif +} + +static __inline__ void AbsoluteLong (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = (*(uint32 *) CPU.PC) & 0xffffff; +#else + OpAddress = *CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16); +#endif + if(a&READ) OpenBus = *(CPU.PC+2); + CPU.PC += 3; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#else + CPU.Cycles += 24; +#endif +#endif +} + +static __inline__ void Direct(AccessMode a) +{ + if(a&READ) OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif +// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +} + +static __inline__ void DirectIndirectIndexed (AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + + OpAddress = S9xGetWord (OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); + OpAddress += ICPU.ShiftedDB + Registers.Y.W; + +// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; + // XXX: always add one if STA + // XXX: else Add one cycle if crosses page boundary +} + +static __inline__ void DirectIndirectIndexedLong (AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + + if(a&READ){ + OpAddress = S9xGetWord (OpAddress) + ((OpenBus = S9xGetByte (OpAddress + 2)) << 16) + Registers.Y.W; + } else { + OpAddress = S9xGetWord (OpAddress) + (S9xGetByte (OpAddress + 2) << 16) + Registers.Y.W; + } +// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +} + +static __inline__ void DirectIndexedIndirect(AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + + OpAddress = S9xGetWord (OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); + OpAddress += ICPU.ShiftedDB; + +#ifndef SA1_OPCODES +// if (Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else + CPU.Cycles += ONE_CYCLE; +#endif +} + +static __inline__ void DirectIndexedX (AccessMode a) +{ + if(a&READ) OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W + Registers.X.W); + OpAddress &= CheckEmulation() ? 0xff : 0xffff; + +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + +#ifndef SA1_OPCODES +// if (Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else + CPU.Cycles += ONE_CYCLE; +#endif +} + +static __inline__ void DirectIndexedY (AccessMode a) +{ + if(a&READ) OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W + Registers.Y.W); + OpAddress &= CheckEmulation() ? 0xff : 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + +#ifndef SA1_OPCODES +// if (Registers.DL != 0) +// CPU.Cycles += TWO_CYCLES; +// else + CPU.Cycles += ONE_CYCLE; +#endif +} + +static __inline__ void AbsoluteIndexedX (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.X.W; +#else + OpAddress = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + + Registers.X.W; +#endif + if(a&READ) OpenBus = *(CPU.PC+1); + CPU.PC += 2; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif + // XXX: always add one cycle for ROL, LSR, etc + // XXX: else is cross page boundary add one cycle +} + +static __inline__ void AbsoluteIndexedY (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = ICPU.ShiftedDB + *(uint16 *) CPU.PC + Registers.Y.W; +#else + OpAddress = ICPU.ShiftedDB + *CPU.PC + (*(CPU.PC + 1) << 8) + + Registers.Y.W; +#endif + if(a&READ) OpenBus = *(CPU.PC+1); + CPU.PC += 2; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2; +#else + CPU.Cycles += 16; +#endif +#endif + // XXX: always add cycle for STA + // XXX: else is cross page boundary add one cycle +} + +static __inline__ void AbsoluteLongIndexedX (AccessMode a) +{ +#ifdef FAST_LSB_WORD_ACCESS + OpAddress = (*(uint32 *) CPU.PC + Registers.X.W) & 0xffffff; +#else + OpAddress = (*CPU.PC + (*(CPU.PC + 1) << 8) + (*(CPU.PC + 2) << 16) + Registers.X.W) & 0xffffff; +#endif + if(a&READ) OpenBus = *(CPU.PC+2); + CPU.PC += 3; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeedx2 + CPU.MemSpeed; +#else + CPU.Cycles += 24; +#endif +#endif +} + +static __inline__ void DirectIndirect (AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + OpAddress = S9xGetWord (OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); + OpAddress += ICPU.ShiftedDB; + +// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +} + +static __inline__ void DirectIndirectLong (AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.D.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; +#else + CPU.Cycles += 8; +#endif +#endif + if(a&READ){ + OpAddress = S9xGetWord (OpAddress) + ((OpenBus=S9xGetByte (OpAddress + 2)) << 16); + } else { + OpAddress = S9xGetWord (OpAddress) + (S9xGetByte (OpAddress + 2) << 16); + } +// if (Registers.DL != 0) CPU.Cycles += ONE_CYCLE; +} + +static __inline__ void StackRelative (AccessMode a) +{ + if(a&READ) OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; + CPU.Cycles += ONE_CYCLE; +#else + CPU.Cycles += 14; +#endif +#endif +} + +static __inline__ void StackRelativeIndirectIndexed (AccessMode a) +{ + OpenBus = *CPU.PC; + OpAddress = (*CPU.PC++ + Registers.S.W) & 0xffff; +#ifndef SA1_OPCODES +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CPU.MemSpeed; + CPU.Cycles += TWO_CYCLES; +#else + CPU.Cycles += 20; +#endif +#endif + OpAddress = S9xGetWord (OpAddress); + if(a&READ) OpenBus = (uint8)(OpAddress>>8); + OpAddress = (OpAddress + ICPU.ShiftedDB + + Registers.Y.W) & 0xffffff; +} +#endif + diff --git a/src/include/cpuexec.h b/src/include/cpuexec.h new file mode 100644 index 0000000..d94cf7f --- /dev/null +++ b/src/include/cpuexec.h @@ -0,0 +1,242 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _CPUEXEC_H_ +#define _CPUEXEC_H_ +#include "ppu.h" +#include "memmap.h" +#include "65c816.h" + +#ifdef USE_ALWAYS_APU_SYNC +#define DO_HBLANK_APU() +#else +#define DO_HBLANK_APU() S9xApuExecute() +#endif + +#define DO_HBLANK_CHECK() \ + if (CPU.Cycles >= CPU.NextEvent) { \ + DO_HBLANK_APU(); \ + S9xDoHBlankProcessing (); \ + } + +struct SOpcodes { +#ifdef __WIN32__ + void (__cdecl *S9xOpcode)( void); +#else + void (*S9xOpcode)( void); +#endif +}; + +struct SICPU +{ + uint8 *Speed; + struct SOpcodes *S9xOpcodes; + uint8 _Carry; + uint8 _Zero; + uint8 _Negative; + uint8 _Overflow; + bool8 CPUExecuting; + uint32 ShiftedPB; + uint32 ShiftedDB; + uint32 Frame; + uint32 Scanline; + uint32 FrameAdvanceCount; +}; + +START_EXTERN_C +void S9xMainLoop (void); +void S9xReset (void); +void S9xSoftReset (void); +void S9xDoHBlankProcessing (); +void S9xClearIRQ (uint32); +void S9xSetIRQ (uint32); + +extern struct SOpcodes S9xOpcodesE1 [256]; +extern struct SOpcodes S9xOpcodesM1X1 [256]; +extern struct SOpcodes S9xOpcodesM1X0 [256]; +extern struct SOpcodes S9xOpcodesM0X1 [256]; +extern struct SOpcodes S9xOpcodesM0X0 [256]; + +extern struct SICPU ICPU; +END_EXTERN_C + +static __inline__ void S9xUnpackStatus() +{ + ICPU._Zero = (Registers.PL & Zero) == 0; + ICPU._Negative = (Registers.PL & Negative); + ICPU._Carry = (Registers.PL & Carry); + ICPU._Overflow = (Registers.PL & Overflow) >> 6; +} + +static __inline__ void S9xPackStatus() +{ + Registers.PL &= ~(Zero | Negative | Carry | Overflow); + Registers.PL |= ICPU._Carry | ((ICPU._Zero == 0) << 1) | + (ICPU._Negative & 0x80) | (ICPU._Overflow << 6); +} + +static __inline__ void CLEAR_IRQ_SOURCE (uint32 M) +{ + CPU.IRQActive &= ~M; + if (!CPU.IRQActive) + CPU.Flags &= ~IRQ_PENDING_FLAG; +} + +static __inline__ void S9xFixCycles () +{ + if (CheckEmulation ()) + { + ICPU.S9xOpcodes = S9xOpcodesE1; + } + else + if (CheckMemory ()) + { + if (CheckIndex ()) + { + ICPU.S9xOpcodes = S9xOpcodesM1X1; + } + else + { + ICPU.S9xOpcodes = S9xOpcodesM1X0; + } + } + else + { + if (CheckIndex ()) + { + ICPU.S9xOpcodes = S9xOpcodesM0X1; + } + else + { + ICPU.S9xOpcodes = S9xOpcodesM0X0; + } + } +} + +static __inline__ void S9xReschedule () +{ + uint8 which; + long max; + + if (CPU.WhichEvent == HBLANK_START_EVENT || + CPU.WhichEvent == HTIMER_AFTER_EVENT) + { + which = HBLANK_END_EVENT; + max = Settings.H_Max; + } + else + { +#ifndef USE_HDMA_EVENT + if (!IPPU.HDMA) { + which = HBLANK_END_EVENT; + max = Settings.H_Max; + } else +#endif + { + which = HBLANK_START_EVENT; + max = Settings.HBlankStart; + } + } + + if (PPU.HTimerEnabled && + (long) PPU.HTimerPosition < max && + (long) PPU.HTimerPosition > CPU.NextEvent && + (!PPU.VTimerEnabled || + (PPU.VTimerEnabled && CPU.V_Counter == PPU.IRQVBeamPos))) + { + which = (long) PPU.HTimerPosition < Settings.HBlankStart ? + HTIMER_BEFORE_EVENT : HTIMER_AFTER_EVENT; + max = PPU.HTimerPosition; + } + CPU.NextEvent = max; + CPU.WhichEvent = which; +} + +#endif + diff --git a/src/include/cpumacro.h b/src/include/cpumacro.h new file mode 100644 index 0000000..a55eb02 --- /dev/null +++ b/src/include/cpumacro.h @@ -0,0 +1,892 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _CPUMACRO_H_ +#define _CPUMACRO_H_ + +static __inline__ void SetZN16 (uint16 Work) +{ + ICPU._Zero = Work != 0; + ICPU._Negative = (uint8) (Work >> 8); +} + +static __inline__ void SetZN8 (uint8 Work) +{ + ICPU._Zero = Work; + ICPU._Negative = Work; +} + +static __inline__ void ADC8 () +{ + Work8 = S9xGetByte (OpAddress); + + if (CheckDecimal ()) + { + A1 = (Registers.A.W) & 0xF; + A2 = (Registers.A.W >> 4) & 0xF; + W1 = Work8 & 0xF; + W2 = (Work8 >> 4) & 0xF; + + A1 += W1 + CheckCarry(); + if (A1 > 9) + { + A1 -= 10; + A1 &= 0xF; + A2++; + } + + A2 += W2; + if (A2 > 9) + { + A2 -= 10; + A2 &= 0xF; + SetCarry (); + } + else + { + ClearCarry (); + } + + Ans8 = (A2 << 4) | A1; + if (~(Registers.AL ^ Work8) & + (Work8 ^ Ans8) & 0x80) + SetOverflow(); + else + ClearOverflow(); + Registers.AL = Ans8; + SetZN8 (Registers.AL); + } + else + { + Ans16 = Registers.AL + Work8 + CheckCarry(); + + ICPU._Carry = Ans16 >= 0x100; + + if (~(Registers.AL ^ Work8) & + (Work8 ^ (uint8) Ans16) & 0x80) + SetOverflow(); + else + ClearOverflow(); + Registers.AL = (uint8) Ans16; + SetZN8 (Registers.AL); + + } +} + +static __inline__ void ADC16 () +{ + Work16 = S9xGetWord (OpAddress); + + if (CheckDecimal ()) + { + A1 = (Registers.A.W) & 0xF; + A2 = (Registers.A.W >> 4) & 0xF; + A3 = (Registers.A.W >> 8) & 0xF; + A4 = (Registers.A.W >> 12) & 0xF; + W1 = Work16 & 0xF; + W2 = (Work16 >> 4) & 0xF; + W3 = (Work16 >> 8) & 0xF; + W4 = (Work16 >> 12) & 0xF; + + A1 += W1 + CheckCarry (); + if (A1 > 9) + { + A1 -= 10; + A1 &= 0xF; + A2++; + } + + A2 += W2; + if (A2 > 9) + { + A2 -= 10; + A2 &= 0xF; + A3++; + } + + A3 += W3; + if (A3 > 9) + { + A3 -= 10; + A3 &= 0xF; + A4++; + } + + A4 += W4; + if (A4 > 9) + { + A4 -= 10; + A4 &= 0xF; + SetCarry (); + } + else + { + ClearCarry (); + } + + Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); + if (~(Registers.A.W ^ Work16) & + (Work16 ^ Ans16) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + Registers.A.W = Ans16; + SetZN16 (Registers.A.W); + } + else + { + Ans32 = Registers.A.W + Work16 + CheckCarry(); + + ICPU._Carry = Ans32 >= 0x10000; + + if (~(Registers.A.W ^ Work16) & + (Work16 ^ (uint16) Ans32) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + Registers.A.W = (uint16) Ans32; + SetZN16 (Registers.A.W); + } +} + +static __inline__ void AND16 () +{ + Registers.A.W &= S9xGetWord (OpAddress); + SetZN16 (Registers.A.W); +} + +static __inline__ void AND8 () +{ + Registers.AL &= S9xGetByte (OpAddress); + SetZN8 (Registers.AL); +} + +static __inline__ void A_ASL16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU._Carry = (Registers.AH & 0x80) != 0; + Registers.A.W <<= 1; + SetZN16 (Registers.A.W); +} + +static __inline__ void A_ASL8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU._Carry = (Registers.AL & 0x80) != 0; + Registers.AL <<= 1; + SetZN8 (Registers.AL); +} + +static __inline__ void ASL16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetWord (OpAddress); + ICPU._Carry = (Work16 & 0x8000) != 0; + Work16 <<= 1; + //S9xSetWord (Work16, OpAddress); + S9xSetByte(Work16>>8, OpAddress+1); + S9xSetByte(Work16&0xFF, OpAddress); + SetZN16 (Work16); +} + +static __inline__ void ASL8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work8 = S9xGetByte (OpAddress); + ICPU._Carry = (Work8 & 0x80) != 0; + Work8 <<= 1; + S9xSetByte (Work8, OpAddress); + SetZN8 (Work8); +} + +static __inline__ void BIT16 () +{ + Work16 = S9xGetWord (OpAddress); + ICPU._Overflow = (Work16 & 0x4000) != 0; + ICPU._Negative = (uint8) (Work16 >> 8); + ICPU._Zero = (Work16 & Registers.A.W) != 0; +} + +static __inline__ void BIT8 () +{ + Work8 = S9xGetByte (OpAddress); + ICPU._Overflow = (Work8 & 0x40) != 0; + ICPU._Negative = Work8; + ICPU._Zero = Work8 & Registers.AL; +} + +static __inline__ void CMP16 () +{ + Int32 = (long) Registers.A.W - + (long) S9xGetWord (OpAddress); + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); +} + +static __inline__ void CMP8 () +{ + Int16 = (short) Registers.AL - + (short) S9xGetByte (OpAddress); + ICPU._Carry = Int16 >= 0; + SetZN8 ((uint8) Int16); +} + +static __inline__ void CMX16 () +{ + Int32 = (long) Registers.X.W - + (long) S9xGetWord (OpAddress); + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); +} + +static __inline__ void CMX8 () +{ + Int16 = (short) Registers.XL - + (short) S9xGetByte (OpAddress); + ICPU._Carry = Int16 >= 0; + SetZN8 ((uint8) Int16); +} + +static __inline__ void CMY16 () +{ + Int32 = (long) Registers.Y.W - + (long) S9xGetWord (OpAddress); + ICPU._Carry = Int32 >= 0; + SetZN16 ((uint16) Int32); +} + +static __inline__ void CMY8 () +{ + Int16 = (short) Registers.YL - + (short) S9xGetByte (OpAddress); + ICPU._Carry = Int16 >= 0; + SetZN8 ((uint8) Int16); +} + +static __inline__ void A_DEC16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.A.W--; + SetZN16 (Registers.A.W); +} + +static __inline__ void A_DEC8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.AL--; + SetZN8 (Registers.AL); +} + +static __inline__ void DEC16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Work16 = S9xGetWord (OpAddress) - 1; + //S9xSetWord (Work16, OpAddress); + S9xSetByte (Work16>>8, OpAddress+1); + S9xSetByte (Work16&0xFF, OpAddress); + SetZN16 (Work16); +} + +static __inline__ void DEC8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Work8 = S9xGetByte (OpAddress) - 1; + S9xSetByte (Work8, OpAddress); + SetZN8 (Work8); +} + +static __inline__ void EOR16 () +{ + Registers.A.W ^= S9xGetWord (OpAddress); + SetZN16 (Registers.A.W); +} + +static __inline__ void EOR8 () +{ + Registers.AL ^= S9xGetByte (OpAddress); + SetZN8 (Registers.AL); +} + +static __inline__ void A_INC16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.A.W++; + SetZN16 (Registers.A.W); +} + +static __inline__ void A_INC8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Registers.AL++; + SetZN8 (Registers.AL); +} + +static __inline__ void INC16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Work16 = S9xGetWord (OpAddress) + 1; + //S9xSetWord (Work16, OpAddress); + S9xSetByte (Work16>>8, OpAddress+1); + S9xSetByte (Work16&0xFF, OpAddress); + SetZN16 (Work16); +} + +static __inline__ void INC8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = NULL; +#endif + + Work8 = S9xGetByte (OpAddress) + 1; + S9xSetByte (Work8, OpAddress); + SetZN8 (Work8); +} + +static __inline__ void LDA16 () +{ + Registers.A.W = S9xGetWord (OpAddress); + SetZN16 (Registers.A.W); +} + +static __inline__ void LDA8 () +{ + Registers.AL = S9xGetByte (OpAddress); + SetZN8 (Registers.AL); +} + +static __inline__ void LDX16 () +{ + Registers.X.W = S9xGetWord (OpAddress); + SetZN16 (Registers.X.W); +} + +static __inline__ void LDX8 () +{ + Registers.XL = S9xGetByte (OpAddress); + SetZN8 (Registers.XL); +} + +static __inline__ void LDY16 () +{ + Registers.Y.W = S9xGetWord (OpAddress); + SetZN16 (Registers.Y.W); +} + +static __inline__ void LDY8 () +{ + Registers.YL = S9xGetByte (OpAddress); + SetZN8 (Registers.YL); +} + +static __inline__ void A_LSR16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU._Carry = Registers.AL & 1; + Registers.A.W >>= 1; + SetZN16 (Registers.A.W); +} + +static __inline__ void A_LSR8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + ICPU._Carry = Registers.AL & 1; + Registers.AL >>= 1; + SetZN8 (Registers.AL); +} + +static __inline__ void LSR16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetWord (OpAddress); + ICPU._Carry = Work16 & 1; + Work16 >>= 1; + //S9xSetWord (Work16, OpAddress); + S9xSetByte (Work16>>8, OpAddress+1); + S9xSetByte (Work16&0xFF, OpAddress); + SetZN16 (Work16); +} + +static __inline__ void LSR8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work8 = S9xGetByte (OpAddress); + ICPU._Carry = Work8 & 1; + Work8 >>= 1; + S9xSetByte (Work8, OpAddress); + SetZN8 (Work8); +} + +static __inline__ void ORA16 () +{ + Registers.A.W |= S9xGetWord (OpAddress); + SetZN16 (Registers.A.W); +} + +static __inline__ void ORA8 () +{ + Registers.AL |= S9xGetByte (OpAddress); + SetZN8 (Registers.AL); +} + +static __inline__ void A_ROL16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work32 = (Registers.A.W << 1) | CheckCarry(); + ICPU._Carry = Work32 >= 0x10000; + Registers.A.W = (uint16) Work32; + SetZN16 ((uint16) Work32); +} + +static __inline__ void A_ROL8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = Registers.AL; + Work16 <<= 1; + Work16 |= CheckCarry(); + ICPU._Carry = Work16 >= 0x100; + Registers.AL = (uint8) Work16; + SetZN8 ((uint8) Work16); +} + +static __inline__ void ROL16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work32 = S9xGetWord (OpAddress); + Work32 <<= 1; + Work32 |= CheckCarry(); + ICPU._Carry = Work32 >= 0x10000; + //S9xSetWord ((uint16) Work32, OpAddress); + S9xSetByte((Work32>>8)&0xFF, OpAddress+1); + S9xSetByte(Work32&0xFF, OpAddress); + SetZN16 ((uint16) Work32); +} + +static __inline__ void ROL8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetByte (OpAddress); + Work16 <<= 1; + Work16 |= CheckCarry (); + ICPU._Carry = Work16 >= 0x100; + S9xSetByte ((uint8) Work16, OpAddress); + SetZN8 ((uint8) Work16); +} + +static __inline__ void A_ROR16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work32 = Registers.A.W; + Work32 |= (int) CheckCarry() << 16; + ICPU._Carry = (uint8) (Work32 & 1); + Work32 >>= 1; + Registers.A.W = (uint16) Work32; + SetZN16 ((uint16) Work32); +} + +static __inline__ void A_ROR8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = Registers.AL | ((uint16) CheckCarry() << 8); + ICPU._Carry = (uint8) Work16 & 1; + Work16 >>= 1; + Registers.AL = (uint8) Work16; + SetZN8 ((uint8) Work16); +} + +static __inline__ void ROR16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work32 = S9xGetWord (OpAddress); + Work32 |= (int) CheckCarry() << 16; + ICPU._Carry = (uint8) (Work32 & 1); + Work32 >>= 1; + //S9xSetWord ((uint16) Work32, OpAddress); + S9xSetByte ( (Work32>>8)&0x00FF, OpAddress+1); + S9xSetByte (Work32&0x00FF, OpAddress); + SetZN16 ((uint16) Work32); +} + +static __inline__ void ROR8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetByte (OpAddress); + Work16 |= (int) CheckCarry () << 8; + ICPU._Carry = (uint8) (Work16 & 1); + Work16 >>= 1; + S9xSetByte ((uint8) Work16, OpAddress); + SetZN8 ((uint8) Work16); +} + +static __inline__ void SBC16 () +{ + Work16 = S9xGetWord (OpAddress); + + if (CheckDecimal ()) + { + A1 = (Registers.A.W) & 0xF; + A2 = (Registers.A.W >> 4) & 0xF; + A3 = (Registers.A.W >> 8) & 0xF; + A4 = (Registers.A.W >> 12) & 0xF; + W1 = Work16 & 0xF; + W2 = (Work16 >> 4) & 0xF; + W3 = (Work16 >> 8) & 0xF; + W4 = (Work16 >> 12) & 0xF; + + A1 -= W1 + !CheckCarry (); + A2 -= W2; + A3 -= W3; + A4 -= W4; + if (A1 > 9) + { + A1 += 10; + A2--; + } + if (A2 > 9) + { + A2 += 10; + A3--; + } + if (A3 > 9) + { + A3 += 10; + A4--; + } + if (A4 > 9) + { + A4 += 10; + ClearCarry (); + } + else + { + SetCarry (); + } + + Ans16 = (A4 << 12) | (A3 << 8) | (A2 << 4) | (A1); + if ((Registers.A.W ^ Work16) & + (Registers.A.W ^ Ans16) & 0x8000) + SetOverflow(); + else + ClearOverflow(); + Registers.A.W = Ans16; + SetZN16 (Registers.A.W); + } + else + { + + Int32 = (long) Registers.A.W - (long) Work16 + (long) CheckCarry() - 1; + + ICPU._Carry = Int32 >= 0; + + if ((Registers.A.W ^ Work16) & + (Registers.A.W ^ (uint16) Int32) & 0x8000) + SetOverflow(); + else + ClearOverflow (); + Registers.A.W = (uint16) Int32; + SetZN16 (Registers.A.W); + } +} + +static __inline__ void SBC8 () +{ + Work8 = S9xGetByte (OpAddress); + if (CheckDecimal ()) + { + A1 = (Registers.A.W) & 0xF; + A2 = (Registers.A.W >> 4) & 0xF; + W1 = Work8 & 0xF; + W2 = (Work8 >> 4) & 0xF; + + A1 -= W1 + !CheckCarry (); + A2 -= W2; + if (A1 > 9) + { + A1 += 10; + A2--; + } + if (A2 > 9) + { + A2 += 10; + ClearCarry (); + } + else + { + SetCarry (); + } + + Ans8 = (A2 << 4) | A1; + if ((Registers.AL ^ Work8) & + (Registers.AL ^ Ans8) & 0x80) + SetOverflow (); + else + ClearOverflow (); + Registers.AL = Ans8; + SetZN8 (Registers.AL); + } + else + { + Int16 = (short) Registers.AL - (short) Work8 + (short) CheckCarry() - 1; + + ICPU._Carry = Int16 >= 0; + if ((Registers.AL ^ Work8) & + (Registers.AL ^ (uint8) Int16) & 0x80) + SetOverflow (); + else + ClearOverflow (); + Registers.AL = (uint8) Int16; + SetZN8 (Registers.AL); + } +} + +static __inline__ void STA16 () +{ + S9xSetWord (Registers.A.W, OpAddress); +} + +static __inline__ void STA8 () +{ + S9xSetByte (Registers.AL, OpAddress); +} + +static __inline__ void STX16 () +{ + S9xSetWord (Registers.X.W, OpAddress); +} + +static __inline__ void STX8 () +{ + S9xSetByte (Registers.XL, OpAddress); +} + +static __inline__ void STY16 () +{ + S9xSetWord (Registers.Y.W, OpAddress); +} + +static __inline__ void STY8 () +{ + S9xSetByte (Registers.YL, OpAddress); +} + +static __inline__ void STZ16 () +{ + S9xSetWord (0, OpAddress); +} + +static __inline__ void STZ8 () +{ + S9xSetByte (0, OpAddress); +} + +static __inline__ void TSB16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetWord (OpAddress); + ICPU._Zero = (Work16 & Registers.A.W) != 0; + Work16 |= Registers.A.W; + //S9xSetWord (Work16, OpAddress); + S9xSetByte (Work16>>8, OpAddress+1); + S9xSetByte (Work16&0xFF, OpAddress); +} + +static __inline__ void TSB8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work8 = S9xGetByte (OpAddress); + ICPU._Zero = Work8 & Registers.AL; + Work8 |= Registers.AL; + S9xSetByte (Work8, OpAddress); +} + +static __inline__ void TRB16 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work16 = S9xGetWord (OpAddress); + ICPU._Zero = (Work16 & Registers.A.W) != 0; + Work16 &= ~Registers.A.W; + //S9xSetWord (Work16, OpAddress); + S9xSetByte (Work16>>8, OpAddress+1); + S9xSetByte (Work16&0xFF, OpAddress); +} + +static __inline__ void TRB8 () +{ +#ifndef SA1_OPCODES + CPU.Cycles += ONE_CYCLE; +#endif + Work8 = S9xGetByte (OpAddress); + ICPU._Zero = Work8 & Registers.AL; + Work8 &= ~Registers.AL; + S9xSetByte (Work8, OpAddress); +} +#endif + diff --git a/src/include/cpuops.h b/src/include/cpuops.h new file mode 100644 index 0000000..8b59dbb --- /dev/null +++ b/src/include/cpuops.h @@ -0,0 +1,100 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _CPUOPS_H_ +#define _CPUOPS_H_ +void S9xOpcode_NMI (); +void S9xOpcode_IRQ (); + +#define CHECK_FOR_IRQ() \ +if (CPU.IRQActive && !CheckFlag (IRQ) && !Settings.DisableIRQ) \ + S9xOpcode_IRQ() + +#endif + diff --git a/src/include/debug.h b/src/include/debug.h new file mode 100644 index 0000000..cdc1541 --- /dev/null +++ b/src/include/debug.h @@ -0,0 +1,113 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +START_EXTERN_C +void S9xDoDebug (); +void S9xTrace (); +void S9xSA1Trace (); +void S9xTraceMessage (const char *); + +// Structures +struct SBreakPoint{ + bool8 Enabled; + uint8 Bank; + uint16 Address; +}; + +uint8 S9xOPrint( char *Line, uint8 Bank, uint16 Address); +uint8 S9xSA1OPrint( char *Line, uint8 Bank, uint16 Address); + +extern struct SBreakPoint S9xBreakpoint[ 6]; +extern char *S9xMnemonics[256]; +END_EXTERN_C +#endif + diff --git a/src/include/display.h b/src/include/display.h new file mode 100644 index 0000000..4b07e12 --- /dev/null +++ b/src/include/display.h @@ -0,0 +1,136 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _DISPLAY_H_ +#define _DISPLAY_H_ + +START_EXTERN_C +// Routines the port specific code has to implement +#define S9xSetPalette() +#define S9xTextMode() +#define S9xGraphicsMode() +#define S9xParseArgs(ARGV, ARGC) NULL +#define S9xParseArg(ARGV,INDEX,ARGC) +#define S9xExtraUsage() +uint32 S9xReadJoypad (int which1_0_to_4); +#define S9xReadMousePosition(WH,X,Y,BU) false +#define S9xReadSuperScopePosition(X,Y,BU) false + +void S9xUsage (); +void S9xInitDisplay (int argc, char **argv); +void S9xDeinitDisplay (); +void S9xInitInputDevices (); +#define S9xSetTitle(TLT) +void S9xProcessEvents (bool8 block); +void S9xPutImage (int width, int height); +#define S9xParseDisplayArg(ARGV,INDEX,ARGC) +void S9xToggleSoundChannel (int channel); +void S9xSetInfoString (const char *string); +#define S9xMinCommandLineArgs() +void S9xNextController (); +bool8 S9xLoadROMImage (const char *string); +#define S9xSelectFilename (DEF,DR,EX,TLT) NULL + +const char *S9xChooseFilename (bool8 read_only); +bool8 S9xOpenSnapshotFile (const char *base, bool8 read_only, STREAM *file); +void S9xCloseSnapshotFile (STREAM file); + +const char *S9xBasename (const char *filename); + +int S9xFStrcmp (FILE *, const char *); +const char *S9xGetHomeDirectory (); +const char *S9xGetSnapshotDirectory (); +const char *S9xGetROMDirectory (); +const char *S9xGetSRAMFilename (); +const char *S9xGetFilename (const char *extension); +const char *S9xGetFilenameInc (const char *); +END_EXTERN_C + +#endif + diff --git a/src/include/dma.h b/src/include/dma.h new file mode 100644 index 0000000..a95f20e --- /dev/null +++ b/src/include/dma.h @@ -0,0 +1,101 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _DMA_H_ +#define _DMA_H_ + +START_EXTERN_C +void S9xResetDMA (void); +uint8 S9xDoHDMA (uint8); +void S9xStartHDMA (); +void S9xDoDMA (uint8); +END_EXTERN_C + +#endif + diff --git a/src/include/dsp1.h b/src/include/dsp1.h new file mode 100644 index 0000000..72e8957 --- /dev/null +++ b/src/include/dsp1.h @@ -0,0 +1,138 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _DSP1_H_ +#define _DSP1_H_ + +#ifdef USE_OLD_DSP1 +#include "dsp1_old.h" +#else + +extern void (*SetDSP)(uint8, uint16); +extern uint8 (*GetDSP)(uint16); + +void DSP1SetByte(uint8 byte, uint16 address); +uint8 DSP1GetByte(uint16 address); + +void DSP2SetByte(uint8 byte, uint16 address); +uint8 DSP2GetByte(uint16 address); + +void DSP3SetByte(uint8 byte, uint16 address); +uint8 DSP3GetByte(uint16 address); +void DSP3_Reset(); + +void DSP4SetByte(uint8 byte, uint16 address); +uint8 DSP4GetByte(uint16 address); + +struct SDSP1 { + uint8 version; + bool8 waiting4command; + bool8 first_parameter; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters [512]; + uint8 output [512]; +}; + +START_EXTERN_C +void S9xResetDSP1 (); +uint8 S9xGetDSP (uint16 Address); +void S9xSetDSP (uint8 Byte, uint16 Address); +END_EXTERN_C + +#ifndef NOW_IN_GLOBALS +extern struct SDSP1 DSP1; +#endif + +#endif + +#endif diff --git a/src/include/dsp1_old.h b/src/include/dsp1_old.h new file mode 100644 index 0000000..05db4c2 --- /dev/null +++ b/src/include/dsp1_old.h @@ -0,0 +1,244 @@ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code + * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. + * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. + * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). + * + * DOS port code contains the works of other authors. See headers in + * individual files. + * + * Snes9x homepage: http://www.snes9x.com + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ +#ifndef _DSP1_OLD_H_ +#define _DSP1_NEW_H_ + +#define bool8_32 int + +// Simple vector and matrix types +typedef double MATRIX[3][3]; +typedef double VECTOR[3]; + +enum AttitudeMatrix { MatrixA, MatrixB, MatrixC }; + +struct SDSP1 { + bool8_32 waiting4command; + bool8_32 first_parameter; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint16 parameters [10]; + uint16 output [10]; + + // Attitude matrices + MATRIX vMa; + MATRIX vMb; + MATRIX vMc; + + // Matrix and translaton vector for + // transforming a 3D position into the global coordinate system, + // from the view space coordinate system. + MATRIX vM; + VECTOR vT; + + // Focal distance + double vFov; + + // A precalculated value for optimization + double vPlaneD; + + // Raster position of horizon + double vHorizon; + + // Convert a 2D screen coordinate to a 3D ground coordinate in global coordinate system. + void ScreenToGround(VECTOR &v, double X2d, double Y2d); + + MATRIX &GetMatrix( AttitudeMatrix Matrix ); +}; + +///////////////// DSP Commands //////////////////// + +// DSP1 Command 02h +struct DSP1_Parameter +{ + DSP1_Parameter( int16 Fx, int16 Fy, int16 Fz, + uint16 Lfe, uint16 Les, + int8 Aas, int8 Azs ); + + // Raster number of imaginary center + int16 Vof; // -32768 ~ +32767 + + // Raster number representing + // horizontal line. + int16 Vva; // -32768 ~ +32767 + + // X,Y coordinate of the point + // projected on the center of the screen + // (ground coordinate) + int16 Cx; // -32768 ~ +32767 + int16 Cy; // -32768 ~ +32767 +}; + +// DSP1 Command 0Ah +struct DSP1_Raster +{ + DSP1_Raster( int16 Vs ); + + // Linear transformation matrix elements + // for each raster + int16 An; + int16 Bn; + int16 Cn; + int16 Dn; +}; + +// DSP1 Command 06h +struct DSP1_Project +{ + DSP1_Project( int16 x, int16 y, int16 z ); + + int16 H; + int16 V; + int16 M; +}; + +// DSP1 Command 0Eh +struct DSP1_Target +{ + DSP1_Target( int16 h, int16 v ); + + int16 X; + int16 Y; +}; + +// DSP1 Command 04h +struct DSP1_Triangle +{ + DSP1_Triangle (int16 Theta, int16 r ); + int16 S; + int16 C; +}; + +// DSP1 Command 08h +struct DSP1_Radius +{ + DSP1_Radius( int16 x, int16 y, int16 z ); + int16 Ll; + int16 Lh; +}; + +// DSP1 Command 18h +int16 DSP1_Range( int16 x, int16 y, int16 z, int16 r ); + +// DSP1 Command 28h +int16 DSP1_Distance( int16 x, int16 y, int16 z ); + +// DSP1 Command 0Ch +struct DSP1_Rotate +{ + DSP1_Rotate (int16 A, int16 x1, int16 y1); + + int16 x2; + int16 y2; +}; + +// DSP1 Command 1Ch +struct DSP1_Polar +{ + DSP1_Polar( int8 Za, int8 Xa, int8 Ya, int16 x, int16 y, int16 z ); + + int16 X; + int16 Y; + int16 Z; +}; + +// DSP1 Command 01h, 11h and 21h +void DSP1_Attitude( int16 m, int8 Za, int8 Xa, int8 Ya, AttitudeMatrix Matrix ); + +// DSP1 Command 0Dh, 1Dh and 2Dh +struct DSP1_Objective +{ + DSP1_Objective( int16 x, int16 y, int16 z, AttitudeMatrix Matrix ); + + int16 F; + int16 L; + int16 U; +}; + +// DSP1 Command 03h, 13h and 23h +struct DSP1_Subjective +{ + DSP1_Subjective( int16 F, int16 L, int16 U, AttitudeMatrix Matrix ); + + int16 X; + int16 Y; + int16 Z; +}; + +// DSP1 Command 0Bh, 1Bh and 2Bh +int16 DSP1_Scalar( int16 x, int16 y, int16 z, AttitudeMatrix Matrix ); + +// DSP1 Command 14h +struct DSP1_Gyrate +{ + DSP1_Gyrate( int8 Zi, int8 Xi, int8 Yi, + int8 dU, int8 dF, int8 dL ); + + int8 Z0; + int8 X0; + int8 Y0; +}; + +// DSP1 Command 00h +int16 DSP1_Multiply( int16 k, int16 I ); + +// DSP1 Command 10h +struct DSP1_Inverse +{ + DSP1_Inverse( int16 a, int16 b ); + + int16 A; + int16 B; +}; + +START_EXTERN_C +void S9xResetDSP1 (); +uint8 S9xGetDSP (uint16 Address); +void S9xSetDSP (uint8 Byte, uint16 Address); +END_EXTERN_C + +#ifndef NOW_IN_GLOBALS +extern struct SDSP1 DSP1; +#endif + +#endif diff --git a/src/include/dsp4.h b/src/include/dsp4.h new file mode 100644 index 0000000..851d966 --- /dev/null +++ b/src/include/dsp4.h @@ -0,0 +1,83 @@ +// debug +int block; // current block number +extern int c; + +// op control +int8 DSP4_Logic; // controls op flow + +// projection format +const int16 PLANE_START = 0x7fff; // starting distance + +int16 view_plane; // viewer location +int16 far_plane; // next milestone into screen +int16 segments; // # raster segments to draw +int16 raster; // current raster line + +int16 project_x; // current x-position +int16 project_y; // current y-position + +int16 project_centerx; // x-target of projection +int16 project_centery; // y-target of projection + +int16 project_x1; // current x-distance +int16 project_x1low; // lower 16-bits +int16 project_y1; // current y-distance +int16 project_y1low; // lower 16-bits + +int16 project_x2; // next projected x-distance +int16 project_y2; // next projected y-distance + +int16 project_pitchx; // delta center +int16 project_pitchxlow; // lower 16-bits +int16 project_pitchy; // delta center +int16 project_pitchylow; // lower 16-bits + +int16 project_focalx; // x-point of projection at viewer plane +int16 project_focaly; // y-point of projection at viewer plane + +int16 project_ptr; // data structure pointer + +// render window +int16 center_x; // x-center of viewport +int16 center_y; // y-center of viewport +int16 viewport_left; // x-left of viewport +int16 viewport_right; // x-right of viewport +int16 viewport_top; // y-top of viewport +int16 viewport_bottom; // y-bottom of viewport + +// sprite structure +int16 sprite_x; // projected x-pos of sprite +int16 sprite_y; // projected y-pos of sprite +int16 sprite_offset; // data pointer offset +int8 sprite_type; // vehicle, terrain +bool8 sprite_size; // sprite size: 8x8 or 16x16 + +// path strips +int16 path_clipRight[4]; // value to clip to for x>b +int16 path_clipLeft[4]; // value to clip to for x +#endif + +/* Types used by structures and code */ +#ifndef snes9x_types_defined +#define snes9x_types_defined + +typedef unsigned char uint8; +typedef unsigned short uint16; +#ifndef DREAMCAST +typedef unsigned int uint32; +typedef signed char int8; +typedef int int32; +#endif +typedef unsigned char bool8; +typedef short int16; +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +/* The FxInfo_s structure, the link between the FxEmulator and the Snes Emulator */ +struct FxInit_s +{ + uint32 vFlags; + uint8 * pvRegisters; /* 768 bytes located in the memory at address 0x3000 */ + uint32 nRamBanks; /* Number of 64kb-banks in GSU-RAM/BackupRAM (banks 0x70-0x73) */ + uint8 * pvRam; /* Pointer to GSU-RAM */ + uint32 nRomBanks; /* Number of 32kb-banks in Cart-ROM */ + uint8 * pvRom; /* Pointer to Cart-ROM */ +}; + +/* Reset the FxChip */ +extern void FxReset(struct FxInit_s *psFxInfo); + +/* Execute until the next stop instruction */ +extern int FxEmulate(uint32 nInstructions); + +/* Write access to the cache */ +extern void FxCacheWriteAccess(uint16 vAddress); +extern void FxFlushCache(); /* Callled when the G flag in SFR is set to zero */ + +/* Breakpoint */ +extern void FxBreakPointSet(uint32 vAddress); +extern void FxBreakPointClear(); + +/* Step by step execution */ +extern int FxStepOver(uint32 nInstructions); + +/* Errors */ +extern int FxGetErrorCode(); +extern int FxGetIllegalAddress(); + +/* Access to internal registers */ +extern uint32 FxGetColorRegister(); +extern uint32 FxGetPlotOptionRegister(); +extern uint32 FxGetSourceRegisterIndex(); +extern uint32 FxGetDestinationRegisterIndex(); + +/* Get string for opcode currently in the pipe */ +extern void FxPipeString(char * pvString); + +/* Get the byte currently in the pipe */ +extern uint8 FxPipe(); + +/* SCBR write seen. We need to update our cached screen pointers */ +extern void fx_dirtySCBR (void); + +/* Update RamBankReg and RAM Bank pointer */ +extern void fx_updateRamBank(uint8 Byte); + +/* Option flags */ +#define FX_FLAG_ADDRESS_CHECKING 0x01 +#define FX_FLAG_ROM_BUFFER 0x02 + +/* Return codes from FxEmulate(), FxStepInto() or FxStepOver() */ +#define FX_BREAKPOINT -1 +#define FX_ERROR_ILLEGAL_ADDRESS -2 + +/* Return the number of bytes in an opcode */ +#define OPCODE_BYTES(op) ((((op)>=0x05&&(op)<=0xf)||((op)>=0xa0&&(op)<=0xaf))?2:(((op)>=0xf0)?3:1)) + +extern void fx_computeScreenPointers (); + +#endif + diff --git a/src/include/fxinst.h b/src/include/fxinst.h new file mode 100644 index 0000000..8efb3fa --- /dev/null +++ b/src/include/fxinst.h @@ -0,0 +1,475 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _FXINST_H_ +#define _FXINST_H_ 1 + +/* + * FxChip(GSU) register space specification + * (Register address space 3000->32ff) + * + * The 16 generic 16 bit registers: + * (Some have a special function in special circumstances) + * 3000 - R0 default source/destination register + * 3002 - R1 pixel plot X position register + * 3004 - R2 pixel plot Y position register + * 3006 - R3 + * 3008 - R4 lower 16 bit result of lmult + * 300a - R5 + * 300c - R6 multiplier for fmult and lmult + * 300e - R7 fixed point texel X position for merge + * 3010 - R8 fixed point texel Y position for merge + * 3012 - R9 + * 3014 - R10 + * 3016 - R11 return address set by link + * 3018 - R12 loop counter + * 301a - R13 loop point address + * 301c - R14 rom address for getb, getbh, getbl, getbs + * 301e - R15 program counter + * + * 3020-302f - unused + * + * Other internal registers + * 3030 - SFR status flag register (16bit) + * 3032 - unused + * 3033 - BRAMR Backup RAM register (8bit) + * 3034 - PBR program bank register (8bit) + * 3035 - unused + * 3036 - ROMBR rom bank register (8bit) + * 3037 - CFGR control flags register (8bit) + * 3038 - SCBR screen base register (8bit) + * 3039 - CLSR clock speed register (8bit) + * 303a - SCMR screen mode register (8bit) + * 303b - VCR version code register (8bit) (read only) + * 303c - RAMBR ram bank register (8bit) + * 303d - unused + * 303e - CBR cache base register (16bit) + * + * 3040-30ff - unused + * + * 3100-32ff - CACHERAM 512 bytes of GSU cache memory + * + * SFR status flag register bits: + * 0 - + * 1 Z Zero flag + * 2 CY Carry flag + * 3 S Sign flag + * 4 OV Overflow flag + * 5 G Go flag (set to 1 when the GSU is running) + * 6 R Set to 1 when reading ROM using R14 address + * 7 - + * 8 ALT1 Mode set-up flag for the next instruction + * 9 ALT2 Mode set-up flag for the next instruction + * 10 IL Immediate lower 8-bit flag + * 11 IH Immediate higher 8-bit flag + * 12 B Set to 1 when the WITH instruction is executed + * 13 - + * 14 - + * 15 IRQ Set to 1 when GSU caused an interrupt + * Set to 0 when read by 658c16 + * + * BRAMR = 0, BackupRAM is disabled + * BRAMR = 1, BackupRAM is enabled + * + * CFGR control flags register bits: + * 0 - + * 1 - + * 2 - + * 3 - + * 4 - + * 5 MS0 Multiplier speed, 0=standard, 1=high speed + * 6 - + * 7 IRQ Set to 1 when GSU interrupt request is masked + * + * CLSR clock speed register bits: + * 0 CLSR clock speed, 0 = 10.7Mhz, 1 = 21.4Mhz + * + * SCMR screen mode register bits: + * 0 MD0 color depth mode bit 0 + * 1 MD1 color depth mode bit 1 + * 2 HT0 screen height bit 1 + * 3 RAN RAM access control + * 4 RON ROM access control + * 5 HT1 screen height bit 2 + * 6 - + * 7 - + * + * RON = 0 SNES CPU has ROM access + * RON = 1 GSU has ROM access + * + * RAN = 0 SNES has game pak RAM access + * RAN = 1 GSU has game pak RAM access + * + * HT1 HT0 Screen height mode + * 0 0 128 pixels high + * 0 1 160 pixels high + * 1 0 192 pixels high + * 1 1 OBJ mode + * + * MD1 MD0 Color depth mode + * 0 0 4 color mode + * 0 1 16 color mode + * 1 0 not used + * 1 1 256 color mode + * + * CBR cache base register bits: + * 15-4 Specify base address for data to cache from ROM or RAM + * 3-0 Are 0 when address is read + * + * Write access to the program counter (301e) from + * the SNES-CPU will start the GSU, and it will not + * stop until it reaches a stop instruction. + * + */ + +/* Number of banks in GSU RAM */ +#define FX_RAM_BANKS 4 + +/* Emulate proper R14 ROM access (slower, but safer) */ +/* #define FX_DO_ROMBUFFER */ + +/* Address checking (definately slow) */ +/* #define FX_ADDRESS_CHECK */ + +struct FxRegs_s +{ + /* FxChip registers */ + uint32 avReg[16]; /* 16 Generic registers */ + uint32 vColorReg; /* Internal color register */ + uint32 vPlotOptionReg; /* Plot option register */ + uint32 vStatusReg; /* Status register */ + uint32 vPrgBankReg; /* Program bank index register */ + uint32 vRomBankReg; /* Rom bank index register */ + uint32 vRamBankReg; /* Ram bank index register */ + uint32 vCacheBaseReg; /* Cache base address register */ + uint32 vCacheFlags; /* Saying what parts of the cache was written to */ + uint32 vLastRamAdr; /* Last RAM address accessed */ + uint32 * pvDreg; /* Pointer to current destination register */ + uint32 * pvSreg; /* Pointer to current source register */ + uint8 vRomBuffer; /* Current byte read by R14 */ + uint8 vPipe; /* Instructionset pipe */ + uint32 vPipeAdr; /* The address of where the pipe was read from */ + + /* status register optimization stuff */ + uint32 vSign; /* v & 0x8000 */ + uint32 vZero; /* v == 0 */ + uint32 vCarry; /* a value of 1 or 0 */ + int32 vOverflow; /* (v >= 0x8000 || v < -0x8000) */ + + /* Other emulator variables */ + + int32 vErrorCode; + uint32 vIllegalAddress; + + uint8 bBreakPoint; + uint32 vBreakPoint; + uint32 vStepPoint; + + uint8 * pvRegisters; /* 768 bytes located in the memory at address 0x3000 */ + uint32 nRamBanks; /* Number of 64kb-banks in FxRam (Don't confuse it with SNES-Ram!!!) */ + uint8 * pvRam; /* Pointer to FxRam */ + uint32 nRomBanks; /* Number of 32kb-banks in Cart-ROM */ + uint8 * pvRom; /* Pointer to Cart-ROM */ + + uint32 vMode; /* Color depth/mode */ + uint32 vPrevMode; /* Previous depth */ + uint8 * pvScreenBase; + uint8 * apvScreen[32]; /* Pointer to each of the 32 screen colums */ + int x[32]; + uint32 vScreenHeight; /* 128, 160, 192 or 256 (could be overriden by cmode) */ + uint32 vScreenRealHeight; /* 128, 160, 192 or 256 */ + uint32 vPrevScreenHeight; + uint32 vScreenSize; + void (*pfPlot)(); + void (*pfRpix)(); + + uint8 * pvRamBank; /* Pointer to current RAM-bank */ + uint8 * pvRomBank; /* Pointer to current ROM-bank */ + uint8 * pvPrgBank; /* Pointer to current program ROM-bank */ + + uint8 * apvRamBank[FX_RAM_BANKS];/* Ram bank table (max 256kb) */ + uint8 * apvRomBank[256]; /* Rom bank table */ + + uint8 bCacheActive; + uint8 * pvCache; /* Pointer to the GSU cache */ + uint8 avCacheBackup[512]; /* Backup of ROM when the cache has replaced it */ + uint32 vCounter; + uint32 vInstCount; + uint32 vSCBRDirty; /* if SCBR is written, our cached screen pointers need updating */ +}; + +#define FxRegs_s_null { \ + {0}, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ + NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0, \ + 0, NULL, {NULL}, {0}, 0, 0, 0, 0, NULL, NULL, \ + NULL, NULL, NULL, {NULL}, {NULL}, 0, NULL, {0}, 0, 0, \ +} + +/* GSU registers */ +#define GSU_R0 0x000 +#define GSU_R1 0x002 +#define GSU_R2 0x004 +#define GSU_R3 0x006 +#define GSU_R4 0x008 +#define GSU_R5 0x00a +#define GSU_R6 0x00c +#define GSU_R7 0x00e +#define GSU_R8 0x010 +#define GSU_R9 0x012 +#define GSU_R10 0x014 +#define GSU_R11 0x016 +#define GSU_R12 0x018 +#define GSU_R13 0x01a +#define GSU_R14 0x01c +#define GSU_R15 0x01e +#define GSU_SFR 0x030 +#define GSU_BRAMR 0x033 +#define GSU_PBR 0x034 +#define GSU_ROMBR 0x036 +#define GSU_CFGR 0x037 +#define GSU_SCBR 0x038 +#define GSU_CLSR 0x039 +#define GSU_SCMR 0x03a +#define GSU_VCR 0x03b +#define GSU_RAMBR 0x03c +#define GSU_CBR 0x03e +#define GSU_CACHERAM 0x100 + +/* SFR flags */ +#define FLG_Z (1<<1) +#define FLG_CY (1<<2) +#define FLG_S (1<<3) +#define FLG_OV (1<<4) +#define FLG_G (1<<5) +#define FLG_R (1<<6) +#define FLG_ALT1 (1<<8) +#define FLG_ALT2 (1<<9) +#define FLG_IL (1<<10) +#define FLG_IH (1<<11) +#define FLG_B (1<<12) +#define FLG_IRQ (1<<15) + +/* Test flag */ +#define TF(a) (GSU.vStatusReg & FLG_##a ) +#define CF(a) (GSU.vStatusReg &= ~FLG_##a ) +#define SF(a) (GSU.vStatusReg |= FLG_##a ) + +/* Test and set flag if condition, clear if not */ +#define TS(a,b) GSU.vStatusReg = ( (GSU.vStatusReg & (~FLG_##a)) | ( (!!(##b)) * FLG_##a ) ) + +/* Testing ALT1 & ALT2 bits */ +#define ALT0 (!TF(ALT1)&&!TF(ALT2)) +#define ALT1 (TF(ALT1)&&!TF(ALT2)) +#define ALT2 (!TF(ALT1)&&TF(ALT2)) +#define ALT3 (TF(ALT1)&&TF(ALT2)) + +/* Sign extend from 8/16 bit to 32 bit */ +#define SEX16(a) ((int32)((int16)(a))) +#define SEX8(a) ((int32)((int8)(a))) + +/* Unsign extend from 8/16 bit to 32 bit */ +#define USEX16(a) ((uint32)((uint16)(a))) +#define USEX8(a) ((uint32)((uint8)(a))) + +#define SUSEX16(a) ((int32)((uint16)(a))) + +/* Set/Clr Sign and Zero flag */ +#define TSZ(num) TS(S, (num & 0x8000)); TS(Z, (!USEX16(num)) ) + +/* Clear flags */ +#define CLRFLAGS GSU.vStatusReg &= ~(FLG_ALT1|FLG_ALT2|FLG_B); GSU.pvDreg = GSU.pvSreg = &R0; + +/* Read current RAM-Bank */ +#define RAM(adr) GSU.pvRamBank[USEX16(adr)] + +/* Read current ROM-Bank */ +#define FXROM(idx) (GSU.pvRomBank[USEX16(idx)]) + +/* Access the current value in the pipe */ +#define PIPE GSU.vPipe + +/* Access data in the current program bank */ +#define PRGBANK(idx) GSU.pvPrgBank[USEX16(idx)] + +/* Update pipe from ROM */ +#if 0 +#define FETCHPIPE { PIPE = PRGBANK(R15); GSU.vPipeAdr = (GSU.vPrgBankReg<<16) + R15; } +#else +#define FETCHPIPE { PIPE = PRGBANK(R15); } +#endif + +/* ABS */ +#define ABS(x) ((x)<0?-(x):(x)) + +/* Access source register */ +#define SREG (*GSU.pvSreg) + +/* Access destination register */ +#define DREG (*GSU.pvDreg) + +#ifndef FX_DO_ROMBUFFER + +/* Don't read R14 */ +#define READR14 + +/* Don't test and/or read R14 */ +#define TESTR14 + +#else + +/* Read R14 */ +#define READR14 GSU.vRomBuffer = FXROM(R14) + +/* Test and/or read R14 */ +#define TESTR14 if(GSU.pvDreg == &R14) READR14 + +#endif + +/* Access to registers */ +#define R0 GSU.avReg[0] +#define R1 GSU.avReg[1] +#define R2 GSU.avReg[2] +#define R3 GSU.avReg[3] +#define R4 GSU.avReg[4] +#define R5 GSU.avReg[5] +#define R6 GSU.avReg[6] +#define R7 GSU.avReg[7] +#define R8 GSU.avReg[8] +#define R9 GSU.avReg[9] +#define R10 GSU.avReg[10] +#define R11 GSU.avReg[11] +#define R12 GSU.avReg[12] +#define R13 GSU.avReg[13] +#define R14 GSU.avReg[14] +#define R15 GSU.avReg[15] +#define SFR GSU.vStatusReg +#define PBR GSU.vPrgBankReg +#define ROMBR GSU.vRomBankReg +#define RAMBR GSU.vRamBankReg +#define CBR GSU.vCacheBaseReg +#define SCBR USEX8(GSU.pvRegisters[GSU_SCBR]) +#define SCMR USEX8(GSU.pvRegisters[GSU_SCMR]) +#define COLR GSU.vColorReg +#define POR GSU.vPlotOptionReg +#define BRAMR USEX8(GSU.pvRegisters[GSU_BRAMR]) +#define VCR USEX8(GSU.pvRegisters[GSU_VCR]) +#define CFGR USEX8(GSU.pvRegisters[GSU_CFGR]) +#define CLSR USEX8(GSU.pvRegisters[GSU_CLSR]) + +/* Execute instruction from the pipe, and fetch next byte to the pipe */ +#define FX_STEP { uint32 vOpcode = (uint32)PIPE; FETCHPIPE; \ +(*fx_ppfOpcodeTable[ (GSU.vStatusReg & 0x300) | vOpcode ])(); } \ + +#define FX_FUNCTION_RUN 0 +#define FX_FUNCTION_RUN_TO_BREAKPOINT 1 +#define FX_FUNCTION_STEP_OVER 2 + +extern uint32 (**fx_ppfFunctionTable)(uint32); +extern void (**fx_ppfPlotTable)(); +extern void (**fx_ppfOpcodeTable)(); + +extern uint32 (*fx_apfFunctionTable[])(uint32); +extern void (*fx_apfOpcodeTable[])(); +extern void (*fx_apfPlotTable[])(); +extern uint32 (*fx_a_apfFunctionTable[])(uint32); +extern void (*fx_a_apfOpcodeTable[])(); +extern void (*fx_a_apfPlotTable[])(); +extern uint32 (*fx_r_apfFunctionTable[])(uint32); +extern void (*fx_r_apfOpcodeTable[])(); +extern void (*fx_r_apfPlotTable[])(); +extern uint32 (*fx_ar_apfFunctionTable[])(uint32); +extern void (*fx_ar_apfOpcodeTable[])(); +extern void (*fx_ar_apfPlotTable[])(); + +/* Set this define if branches are relative to the instruction in the delay slot */ +/* (I think they are) */ +#define BRANCH_DELAY_RELATIVE + +#endif + diff --git a/src/include/getset.h b/src/include/getset.h new file mode 100644 index 0000000..12bf122 --- /dev/null +++ b/src/include/getset.h @@ -0,0 +1,806 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _GETSET_H_ +#define _GETSET_H_ + +#include "ppu.h" +#include "dsp1.h" +#include "cpuexec.h" +#include "sa1.h" +#include "spc7110.h" +#include "obc1.h" +#include "seta.h" + +#ifdef __cplusplus +extern "C" { +#endif + extern uint8 OpenBus; +#ifdef __cplusplus +} +#endif + +INLINE uint8 S9xGetByte (uint32 Address) +{ + int block; + uint8 *GetAddress = CMemory_Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + + if(!CPU.InDMA) +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CMemory_MemorySpeed [block]; +#else + CPU.Cycles += 8; +#endif + + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) + { +#ifdef CPU_SHUTDOWN +#ifdef USE_BLOCK_RAM + if (CMemory_BlockIsRAM [block]) +#endif + CPU.WaitAddress = CPU.PCAtOpcodeStart; +#endif +#ifndef USE_MMU + return (*(GetAddress + (Address & 0xffff))); +#else + return (*((unsigned char *)(Address /*& 0xFFFFFFF*/))); +#endif + } + + switch ((int) GetAddress) + { + case CMemory_MAP_PPU: + return (S9xGetPPU (Address & 0xffff)); + case CMemory_MAP_CPU: + return (S9xGetCPU (Address & 0xffff)); + case CMemory_MAP_DSP: + return (S9xGetDSP (Address & 0xffff)); + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + //Address &0x7FFF -offset into bank + //Address&0xFF0000 -bank + //bank>>1 | offset = s-ram address, unbound + //unbound & SRAMMask = Sram offset + return (*(CMemory_SRAM + ((((Address&0xFF0000)>>1) |(Address&0x7FFF)) &CMemory_SRAMMask))); +// return (*(CMemory_SRAM + ((Address & CMemory_SRAMMask)))); + + case CMemory_MAP_RONLY_SRAM: + case CMemory_MAP_HIROM_SRAM: + return (*(CMemory_SRAM + (((Address & 0x7fff) - 0x6000 + + ((Address & 0xf0000) >> 3)) & CMemory_SRAMMask))); + + case CMemory_MAP_BWRAM: + return (*(CMemory_BWRAM + ((Address & 0x7fff) - 0x6000))); + + case CMemory_MAP_C4: + return (S9xGetC4 (Address & 0xffff)); + + case CMemory_MAP_SPC7110_ROM: +#ifdef SPC7110_DEBUG + printf("reading spc7110 ROM (byte) at %06X\n", Address); +#endif + return S9xGetSPC7110Byte(Address); + + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("reading Bank 50 (byte)\n"); +#endif + return S9xGetSPC7110(0x4800); + + case CMemory_MAP_OBC_RAM: + return GetOBC1(Address & 0xffff); + + case CMemory_MAP_SETA_DSP: + return S9xGetSetaDSP(Address); + + case CMemory_MAP_SETA_RISC: + return S9xGetST018(Address); + + default: + case CMemory_MAP_NONE: +#ifdef MK_TRACE_BAD_READS + char address[20]; + sprintf(address, TEXT("%06X"),Address); + MessageBox(GUI.hWnd, address, TEXT("GetByte"), MB_OK); +#endif + + return OpenBus; + } +} + +INLINE uint16 S9xGetWord (uint32 Address) +{ + if ((Address & 0x0fff) == 0x0fff) + { + OpenBus=S9xGetByte (Address); + return (OpenBus | (S9xGetByte (Address + 1) << 8)); + } + int block; + uint8 *GetAddress = CMemory_Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + + if(!CPU.InDMA) +#ifdef USE_MEMORY_SPEED + CPU.Cycles += (CMemory_MemorySpeed [block]<<1); +#else + CPU.Cycles += 16; +#endif + + + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) + { +#ifdef CPU_SHUTDOWN +#ifdef USE_BLOCK_RAM + if (CMemory_BlockIsRAM [block]) +#endif + CPU.WaitAddress = CPU.PCAtOpcodeStart; +#endif +#ifdef FAST_LSB_WORD_ACCESS +#ifndef USE_MMU + return (*(uint16 *) (GetAddress + (Address & 0xffff))); +#else + return (*((unsigned short*)(Address /*& 0xFFFFFFF*/))); +#endif +#else +#ifndef USE_MMU + return (*(GetAddress + (Address & 0xffff)) | + (*(GetAddress + (Address & 0xffff) + 1) << 8)); +#else + return ((*((unsigned char*)(Address /*& 0xFFFFFFF*/))) | + (((*((unsigned char*)((Address+1) /*& 0xFFFFFFF*/)))) << 8)); +#endif +#endif + } + + switch ((int) GetAddress) + { + case CMemory_MAP_PPU: + return (S9xGetPPU (Address & 0xffff) | + (S9xGetPPU ((Address + 1) & 0xffff) << 8)); + case CMemory_MAP_CPU: + return (S9xGetCPU (Address & 0xffff) | + (S9xGetCPU ((Address + 1) & 0xffff) << 8)); + case CMemory_MAP_DSP: +#ifdef DSP_DUMMY_LOOPS + printf("Get DSP Word @ %06X\n", Address); +#endif + return (S9xGetDSP (Address & 0xffff) | + (S9xGetDSP ((Address + 1) & 0xffff) << 8)); + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + //Address &0x7FFF -offset into bank + //Address&0xFF0000 -bank + //bank>>1 | offset = s-ram address, unbound + //unbound & SRAMMask = Sram offset + /* BJ: no FAST_LSB_WORD_ACCESS here, since if CMemory_SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + return + (*(CMemory_SRAM + ((((Address&0xFF0000)>>1) |(Address&0x7FFF)) &CMemory_SRAMMask)))| + ((*(CMemory_SRAM + (((((Address+1)&0xFF0000)>>1) |((Address+1)&0x7FFF)) &CMemory_SRAMMask)))<<8); + + //return (*(uint16*)(CMemory_SRAM + ((((Address&0xFF0000)>>1)|(Address&0x7FFF)) & CMemory_SRAMMask));// | + // (*(CMemory_SRAM + ((Address + 1) & CMemory_SRAMMask)) << 8)); + + case CMemory_MAP_RONLY_SRAM: + case CMemory_MAP_HIROM_SRAM: + /* BJ: no FAST_LSB_WORD_ACCESS here, since if CMemory_SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + return (*(CMemory_SRAM + + (((Address & 0x7fff) - 0x6000 + + ((Address & 0xf0000) >> 3)) & CMemory_SRAMMask)) | + (*(CMemory_SRAM + + ((((Address + 1) & 0x7fff) - 0x6000 + + (((Address + 1) & 0xf0000) >> 3)) & CMemory_SRAMMask)) << 8)); + + case CMemory_MAP_BWRAM: +#ifdef FAST_LSB_WORD_ACCESS + return (*(uint16 *) (CMemory_BWRAM + ((Address & 0x7fff) - 0x6000))); +#else + return (*(CMemory_BWRAM + ((Address & 0x7fff) - 0x6000)) | + (*(CMemory_BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) << 8)); +#endif + + case CMemory_MAP_C4: + return (S9xGetC4 (Address & 0xffff) | + (S9xGetC4 ((Address + 1) & 0xffff) << 8)); + + case CMemory_MAP_SPC7110_ROM: +#ifdef SPC7110_DEBUG + printf("reading spc7110 ROM (word) at %06X\n", Address); +#endif + return (S9xGetSPC7110Byte(Address)| + (S9xGetSPC7110Byte (Address+1))<<8); + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("reading Bank 50 (word)\n"); +#endif + return (S9xGetSPC7110(0x4800)| + (S9xGetSPC7110 (0x4800) << 8)); + case CMemory_MAP_OBC_RAM: + return GetOBC1(Address&0xFFFF)| (GetOBC1((Address+1)&0xFFFF)<<8); + + case CMemory_MAP_SETA_DSP: + return S9xGetSetaDSP(Address)| (S9xGetSetaDSP((Address+1))<<8); + + case CMemory_MAP_SETA_RISC: + return S9xGetST018(Address)| (S9xGetST018((Address+1))<<8); + + default: + case CMemory_MAP_NONE: +#ifdef MK_TRACE_BAD_READS + char address[20]; + sprintf(address, TEXT("%06X"),Address); + MessageBox(GUI.hWnd, address, TEXT("GetWord"), MB_OK); +#endif + return (OpenBus | (OpenBus<<8)); + } +} + +INLINE void S9xSetByte (uint8 Byte, uint32 Address) +{ +#if defined(CPU_SHUTDOWN) + CPU.WaitAddress = NULL; +#endif + int block; + uint8 *SetAddress = CMemory_WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; + + if (!CPU.InDMA) +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CMemory_MemorySpeed [block]; +#else + CPU.Cycles += 8; +#endif + + +//printf("SetByte(%.2X, %.8X) (%p)\n",Byte,Address,SetAddress); + if (SetAddress >= (uint8 *) CMemory_MAP_LAST) + { +#ifdef CPU_SHUTDOWN + SetAddress += Address & 0xffff; + if (SetAddress == SA1.WaitByteAddress1 || + SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } +#ifndef USE_MMU + *SetAddress = Byte; +#else + *((unsigned char *)(Address /*& 0xFFFFFFF*/)) = Byte; +#endif + +#else +#ifndef USE_MMU + *(SetAddress + (Address & 0xffff)) = Byte; +#else + *((unsigned char *)(Address /*& 0xFFFFFFF*/)) = Byte; +#endif +#endif + return; + } + + switch ((int) SetAddress) + { + case CMemory_MAP_PPU: + S9xSetPPU (Byte, Address & 0xffff); + return; + + case CMemory_MAP_CPU: + S9xSetCPU (Byte, Address & 0xffff); + return; + + case CMemory_MAP_DSP: +#ifdef DSP_DUMMY_LOOPS + printf("DSP Byte: %02X to %06X\n", Byte, Address); +#endif + S9xSetDSP (Byte, Address & 0xffff); + return; + + case CMemory_MAP_LOROM_SRAM: + if (CMemory_SRAMMask) + { + *(CMemory_SRAM + ((((Address&0xFF0000)>>1)|(Address&0x7FFF))& CMemory_SRAMMask))=Byte; +// *(CMemory_SRAM + (Address & CMemory_SRAMMask)) = Byte; + CPU.SRAMModified = TRUE; + } + return; + + case CMemory_MAP_HIROM_SRAM: + if (CMemory_SRAMMask) + { + *(CMemory_SRAM + (((Address & 0x7fff) - 0x6000 + + ((Address & 0xf0000) >> 3)) & CMemory_SRAMMask)) = Byte; + CPU.SRAMModified = TRUE; + } + return; + + case CMemory_MAP_BWRAM: + *(CMemory_BWRAM + ((Address & 0x7fff) - 0x6000)) = Byte; + CPU.SRAMModified = TRUE; + return; + + case CMemory_MAP_SA1RAM: + *(CMemory_SRAM + (Address & 0xffff)) = Byte; + SA1.Executing = !SA1.Waiting; + break; + + case CMemory_MAP_C4: + S9xSetC4 (Byte, Address & 0xffff); + return; + + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("Writing Byte at %06X\n", Address); +#endif + s7r.bank50[(Address & 0xffff)]= (uint8) Byte; + break; + + case CMemory_MAP_OBC_RAM: + SetOBC1(Byte, Address &0xFFFF); + return; + + case CMemory_MAP_SETA_DSP: + S9xSetSetaDSP(Byte,Address); + return; + + case CMemory_MAP_SETA_RISC: + S9xSetST018(Byte,Address); + return; + default: + case CMemory_MAP_NONE: +#ifdef MK_TRACE_BAD_WRITES + char address[20]; + sprintf(address, TEXT("%06X"),Address); + MessageBox(GUI.hWnd, address, TEXT("SetByte"), MB_OK); +#endif + return; + } +} + +INLINE void S9xSetWord (uint16 Word, uint32 Address) +{ + if((Address & 0x0FFF)==0x0FFF) + { + S9xSetByte(Word&0x00FF, Address); + S9xSetByte(Word>>8, Address+1); + return; + } + +#if defined(CPU_SHUTDOWN) + CPU.WaitAddress = NULL; +#endif + int block; + uint8 *SetAddress = CMemory_WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)]; + + if (!CPU.InDMA) +#ifdef USE_MEMORY_SPEED + CPU.Cycles += CMemory_MemorySpeed [block] << 1; +#else + CPU.Cycles += 16; //8; +#endif + + + if (SetAddress >= (uint8 *) CMemory_MAP_LAST) + { +#ifdef CPU_SHUTDOWN + SetAddress += Address & 0xffff; + if (SetAddress == SA1.WaitByteAddress1 || + SetAddress == SA1.WaitByteAddress2) + { + SA1.Executing = SA1.S9xOpcodes != NULL; + SA1.WaitCounter = 0; + } +#ifdef FAST_LSB_WORD_ACCESS +#ifndef USE_MMU + *(uint16 *) SetAddress = Word; +#else + *((unsigned short *)(Address /*& 0xFFFFFFF*/)) = Word; +#endif +#else +#ifndef USE_MMU + *SetAddress = (uint8) Word; + *(SetAddress + 1) = Word >> 8; +#else + *((unsigned char *)(Address /*& 0xFFFFFFF*/)) = (uint8)Word; + *((unsigned char *)((Address+1) /*& 0xFFFFFFF*/)) = Word >> 8; +#endif +#endif +#else +#ifdef FAST_LSB_WORD_ACCESS +#ifndef USE_MMU + *(uint16 *) (SetAddress + (Address & 0xffff)) = Word; +#else + *((unsigned short *)(Address /*& 0xFFFFFFF*/)) = Word; +#endif +#else +#ifndef USE_MMU + *(SetAddress + (Address & 0xffff)) = (uint8) Word; + *(SetAddress + ((Address + 1) & 0xffff)) = Word >> 8; +#else + *((unsigned char *)(Address /*& 0xFFFFFFF*/)) = (uint8)Word; + *((unsigned char *)((Address+1) /*& 0xFFFFFFF*/)) = Word >> 8; +#endif +#endif +#endif + return; + } + + switch ((int) SetAddress) + { + case CMemory_MAP_PPU: + S9xSetPPU ((uint8) Word, Address & 0xffff); + S9xSetPPU (Word >> 8, (Address & 0xffff) + 1); + return; + + case CMemory_MAP_CPU: + S9xSetCPU ((uint8) Word, (Address & 0xffff)); + S9xSetCPU (Word >> 8, (Address & 0xffff) + 1); + return; + + case CMemory_MAP_DSP: +#ifdef DSP_DUMMY_LOOPS + printf("DSP Word: %04X to %06X\n", Word, Address); +#endif + S9xSetDSP ((uint8) Word, (Address & 0xffff)); + S9xSetDSP (Word >> 8, (Address & 0xffff) + 1); + return; + + case CMemory_MAP_LOROM_SRAM: + if (CMemory_SRAMMask) + { + /* BJ: no FAST_LSB_WORD_ACCESS here, since if CMemory_SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + *(CMemory_SRAM + ((((Address&0xFF0000)>>1)|(Address&0x7FFF))& CMemory_SRAMMask)) = (uint8) Word; + *(CMemory_SRAM + (((((Address+1)&0xFF0000)>>1)|((Address+1)&0x7FFF))& CMemory_SRAMMask)) = Word >> 8; + +// *(CMemory_SRAM + (Address & CMemory_SRAMMask)) = (uint8) Word; +// *(CMemory_SRAM + ((Address + 1) & CMemory_SRAMMask)) = Word >> 8; + CPU.SRAMModified = TRUE; + } + return; + + case CMemory_MAP_HIROM_SRAM: + if (CMemory_SRAMMask) + { + /* BJ: no FAST_LSB_WORD_ACCESS here, since if CMemory_SRAMMask=0x7ff + * then the high byte doesn't follow the low byte. */ + *(CMemory_SRAM + + (((Address & 0x7fff) - 0x6000 + + ((Address & 0xf0000) >> 3) & CMemory_SRAMMask))) = (uint8) Word; + *(CMemory_SRAM + + ((((Address + 1) & 0x7fff) - 0x6000 + + (((Address + 1) & 0xf0000) >> 3) & CMemory_SRAMMask))) = (uint8) (Word >> 8); + CPU.SRAMModified = TRUE; + } + return; + + case CMemory_MAP_BWRAM: +#ifdef FAST_LSB_WORD_ACCESS + *(uint16 *) (CMemory_BWRAM + ((Address & 0x7fff) - 0x6000)) = Word; +#else + *(CMemory_BWRAM + ((Address & 0x7fff) - 0x6000)) = (uint8) Word; + *(CMemory_BWRAM + (((Address + 1) & 0x7fff) - 0x6000)) = (uint8) (Word >> 8); +#endif + CPU.SRAMModified = TRUE; + return; + + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("Writing Word at %06X\n", Address); +#endif + s7r.bank50[(Address & 0xffff)]= (uint8) Word; + s7r.bank50[((Address + 1) & 0xffff)]= (uint8) Word; + break; + case CMemory_MAP_SA1RAM: + *(CMemory_SRAM + (Address & 0xffff)) = (uint8) Word; + *(CMemory_SRAM + ((Address + 1) & 0xffff)) = (uint8) (Word >> 8); + SA1.Executing = !SA1.Waiting; + break; + + case CMemory_MAP_C4: + S9xSetC4 (Word & 0xff, Address & 0xffff); + S9xSetC4 ((uint8) (Word >> 8), (Address + 1) & 0xffff); + return; + + case CMemory_MAP_OBC_RAM: + SetOBC1(Word & 0xff, Address &0xFFFF); + SetOBC1 ((uint8) (Word >> 8), (Address + 1) & 0xffff); + return; + + case CMemory_MAP_SETA_DSP: + S9xSetSetaDSP (Word & 0xff, Address); + S9xSetSetaDSP ((uint8) (Word >> 8),(Address + 1)); + return; + + case CMemory_MAP_SETA_RISC: + S9xSetST018 (Word & 0xff, Address); + S9xSetST018 ((uint8) (Word >> 8),(Address + 1)); + return; + + default: + case CMemory_MAP_NONE: +#ifdef MK_TRACE_BAD_WRITES + char address[20]; + sprintf(address, TEXT("%06X"),Address); + MessageBox(GUI.hWnd, address, TEXT("SetWord"), MB_OK); +#endif + + return; + } +} + +INLINE uint8 *GetBasePointer (uint32 Address) +{ + uint8 *GetAddress = CMemory_Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; +//printf("GetBasePointer(%.8X) (%p)\n",Address,GetAddress); + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) +#if !defined(USE_MMU) || defined(USE_MMU_BASEPOINTER) + return (GetAddress); +#else + return (uint8*)(Address&0xff0000); +#endif + if(Settings.SPC7110&&((Address&0x7FFFFF)==0x4800)) + { + return s7r.bank50; + } + switch ((int) GetAddress) + { + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("Getting Base pointer to DRAM\n"); +#endif + { + return s7r.bank50; + } + case CMemory_MAP_SPC7110_ROM: +#ifdef SPC7110_DEBUG + printf("Getting Base pointer to SPC7110ROM\n"); +#endif + return Get7110BasePtr(Address); + case CMemory_MAP_PPU: +//just a guess, but it looks like this should match the CPU as a source. +//return (uint8*)(0); + return (CMemory_FillRAM); +// return (CMemory_FillRAM - 0x2000); + case CMemory_MAP_CPU: +//fixes Ogre Battle's green lines +//return (uint8*)(0); + return (CMemory_FillRAM); +// return (CMemory_FillRAM - 0x4000); + case CMemory_MAP_DSP: +//return (uint8*)(- 0x6000); + return (CMemory_FillRAM - 0x6000); + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + return (CMemory_SRAM); + case CMemory_MAP_BWRAM: + return (CMemory_BWRAM - 0x6000); + case CMemory_MAP_HIROM_SRAM: + return (CMemory_SRAM - 0x6000); + case CMemory_MAP_C4: + return (CMemory_C4RAM - 0x6000); + case CMemory_MAP_OBC_RAM: + return GetBasePointerOBC1(Address); + case CMemory_MAP_SETA_DSP: + return CMemory_SRAM; + default: + case CMemory_MAP_NONE: +#if defined(MK_TRACE_BAD_READS) || defined(MK_TRACE_BAD_WRITES) + char fsd[12]; + sprintf(fsd, TEXT("%06X"), Address); + MessageBox(GUI.hWnd, fsd, TEXT("Rogue DMA"), MB_OK); +#endif + +#ifndef USE_MMU + return (0); +#else + return ((uint8 *)-1); +#endif + } +} + +INLINE uint8 *S9xGetMemPointer (uint32 Address) +{ + uint8 *GetAddress = CMemory_Map [(Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) +#ifndef USE_MMU + return (GetAddress + (Address & 0xffff)); +#else + return ((uint8 *)(Address /*& 0xFFFFFFF*/)); +#endif + + if(Settings.SPC7110&&((Address&0x7FFFFF)==0x4800)) + return s7r.bank50; + + switch ((int) GetAddress) + { + case CMemory_MAP_SPC7110_DRAM: +#ifdef SPC7110_DEBUG + printf("Getting Base pointer to DRAM\n"); +#endif + return &s7r.bank50[Address&0x0000FFFF]; + case CMemory_MAP_PPU: + return (CMemory_FillRAM + (Address & 0xffff)); + case CMemory_MAP_CPU: + return (CMemory_FillRAM + (Address & 0xffff)); + case CMemory_MAP_DSP: + return (CMemory_FillRAM - 0x6000 + (Address & 0xffff)); + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + return (CMemory_SRAM + (Address & 0xffff)); + case CMemory_MAP_BWRAM: + return (CMemory_BWRAM - 0x6000 + (Address & 0xffff)); + case CMemory_MAP_HIROM_SRAM: + return (CMemory_SRAM - 0x6000 + (Address & 0xffff)); + case CMemory_MAP_C4: + return (CMemory_C4RAM - 0x6000 + (Address & 0xffff)); + case CMemory_MAP_OBC_RAM: + return GetMemPointerOBC1(Address); + case CMemory_MAP_SETA_DSP: + return CMemory_SRAM+ ((Address & 0xffff) & CMemory_SRAMMask); + default: + case CMemory_MAP_NONE: +#if defined(MK_TRACE_BAD_READS) || defined(MK_TRACE_BAD_WRITES) + char fsd[12]; + sprintf(fsd, TEXT("%06X"), Address); + MessageBox(GUI.hWnd, fsd, TEXT("Rogue DMA"), MB_OK); +#endif + + return (0); + } +} + +INLINE void S9xSetPCBase (uint32 Address) +{ + int block; + uint8 *GetAddress = CMemory_Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + +#ifdef USE_MEMORY_SPEED + CPU.MemSpeed = CMemory_MemorySpeed [block]; + CPU.MemSpeedx2 = CPU.MemSpeed << 1; +#endif + + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) + { +#ifndef USE_MMU + CPU.PCBase = GetAddress; + CPU.PC = GetAddress + (Address & 0xffff); +#else + CPU.PCBase = (uint8 *)(Address & 0xfff0000); + CPU.PC = (uint8 *)(Address /*& 0xfffffff*/); +//printf("SetPCBase %.6X, Base=%.6X PC=%4.X\n",Address,CPU.PCBase,CPU.PC); +#endif + return; + } + + switch ((int) GetAddress) + { + case CMemory_MAP_PPU: + CPU.PCBase = CMemory_FillRAM; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + case CMemory_MAP_CPU: + CPU.PCBase = CMemory_FillRAM; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + case CMemory_MAP_DSP: + CPU.PCBase = CMemory_FillRAM - 0x6000; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + CPU.PCBase = CMemory_SRAM; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + case CMemory_MAP_BWRAM: + CPU.PCBase = CMemory_BWRAM - 0x6000; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + case CMemory_MAP_HIROM_SRAM: + CPU.PCBase = CMemory_SRAM - 0x6000; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + case CMemory_MAP_C4: + CPU.PCBase = CMemory_C4RAM - 0x6000; + CPU.PC = CPU.PCBase + (Address & 0xffff); + return; + + default: + case CMemory_MAP_NONE: + CPU.PCBase = CMemory_SRAM; + CPU.PC = CMemory_SRAM + (Address & 0xffff); + return; + } +} +#endif + diff --git a/src/include/gfx.h b/src/include/gfx.h new file mode 100644 index 0000000..af8c1ee --- /dev/null +++ b/src/include/gfx.h @@ -0,0 +1,320 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _GFX_H_ +#define _GFX_H_ + +#include "port.h" +#include "snes9x.h" + +struct SGFX{ + // Initialize these variables + uint8 *Screen; + uint8 *SubScreen; + uint8 *ZBuffer; + uint8 *SubZBuffer; + uint32 Pitch; + + // Setup in call to S9xGraphicsInit() + int Delta; + uint16 *X2; + uint16 *ZERO_OR_X2; + uint16 *ZERO; + uint32 RealPitch; // True pitch of Screen buffer. + uint32 Pitch2; // Same as RealPitch except while using speed up hack for Glide. + uint32 ZPitch; // Pitch of ZBuffer + uint32 PPL; // Number of pixels on each of Screen buffer + uint32 PPLx2; + uint32 PixSize; + uint8 *S; + uint8 *DB; + uint16 *ScreenColors; + uint32 DepthDelta; + uint8 Z1; // Depth for comparison + uint8 Z2; // Depth to save + uint8 ZSprite; // Used to ensure only 1st sprite is drawn per pixel + uint32 FixedColour; + const char *InfoString; + uint32 InfoStringTimeout; + uint32 StartY; + uint32 EndY; + struct ClipData *pCurrentClip; + uint32 Mode7Mask; + uint32 Mode7PriorityMask; + uint8 OBJWidths[128]; + uint8 OBJVisibleTiles[128]; + struct { + uint8 RTOFlags; + int16 Tiles; + struct { + int8 Sprite; + uint8 Line; + } OBJ[32]; + } OBJLines [SNES_HEIGHT_EXTENDED]; + + uint8 r212c; + uint8 r212d; + uint8 r2130; + uint8 r2131; + bool8 Pseudo; + +#ifdef GFX_MULTI_FORMAT + uint32 PixelFormat; + uint32 (*BuildPixel) (uint32 R, uint32 G, uint32 B); + uint32 (*BuildPixel2) (uint32 R, uint32 G, uint32 B); + void (*DecomposePixel) (uint32 Pixel, uint32 &R, uint32 &G, uint32 &B); +#endif +}; + +struct SLineData { + struct { + uint16 VOffset; + uint16 HOffset; + } BG [4]; +}; + +#define H_FLIP 0x4000 +#define V_FLIP 0x8000 +#define BLANK_TILE 2 + +struct SBG +{ + uint32 TileSize; + uint32 BitShift; + uint32 TileShift; + uint32 TileAddress; + uint32 NameSelect; + uint32 SCBase; + + uint32 StartPalette; + uint32 PaletteShift; + uint32 PaletteMask; + + uint8 *Buffer; + uint8 *Buffered; + bool8 DirectColourMode; +}; + +struct SLineMatrixData +{ + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; +}; + +extern uint32 odd_high [4][16]; +extern uint32 odd_low [4][16]; +extern uint32 even_high [4][16]; +extern uint32 even_low [4][16]; +extern struct SBG BG; +extern uint16 DirectColourMaps [8][256]; + +extern uint8 add32_32 [32][32]; +extern uint8 add32_32_half [32][32]; +extern uint8 sub32_32 [32][32]; +extern uint8 sub32_32_half [32][32]; +extern uint8 mul_brightness [16][32]; + +// Could use BSWAP instruction on Intel port... +#define SWAP_DWORD(dw) dw = ((dw & 0xff) << 24) | ((dw & 0xff00) << 8) | \ + ((dw & 0xff0000) >> 8) | ((dw & 0xff000000) >> 24) + +#ifdef FAST_LSB_WORD_ACCESS +#define READ_2BYTES(s) (*(uint16 *) (s)) +#define WRITE_2BYTES(s, d) *(uint16 *) (s) = (d) +#else +#ifdef LSB_FIRST +#define READ_2BYTES(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8)) +#define WRITE_2BYTES(s, d) *(uint8 *) (s) = (d), \ + *((uint8 *) (s) + 1) = (d) >> 8 +#else // else MSB_FISRT +#define READ_2BYTES(s) (*(uint8 *) (s) | (*((uint8 *) (s) + 1) << 8)) +#define WRITE_2BYTES(s, d) *(uint8 *) (s) = (d), \ + *((uint8 *) (s) + 1) = (d) >> 8 +#endif // LSB_FIRST +#endif // i386 + +#define SUB_SCREEN_DEPTH 0 +#define MAIN_SCREEN_DEPTH 32 + +#if defined(OLD_COLOUR_BLENDING) +#define COLOR_ADD(C1, C2) \ +GFX.X2 [((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK)] +#else +#define COLOR_ADD(C1, C2) \ +(GFX.X2 [((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK)] | \ + (((C1) ^ (C2)) & RGB_LOW_BITS_MASK)) +#endif + +#define COLOR_ADD1_2(C1, C2) \ +(((((C1) & RGB_REMOVE_LOW_BITS_MASK) + \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1) + \ + ((C1) & (C2) & RGB_LOW_BITS_MASK) | ALPHA_BITS_MASK) + +#if defined(OLD_COLOUR_BLENDING) +#define COLOR_SUB(C1, C2) \ +GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] +#elif !defined(NEW_COLOUR_BLENDING) +#define COLOR_SUB(C1, C2) \ +(GFX.ZERO_OR_X2 [(((C1) | RGB_HI_BITS_MASKx2) - \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + \ +((C1) & RGB_LOW_BITS_MASK) - ((C2) & RGB_LOW_BITS_MASK)) +#else +static __inline__ uint16 COLOR_SUB(uint16, uint16); + +static __inline__ uint16 COLOR_SUB(uint16 C1, uint16 C2) +{ + uint16 mC1, mC2, v = 0; + + mC1 = C1 & FIRST_COLOR_MASK; + mC2 = C2 & FIRST_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & SECOND_COLOR_MASK; + mC2 = C2 & SECOND_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + mC1 = C1 & THIRD_COLOR_MASK; + mC2 = C2 & THIRD_COLOR_MASK; + if (mC1 > mC2) v += (mC1 - mC2); + + return v; +} +#endif + +#define COLOR_SUB1_2(C1, C2) \ +GFX.ZERO [(((C1) | RGB_HI_BITS_MASKx2) - \ + ((C2) & RGB_REMOVE_LOW_BITS_MASK)) >> 1] + +typedef void (*NormalTileRenderer) (uint32 Tile, uint32 Offset, + uint32 StartLine, uint32 LineCount); +typedef void (*ClippedTileRenderer) (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount); +typedef void (*LargePixelRenderer) (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount); + +START_EXTERN_C +void S9xStartScreenRefresh (); +void S9xDrawScanLine (uint8 Line); +void S9xEndScreenRefresh (); +void S9xSetupOBJ (); +void S9xUpdateScreen (); +void RenderLine (uint8 line); +void S9xBuildDirectColourMaps (); + +// External port interface which must be implemented or initialised for each +// port. +extern struct SGFX GFX; + +bool8 S9xGraphicsInit (); +void S9xGraphicsInitTiles (); +void S9xGraphicsDeinit(); +bool8 S9xInitUpdate (void); +bool8 S9xDeinitUpdate (int Width, int Height, bool8 sixteen_bit); +#define S9xSetPalette() +void S9xSyncSpeed (); + +#ifdef GFX_MULTI_FORMAT +bool8 S9xSetRenderPixelFormat (int format); +#endif + +END_EXTERN_C + +#endif + diff --git a/src/include/language.h b/src/include/language.h new file mode 100644 index 0000000..613c843 --- /dev/null +++ b/src/include/language.h @@ -0,0 +1,328 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +/* This is where all the GUI text strings will eventually end up */ + +#define WINDOW_TITLE "Snes9X v%s for Windows" + +#define MY_REG_KEY "Software\\Emulators\\Snes9X" + +#define REG_KEY_VER "1.31" + +#define DISCLAIMER_TEXT "Snes9X v%s for Windows.\r\n" \ + "(c) Copyright 1996 - 2002 Gary Henderson and Jerremy Koot.\r\n" \ + "(c) Copyright 2001- 2004 John Weidman.\r\n" \ + "(c) Copyright 2002 - 2004 blip, Brad Jorsch, funkyass, Joel Yliluoma, Kris Bleakley, Matthew Kendora, Nach, Peter Bortas, zones.\r\n\r\n" \ + "Snes9X is a Super Nintendo Entertainment System\r\n" \ + "emulator that allows you to play most games designed\r\n" \ + "for the SNES on your PC.\r\n\r\n" \ + "Please visit http://www.snes9x.com for\r\n" \ + "up-to-the-minute information and help on Snes9X.\r\n\r\n" \ + "Nintendo is a trade mark." + + +#define APP_NAME "Snes9x" +/* possible global strings */ +#define SNES9X_INFO "Snes9x: Information" +#define SNES9X_WARN "Snes9x: WARNING!" +#define SNES9X_DXS "Snes9X: DirectSound" +#define SNES9X_SNDQ "Snes9X: Sound CPU Question" +#define SNES9X_NP_ERROR "Snes9X: NetPlay Error" +#define BUTTON_OK "&OK" +#define BUTTON_CANCEL "&Cancel" + +/* Gamepad Dialog Strings */ +#define INPUTCONFIG_TITLE "Input Configuration" +#define INPUTCONFIG_JPTOGGLE "Enable" +#define INPUTCONFIG_DIAGTOGGLE "Toggle Diagonals" +/* #define INPUTCONFIG_OK "&OK" */ +/* #define INPUTCONFIG_CANCEL "&Cancel" */ +#define INPUTCONFIG_JPCOMBO "Joypad #%d" +#define INPUTCONFIG_LABEL_UP "Up" +#define INPUTCONFIG_LABEL_DOWN "Down" +#define INPUTCONFIG_LABEL_LEFT "Left" +#define INPUTCONFIG_LABEL_RIGHT "Right" +#define INPUTCONFIG_LABEL_A "A" +#define INPUTCONFIG_LABEL_B "B" +#define INPUTCONFIG_LABEL_X "X" +#define INPUTCONFIG_LABEL_Y "Y" +#define INPUTCONFIG_LABEL_L "L" +#define INPUTCONFIG_LABEL_R "R" +#define INPUTCONFIG_LABEL_START "Start" +#define INPUTCONFIG_LABEL_SELECT "Select" +#define INPUTCONFIG_LABEL_UPLEFT "Up Left" +#define INPUTCONFIG_LABEL_UPRIGHT "Up Right" +#define INPUTCONFIG_LABEL_DOWNRIGHT "Down Right" +#define INPUTCONFIG_LABEL_DOWNLEFT "Down Left" +#define INPUTCONFIG_LABEL_BLUE "Blue means the current key/button is already mapped; Red means it's a Snes9x/Windows reserved key." + +/* gaming buttons and axises */ +#define GAMEDEVICE_JOYNUMPREFIX "(J%d)" +#define GAMEDEVICE_JOYBUTPREFIX "#[%d]" +#define GAMEDEVICE_XNEG "Left" +#define GAMEDEVICE_XPOS "Right" +#define GAMEDEVICE_YPOS "Up" +#define GAMEDEVICE_YNEG "Down" +#define GAMEDEVICE_POVLEFT "POV Left" +#define GAMEDEVICE_POVRIGHT "POV Right" +#define GAMEDEVICE_POVUP "POV Up" +#define GAMEDEVICE_POVDOWN "POV Down" +#define GAMEDEVICE_POVDNLEFT "POV Dn Left" +#define GAMEDEVICE_POVDNRIGHT "POV Dn Right" +#define GAMEDEVICE_POVUPLEFT "POV Up Left" +#define GAMEDEVICE_POVUPRIGHT "POV Up Right" +#define GAMEDEVICE_ZPOS "Z Up" +#define GAMEDEVICE_ZNEG "Z Down" +#define GAMEDEVICE_RPOS "R Up" +#define GAMEDEVICE_RNEG "R Down" +#define GAMEDEVICE_UPOS "U Up" +#define GAMEDEVICE_UNEG "U Down" +#define GAMEDEVICE_VPOS "V Up" +#define GAMEDEVICE_VNEG "V Down" +#define GAMEDEVICE_BUTTON "Button %d" + +/* gaming general */ +#define GAMEDEVICE_DISABLED "Disabled" + +/* gaming keys */ +#define GAMEDEVICE_KEY "#%d" +#define GAMEDEVICE_NUMPADPREFIX "Numpad-%c" +#define GAMEDEVICE_VK_TAB "Tab" +#define GAMEDEVICE_VK_BACK "Backspace" +#define GAMEDEVICE_VK_CLEAR "Delete" +#define GAMEDEVICE_VK_RETURN "Enter" +#define GAMEDEVICE_VK_LSHIFT "LShift" +#define GAMEDEVICE_VK_RSHIFT "RShift" +#define GAMEDEVICE_VK_LCONTROL "LCTRL" +#define GAMEDEVICE_VK_RCONTROL "RCTRL" +#define GAMEDEVICE_VK_LMENU "LAlt" +#define GAMEDEVICE_VK_RMENU "RAlt" +#define GAMEDEVICE_VK_PAUSE "Pause" +#define GAMEDEVICE_VK_CAPITAL "Capslock" +#define GAMEDEVICE_VK_ESCAPE "Disabled" +#define GAMEDEVICE_VK_SPACE "Space" +#define GAMEDEVICE_VK_PRIOR "PgUp" +#define GAMEDEVICE_VK_NEXT "PgDn" +#define GAMEDEVICE_VK_HOME "Home" +#define GAMEDEVICE_VK_END "End" +#define GAMEDEVICE_VK_LEFT "Left" +#define GAMEDEVICE_VK_RIGHT "Right" +#define GAMEDEVICE_VK_UP "Up" +#define GAMEDEVICE_VK_DOWN "Down" +#define GAMEDEVICE_VK_SELECT "Select" +#define GAMEDEVICE_VK_PRINT "Print" +#define GAMEDEVICE_VK_EXECUTE "Execute" +#define GAMEDEVICE_VK_SNAPSHOT "SnapShot" +#define GAMEDEVICE_VK_INSERT "Insert" +#define GAMEDEVICE_VK_DELETE "Delete" +#define GAMEDEVICE_VK_HELP "Help" +#define GAMEDEVICE_VK_LWIN "LWinKey" +#define GAMEDEVICE_VK_RWIN "RWinKey" +#define GAMEDEVICE_VK_APPS "AppKey" +#define GAMEDEVICE_VK_MULTIPLY "Numpad *" +#define GAMEDEVICE_VK_ADD "Numpad +" +#define GAMEDEVICE_VK_SEPARATOR "\\" +#define GAMEDEVICE_VK_OEM_1 "Semi-Colon" +#define GAMEDEVICE_VK_OEM_7 "Apostrophe" +#define GAMEDEVICE_VK_OEM_COMMA "Comma" +#define GAMEDEVICE_VK_OEM_PERIOD "Period" +#define GAMEDEVICE_VK_SUBTRACT "Numpad -" +#define GAMEDEVICE_VK_DECIMAL "Numpad ." +#define GAMEDEVICE_VK_DIVIDE "Numpad /" +#define GAMEDEVICE_VK_NUMLOCK "Num-lock" +#define GAMEDEVICE_VK_SCROLL "Scroll-lock" + +/* evil things I found in WinProc */ + +#define WINPROC_TURBOMODE_ON "Turbo Mode Activated" +#define WINPROC_TURBOMODE_OFF "Turbo Mode Deactivated" +#define WINPROC_TURBOMODE_TEXT "Turbo Mode" +#define WINPROC_HDMA_TEXT "HDMA emulation" +#define WINPROC_BG1 "BG#1" /* Background Layers */ +#define WINPROC_BG2 "BG#2" +#define WINPROC_BG3 "BG#3" +#define WINPROC_BG4 "BG#4" +#define WINPROC_SPRITES "Sprites" +#define WINPROC_PADSWAP "Joypad swapping" +#define WINPROC_CONTROLERS0 "Multiplayer 5 on #0" +#define WINPROC_CONTROLERS1 "Joypad on #0" +#define WINPROC_CONTROLERS2 "Mouse on #1" +#define WINPROC_CONTROLERS3 "Mouse on #0" +#define WINPROC_CONTROLERS4 "Superscope on #1" +#define WINPROC_CONTROLERS5 "Justifier 1 on #1" +#define WINPROC_CONTROLERS6 "Justifier 2 on #1" +#define WINPROC_BGHACK "Background layering hack" +#define WINPROC_MODE7INTER "Mode 7 Interpolation" +#define WINPROC_TRANSPARENCY "Transparency effects" +#define WINPROC_CLIPWIN "Graphic clip windows" +#define WINPROC_PAUSE "Pause" +#define WINPROC_EMUFRAMETIME "Emulated frame time: %dms" +#define WINPROC_AUTOSKIP "Auto Frame Skip" +#define WINPROC_FRAMESKIP "Frame skip: %d" +#define WINPROC_TURBO_R_ON "Turbo R Activated" +#define WINPROC_TURBO_R_OFF "Turbo R Deactivated" +#define WINPROC_TURBO_L_ON "Turbo L Activated" +#define WINPROC_TURBO_L_OFF "Turbo L Deactivated" +#define WINPROC_TURBO_X_ON "Turbo X Activated" +#define WINPROC_TURBO_X_OFF "Turbo X Deactivated" +#define WINPROC_TURBO_Y_ON "Turbo Y Activated" +#define WINPROC_TURBO_Y_OFF "Turbo Y Deactivated" +#define WINPROC_TURBO_A_ON "Turbo A Activated" +#define WINPROC_TURBO_A_OFF "Turbo A Deactivated" +#define WINPROC_TURBO_B_ON "Turbo B Activated" +#define WINPROC_TURBO_B_OFF "Turbo B Deactivated" +#define WINPROC_TURBO_SEL_ON "Turbo Select Activated" +#define WINPROC_TURBO_SEL_OFF "Turbo Select Deactivated" +#define WINPROC_TURBO_START_ON "Turbo Start Activated" +#define WINPROC_TURBO_START_OFF "Turbo Start Deactivated" +#define WINPROC_FILTER_RESTART "You will need to restart Snes9x before the output image\nprocessing option change will take effect." +#define WINPROC_DISCONNECT "Disconnect from the NetPlay server first." +#define WINPROC_NET_RESTART "Your game will be reset after the ROM has been sent due to\nyour 'Sync Using Reset Game' setting.\n\n" +#define WINPROC_INTERPOLATED_SND "Interpolated sound" +#define WINPROC_SYNC_SND "Sync sound" +#define WINPROC_SND_OFF "Disabling the sound CPU emulation will help to improve\nemulation speed but you will not hear any sound effects\nor music. If you later want to re-enable the sound CPU\nemulation you will need to reset your game before it will\ntake effect.\n\nAre you sure this is what you want?" +#define WINPROC_SND_RESTART "You will need to reset your game or load another one\nbefore enabling the sound CPU will take effect." + +/* Emulator Settings */ + +#define EMUSET_TITLE "Emulation Settings" +#define EMUSET_LABEL_FREEZE "Freeze Folder Directory" +#define EMUSET_BROWSE "&Browse..." +#define EMUSET_LABEL_ASRAM "Auto-Save S-RAM" +#define EMUSET_LABEL_ASRAM_TEXT "seconds after last change (0 disables auto-save)" +#define EMUSET_LABEL_SMAX "Skip at most" +#define EMUSET_LABEL_SMAX_TEXT "frames in auto-frame rate mode" +#define EMUSET_LABEL_STURBO "Skip Rendering" +#define EMUSET_LABEL_STURBO_TEXT "frames in Turbo mode" +#define EMUSET_TOGGLE_TURBO "Tab Toggles Turbo" + +/* Netplay Options */ + +#define NPOPT_TITLE "Netplay Options" +#define NPOPT_LABEL_PORTNUM "Socket Port Number" +#define NPOPT_LABEL_PAUSEINTERVAL "Ask Server to Pause when" +#define NPOPT_LABEL_PAUSEINTERVAL_TEXT "frames behind" +#define NPOPT_LABEL_MAXSKIP "Maximum Frame Rate Skip" +#define NPOPT_SYNCBYRESET "Sync By Reset" +#define NPOPT_SENDROM "Send ROM Image to Client on Connect" +#define NPOPT_ACTASSERVER "Act As Server" +#define NPOPT_PORTNUMBLOCK "Port Settings" +#define NPOPT_CLIENTSETTINGSBLOCK "Client Settings" +#define NPOPT_SERVERSETTINGSBLOCK "Server Settings" + +/* Netplay Connect */ + + +#define NPCON_TITLE "Connect to Server" +#define NPCON_LABEL_SERVERADDY "Server Address" +#define NPCON_LABEL_PORTNUM "Port Number" +#define NPCON_CLEARHISTORY "Clear History" + + +/* Movie Messages */ + +#define MOVIE_INFO_REPLAY "Movie replay" +#define MOVIE_INFO_RECORD "Movie record" +#define MOVIE_INFO_RERECORD "Movie re-record" +#define MOVIE_INFO_REWIND "Movie rewind" +#define MOVIE_INFO_STOP "Movie stop" +#define MOVIE_INFO_END "Movie end" +#define MOVIE_INFO_RECORDING_ENABLED "Recording enabled" +#define MOVIE_INFO_RECORDING_DISABLED "Recording disabled" +#define MOVIE_ERR_SNAPSHOT_WRONG_MOVIE "Snapshot not from this movie" +#define MOVIE_ERR_SNAPSHOT_NOT_MOVIE "Not a movie snapshot" +#define MOVIE_ERR_COULD_NOT_OPEN "Could not open movie file." +#define MOVIE_ERR_NOT_FOUND "File not found." +#define MOVIE_ERR_WRONG_FORMAT "File is wrong format." +#define MOVIE_ERR_WRONG_VERSION "File is wrong version." + + +/* AVI Messages */ + +#define AVI_CONFIGURATION_CHANGED "AVI recording stopped (configuration settings changed)." diff --git a/src/include/memmap.h b/src/include/memmap.h new file mode 100644 index 0000000..82270d9 --- /dev/null +++ b/src/include/memmap.h @@ -0,0 +1,317 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _memmap_h_ +#define _memmap_h_ + +#include "snes9x.h" +#include "snes4all.h" + +#ifdef FAST_LSB_WORD_ACCESS +#define READ_WORD(s) (*(uint16 *) (s)) +#define READ_DWORD(s) (*(uint32 *) (s)) +#define WRITE_WORD(s, d) (*(uint16 *) (s)) = (d) +#define WRITE_DWORD(s, d) (*(uint32 *) (s)) = (d) + +#define READ_3WORD(s) (0x00ffffff & *(uint32 *) (s)) +#define WRITE_3WORD(s, d) *(uint16 *) (s) = (uint16)(d),\ + *((uint8 *) (s) + 2) = (uint8) ((d) >> 16) + + +#else +#define READ_WORD(s) ( *(uint8 *) (s) |\ + (*((uint8 *) (s) + 1) << 8)) +#define READ_DWORD(s) ( *(uint8 *) (s) |\ + (*((uint8 *) (s) + 1) << 8) |\ + (*((uint8 *) (s) + 2) << 16) |\ + (*((uint8 *) (s) + 3) << 24)) +#define WRITE_WORD(s, d) *(uint8 *) (s) = (d), \ + *((uint8 *) (s) + 1) = (d) >> 8 +#define WRITE_DWORD(s, d) *(uint8 *) (s) = (uint8) (d), \ + *((uint8 *) (s) + 1) = (uint8) ((d) >> 8),\ + *((uint8 *) (s) + 2) = (uint8) ((d) >> 16),\ + *((uint8 *) (s) + 3) = (uint8) ((d) >> 24) +#define WRITE_3WORD(s, d) *(uint8 *) (s) = (uint8) (d), \ + *((uint8 *) (s) + 1) = (uint8) ((d) >> 8),\ + *((uint8 *) (s) + 2) = (uint8) ((d) >> 16) +#define READ_3WORD(s) ( *(uint8 *) (s) |\ + (*((uint8 *) (s) + 1) << 8) |\ + (*((uint8 *) (s) + 2) << 16)) +#endif + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT 12 +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) +#define MEMMAP_MAX_SDD1_LOGGED_ENTRIES (0x10000 / 8) + +//Extended ROM Formats +#define NOPE 0 +#define YEAH 1 +#define BIGFIRST 2 +#define SMALLFIRST 3 + +//File Formats go here +enum file_formats { FILE_ZIP, FILE_RAR, FILE_JMA, FILE_DEFAULT }; + +bool8 CMemory_LoadROM (const char *); +uint32 CMemory_FileLoader (uint8* buffer, const char* filename, int32 maxsize); +void CMemory_InitROM (bool8); +bool8 CMemory_LoadSRAM (const char *); +bool8 CMemory_SaveSRAM (const char *); +bool8 CMemory_Init (); +void CMemory_Deinit (); +void CMemory_FreeSDD1Data (); +void CMemory_WriteProtectROM (); +void CMemory_FixROMSpeed (); +void CMemory_MapRAM (); +void CMemory_MapExtraRAM (); +char *CMemory_Safe (const char *); +void CMemory_BSLoROMMap(); +void CMemory_JumboLoROMMap (bool8); +void CMemory_LoROMMap (); +void CMemory_LoROM24MBSMap (); +void CMemory_SRAM512KLoROMMap (); +//void CMemory_SRAM1024KLoROMMap (); +void CMemory_SufamiTurboLoROMMap (); +void CMemory_HiROMMap (); +void CMemory_SuperFXROMMap (); +void CMemory_TalesROMMap (bool8); +void CMemory_AlphaROMMap (); +void CMemory_SA1ROMMap (); +void CMemory_BSHiROMMap (); +void CMemory_SPC7110HiROMMap(); +void CMemory_SPC7110Sram(uint8); +void CMemory_SetaDSPMap(); +bool8 CMemory_AllASCII (uint8 *b, int size); +int CMemory_ScoreHiROM (bool8 skip_header, int32 offset); +int CMemory_ScoreLoROM (bool8 skip_header, int32 offset); +//void CMemory_SufamiTurboAltROMMap(); +void CMemory_ApplyROMFixes (); +void CMemory_CheckForIPSPatch (const char *rom_filename, bool8 header, int32 *rom_size); +const char *CMemory_TVStandard (); +const char *CMemory_Speed (); +const char *CMemory_StaticRAMSize (); +const char *CMemory_MapType (); +const char *CMemory_MapMode (); +const char *CMemory_KartContents (); +const char *CMemory_Size (); +const char *CMemory_Headers (); +const char *CMemory_ROMID (); +const char *CMemory_CompanyID (); +void CMemory_ParseSNESHeader(uint8*); +enum { + CMemory_MAP_PPU, CMemory_MAP_CPU, CMemory_MAP_DSP, CMemory_MAP_LOROM_SRAM, CMemory_MAP_HIROM_SRAM, + CMemory_MAP_NONE, CMemory_MAP_DEBUG, CMemory_MAP_C4, CMemory_MAP_BWRAM, CMemory_MAP_BWRAM_BITMAP, + CMemory_MAP_BWRAM_BITMAP2, CMemory_MAP_SA1RAM, CMemory_MAP_SPC7110_ROM, CMemory_MAP_SPC7110_DRAM, + CMemory_MAP_RONLY_SRAM, CMemory_MAP_OBC_RAM, CMemory_MAP_SETA_DSP, CMemory_MAP_SETA_RISC, CMemory_MAP_LAST + }; + +#define CMemory_MAX_ROM_SIZE SNES4ALL_MAX_ROM_SIZE + +#ifdef __cplusplus +extern "C"{ +#endif +#ifdef USE_MEMORY_POINTERS +extern uint8 *CMemory_RAM; +extern uint8 *CMemory_ROM; +extern uint8 *CMemory_VRAM; +extern uint8 *CMemory_SRAM; +extern uint8 *CMemory_FillRAM; +extern uint8 *CMemory_C4RAM; +#else +extern uint8 CMemory_RAM[0x20000]; +extern uint8 CMemory_VRAM[0x10000]; +extern uint8 CMemory_SRAM[0x20000]; +extern uint8 CMemory_FillRAM[SNES4ALL_MAX_ROM_SIZE + 0x200 +0x8000]; +//extern uint8 CMemory_FillRAM[SNES4ALL_MAX_ROM_SIZE + 0x200 +0x8000] __asm__ ("0x00000000"); +#if defined(DREAMCAST) || defined(WIN32) +extern uint8 CMemory_ROM[SNES4ALL_MAX_ROM_SIZE + 0x200] __asm__ ("_CMemory_FillRAM + 0x8000"); +extern uint8 CMemory_C4RAM[SNES4ALL_MAX_ROM_SIZE + 0x200 + 0x8000 - 0x400000 - 0x10000] __asm__ ("_CMemory_FillRAM + 0x8000 + 0x400000 + 0x10000"); +//extern uint8 CMemory_ROM[SNES4ALL_MAX_ROM_SIZE + 0x200] __asm__ ("0x8000"); +//extern uint8 CMemory_C4RAM[SNES4ALL_MAX_ROM_SIZE + 0x200 + 0x8000 - 0x400000 - 0x10000] __asm__ ("0x8000 + 0x400000 + 0x10000"); +#else +extern uint8 CMemory_ROM[SNES4ALL_MAX_ROM_SIZE + 0x200] __asm__ ("CMemory_FillRAM + 0x8000"); +extern uint8 CMemory_C4RAM[SNES4ALL_MAX_ROM_SIZE + 0x200 + 0x8000 - 0x400000 - 0x10000] __asm__ ("CMemory_FillRAM + 0x8000 + 0x400000 + 0x10000"); +#endif +#endif +extern uint8 *CMemory_BWRAM; +extern bool8 CMemory_HiROM; +extern bool8 CMemory_LoROM; +extern uint32 CMemory_SRAMMask; +extern uint8 CMemory_SRAMSize; +extern uint8 *CMemory_Map [MEMMAP_NUM_BLOCKS]; +extern uint8 *CMemory_WriteMap [MEMMAP_NUM_BLOCKS]; +extern uint8 CMemory_MemorySpeed [MEMMAP_NUM_BLOCKS]; +extern uint8 CMemory_BlockIsRAM [MEMMAP_NUM_BLOCKS]; +extern uint8 CMemory_BlockIsROM [MEMMAP_NUM_BLOCKS]; +extern char CMemory_ROMName [ROM_NAME_LEN]; +extern char CMemory_ROMId [5]; +extern char CMemory_CompanyId [3]; +extern uint8 CMemory_ROMSpeed; +extern uint8 CMemory_ROMType; +extern uint8 CMemory_ROMSize; +extern int32 CMemory_ROMFramesPerSecond; +extern int32 CMemory_HeaderCount; +extern uint32 CMemory_CalculatedSize; +extern uint32 CMemory_CalculatedChecksum; +extern uint32 CMemory_ROMChecksum; +extern uint32 CMemory_ROMComplementChecksum; +extern uint8 *CMemory_SDD1Index; +extern uint8 *CMemory_SDD1Data; +extern uint32 CMemory_SDD1Entries; +extern uint32 CMemory_SDD1LoggedDataCountPrev; +extern uint32 CMemory_SDD1LoggedDataCount; +extern uint8 CMemory_SDD1LoggedData [MEMMAP_MAX_SDD1_LOGGED_ENTRIES]; +extern char CMemory_ROMFilename [_MAX_PATH]; +extern uint8 CMemory_ROMRegion; +extern uint32 CMemory_ROMCRC32; +extern uint8 CMemory_ExtendedFormat; +#if 0 +extern bool8 CMemory_SufamiTurbo; +extern char CMemory_Slot1Filename [_MAX_PATH]; +extern char CMemory_Slot2Filename [_MAX_PATH]; +extern uint8* CMemory_ROMOffset1; +extern uint8* CMemory_ROMOffset2; +extern uint8* CMemory_SRAMOffset1; +extern uint8* CMemory_SRAMOffset2; +extern uint32 CMemory_Slot1Size; +extern uint32 CMemory_Slot2Size; +extern uint32 CMemory_Slot1SRAMSize; +extern uint32 CMemory_Slot2SRAMSize; +extern uint8 CMemory_SlotContents; +#endif +extern uint8 CMemory_BSRAM[0x80000]; +#ifdef __cplusplus +} +#endif + +void CMemory_ResetSpeedMap(); +#if 0 +bool8 CMemory_LoadMulti (const char *,const char *,const char *); +#endif + +//#define SRAM CMemory_SRAM +//#define ROM CMemory_ROM +//#define ROM CMemory_ROM +//#define RegRAM CMemory_FillRAM +START_EXTERN_C +void S9xDeinterleaveMode2 (); +bool8 LoadZip(const char* zipname, + int32 *TotalFileSize, + int32 *headers, + uint8 *buffer); +END_EXTERN_C + +void S9xAutoSaveSRAM (); + +#if defined(NO_INLINE_SET_GET) || defined(USE_MMU) +uint8 S9xGetByte (uint32 Address); +uint16 S9xGetWord (uint32 Address); +void S9xSetByte (uint8 Byte, uint32 Address); +void S9xSetWord (uint16 Byte, uint32 Address); +void S9xSetPCBase (uint32 Address); +uint8 *S9xGetMemPointer (uint32 Address); +uint8 *GetBasePointer (uint32 Address); + +#ifdef __cplusplus +extern "C"{ +#endif +extern uint8 OpenBus; +#ifdef __cplusplus +} +#endif +#else +#define INLINE static __inline__ +#include "getset.h" +#endif // NO_INLINE_SET_GET + +#endif // _memmap_h_ + diff --git a/src/include/messages.h b/src/include/messages.h new file mode 100644 index 0000000..1f85576 --- /dev/null +++ b/src/include/messages.h @@ -0,0 +1,137 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _messages_h_ +#define _messages_h_ + +/* Types of message sent to S9xMessage routine */ +enum { + S9X_TRACE, + S9X_DEBUG, + S9X_WARNING, + S9X_INFO, + S9X_ERROR, + S9X_FATAL_ERROR +}; + +/* Individual message numbers */ +enum { + S9X_ROM_INFO, + S9X_HEADERS_INFO, + S9X_ROM_CONFUSING_FORMAT_INFO, + S9X_ROM_INTERLEAVED_INFO, + S9X_SOUND_DEVICE_OPEN_FAILED, + S9X_APU_STOPPED, + S9X_USAGE, + S9X_GAME_GENIE_CODE_ERROR, + S9X_ACTION_REPLY_CODE_ERROR, + S9X_GOLD_FINGER_CODE_ERROR, + S9X_DEBUG_OUTPUT, + S9X_DMA_TRACE, + S9X_HDMA_TRACE, + S9X_WRONG_FORMAT, + S9X_WRONG_VERSION, + S9X_ROM_NOT_FOUND, + S9X_FREEZE_FILE_NOT_FOUND, + S9X_PPU_TRACE, + S9X_TRACE_DSP1, + S9X_FREEZE_ROM_NAME, + S9X_HEADER_WARNING, + S9X_NETPLAY_NOT_SERVER, + S9X_FREEZE_FILE_INFO, + S9X_TURBO_MODE, + S9X_SOUND_NOT_BUILT, + S9X_MOVIE_INFO, + S9X_WRONG_MOVIE_SNAPSHOT, + S9X_NOT_A_MOVIE_SNAPSHOT, + S9X_AVI_INFO +}; + +#endif + diff --git a/src/include/missing.h b/src/include/missing.h new file mode 100644 index 0000000..3969c31 --- /dev/null +++ b/src/include/missing.h @@ -0,0 +1,167 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _MISSING_H_ +#define _MISSING_H_ + +#ifdef DEBUGGER + +struct HDMA +{ + uint8 used; + uint8 bbus_address; + uint8 abus_bank; + uint16 abus_address; + uint8 indirect_address; + uint8 force_table_address_write; + uint8 force_table_address_read; + uint8 line_count_write; + uint8 line_count_read; +}; + +struct Missing +{ + uint8 emulate6502; + uint8 decimal_mode; + uint8 mv_8bit_index; + uint8 mv_8bit_acc; + uint8 interlace; + uint8 lines_239; + uint8 pseudo_512; + struct HDMA hdma [8]; + uint8 modes [8]; + uint8 mode7_fx; + uint8 mode7_flip; + uint8 mode7_bgmode; + uint8 direct; + uint8 matrix_multiply; + uint8 oam_read; + uint8 vram_read; + uint8 cgram_read; + uint8 wram_read; + uint8 dma_read; + uint8 vram_inc; + uint8 vram_full_graphic_inc; + uint8 virq; + uint8 hirq; + uint16 virq_pos; + uint16 hirq_pos; + uint8 h_v_latch; + uint8 h_counter_read; + uint8 v_counter_read; + uint8 fast_rom; + uint8 window1 [6]; + uint8 window2 [6]; + uint8 sprite_priority_rotation; + uint8 subscreen; + uint8 subscreen_add; + uint8 subscreen_sub; + uint8 fixed_colour_add; + uint8 fixed_colour_sub; + uint8 mosaic; + uint8 sprite_double_height; + uint8 dma_channels; + uint8 dma_this_frame; + uint8 oam_address_read; + uint8 bg_offset_read; + uint8 matrix_read; + uint8 hdma_channels; + uint8 hdma_this_frame; + uint16 unknownppu_read; + uint16 unknownppu_write; + uint16 unknowncpu_read; + uint16 unknowncpu_write; + uint16 unknowndsp_read; + uint16 unknowndsp_write; +}; + +EXTERN_C struct Missing missing; + +#endif +#endif diff --git a/src/include/movie.h b/src/include/movie.h new file mode 100644 index 0000000..cf97442 --- /dev/null +++ b/src/include/movie.h @@ -0,0 +1,146 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + Input recording/playback code + (c) Copyright 2004 blip + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _MOVIE_H_ +#define _MOVIE_H_ + +#include +#include +#include "snes9x.h" + +#ifndef SUCCESS +# define SUCCESS 1 +# define WRONG_FORMAT (-1) +# define WRONG_VERSION (-2) +# define FILE_NOT_FOUND (-3) +#endif + +#define MOVIE_OPT_FROM_SNAPSHOT 0 +#define MOVIE_OPT_FROM_RESET (1<<0) +#define MOVIE_OPT_PAL (1<<1) +#define MOVIE_MAX_METADATA 512 + +START_EXTERN_C +struct MovieInfo +{ + time_t TimeCreated; + uint32 LengthFrames; + uint32 RerecordCount; + wchar_t Metadata[MOVIE_MAX_METADATA]; // really should be wchar_t + uint8 Opts; + uint8 ControllersMask; + bool8 ReadOnly; +}; + +// methods used by the user-interface code +int S9xMovieOpen (const char* filename, bool8 read_only); +int S9xMovieCreate (const char* filename, uint8 controllers_mask, uint8 opts, const wchar_t* metadata, int metadata_length); +int S9xMovieGetInfo (const char* filename, struct MovieInfo* info); +void S9xMovieStop (bool8 suppress_message); +void S9xMovieToggleFrameDisplay (); + +// methods used by the emulation +void S9xMovieInit (); +void S9xMovieUpdate (); +//bool8 S9xMovieRewind (uint32 at_frame); +void S9xMovieFreeze (uint8** buf, uint32* size); +bool8 S9xMovieUnfreeze (const uint8* buf, uint32 size); + +// accessor functions +bool8 S9xMovieActive (); +// the following accessors return 0/false if !S9xMovieActive() +bool8 S9xMovieReadOnly (); +uint32 S9xMovieGetId (); +uint32 S9xMovieGetLength (); +uint32 S9xMovieGetFrameCounter (); + +END_EXTERN_C + +#endif diff --git a/src/include/netplay.h b/src/include/netplay.h new file mode 100644 index 0000000..fe7c66a --- /dev/null +++ b/src/include/netplay.h @@ -0,0 +1,285 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _NETPLAY_H_ +#define _NETPLAY_H_ + +/* + * Client to server joypad update + * + * magic 1 + * sequence_no 1 + * opcode 1 + * joypad data 4 + * + * Server to client joypad update + * magic 1 + * sequence_no 1 + * opcode 1 + num joypads (top 3 bits) + * joypad data 4 * n + */ + +//#define NP_DEBUG 1 + +#define NP_VERSION 10 +#define NP_JOYPAD_HIST_SIZE 120 +#define NP_DEFAULT_PORT 6096 + +#define NP_MAX_CLIENTS 5 + +#define NP_SERV_MAGIC 'S' +#define NP_CLNT_MAGIC 'C' + +#define NP_CLNT_HELLO 0 +#define NP_CLNT_JOYPAD 1 +#define NP_CLNT_RESET 2 +#define NP_CLNT_PAUSE 3 +#define NP_CLNT_LOAD_ROM 4 +#define NP_CLNT_ROM_IMAGE 5 +#define NP_CLNT_FREEZE_FILE 6 +#define NP_CLNT_SRAM_DATA 7 +#define NP_CLNT_READY 8 +#define NP_CLNT_LOADED_ROM 9 +#define NP_CLNT_RECEIVED_ROM_IMAGE 10 +#define NP_CLNT_WAITING_FOR_ROM_IMAGE 11 + +#define NP_SERV_HELLO 0 +#define NP_SERV_JOYPAD 1 +#define NP_SERV_RESET 2 +#define NP_SERV_PAUSE 3 +#define NP_SERV_LOAD_ROM 4 +#define NP_SERV_ROM_IMAGE 5 +#define NP_SERV_FREEZE_FILE 6 +#define NP_SERV_SRAM_DATA 7 +#define NP_SERV_READY 8 + +struct SNPClient +{ + volatile uint8 SendSequenceNum; + volatile uint8 ReceiveSequenceNum; + volatile bool8 Connected; + volatile bool8 SaidHello; + volatile bool8 Paused; + volatile bool8 Ready; + int Socket; + char *ROMName; + char *HostName; + char *Who; +}; + +enum { + NP_SERVER_SEND_ROM_IMAGE, + NP_SERVER_SYNC_ALL, + NP_SERVER_SYNC_CLIENT, + NP_SERVER_SEND_FREEZE_FILE_ALL, + NP_SERVER_SEND_ROM_LOAD_REQUEST_ALL, + NP_SERVER_RESET_ALL, + NP_SERVER_SEND_SRAM_ALL, + NP_SERVER_SEND_SRAM +}; + +#define NP_MAX_TASKS 20 + +struct NPServerTask +{ + uint32 Task; + void *Data; +}; + +struct SNPServer +{ + struct SNPClient Clients [NP_MAX_CLIENTS]; + int NumClients; + volatile struct NPServerTask TaskQueue [NP_MAX_TASKS]; + volatile uint32 TaskHead; + volatile uint32 TaskTail; + int Socket; + uint32 FrameTime; + uint32 FrameCount; + char ROMName [30]; + uint32 Joypads [5]; + bool8 ClientPaused; + uint32 Paused; + bool8 SendROMImageOnConnect; + bool8 SyncByReset; +}; + +#define NP_MAX_ACTION_LEN 200 + +struct SNetPlay +{ + volatile uint8 MySequenceNum; + volatile uint8 ServerSequenceNum; + volatile bool8 Connected; + volatile bool8 Abort; + volatile uint8 Player; + volatile bool8 ClientsReady [NP_MAX_CLIENTS]; + volatile bool8 ClientsPaused [NP_MAX_CLIENTS]; + volatile bool8 Paused; + volatile bool8 PendingWait4Sync; + volatile uint8 PercentageComplete; + volatile bool8 Waiting4EmulationThread; + volatile bool8 Answer; +#ifdef __WIN32__ + HANDLE ReplyEvent; +#endif + volatile int Socket; + char *ServerHostName; + char *ROMName; + int Port; + volatile uint32 JoypadWriteInd; + volatile uint32 JoypadReadInd; + uint32 Joypads [NP_JOYPAD_HIST_SIZE][NP_MAX_CLIENTS]; + uint32 Frame [NP_JOYPAD_HIST_SIZE]; + uint32 FrameCount; + uint32 MaxFrameSkip; + uint32 MaxBehindFrameCount; + char ActionMsg [NP_MAX_ACTION_LEN]; + char ErrorMsg [NP_MAX_ACTION_LEN]; + char WarningMsg [NP_MAX_ACTION_LEN]; +}; + +extern "C" struct SNetPlay NetPlay; + +// +// NETPLAY_CLIENT_HELLO message format: +// header +// frame_time (4) +// ROMName (variable) + +#define WRITE_LONG(p, v) { \ +*((p) + 0) = (uint8) ((v) >> 24); \ +*((p) + 1) = (uint8) ((v) >> 16); \ +*((p) + 2) = (uint8) ((v) >> 8); \ +*((p) + 3) = (uint8) ((v) >> 0); \ +} + +#define READ_LONG(p) \ +((((uint8) *((p) + 0)) << 24) | \ + (((uint8) *((p) + 1)) << 16) | \ + (((uint8) *((p) + 2)) << 8) | \ + (((uint8) *((p) + 3)) << 0)) + +bool8 S9xNPConnectToServer (const char *server_name, int port, + const char *rom_name); +bool8 S9xNPWaitForHeartBeat (); +uint32 S9xNPGetJoypad (int which1); +bool8 S9xNPSendJoypadUpdate (uint32 joypad); +void S9xNPDisconnect (); +bool8 S9xNPInitialise (); +bool8 S9xNPSendData (int fd, const uint8 *data, int len); +bool8 S9xNPGetData (int fd, uint8 *data, int len); + +void S9xNPSyncClients (); +void S9xNPStepJoypadHistory (); + +void S9xNPResetJoypadReadPos (); +bool8 S9xNPSendReady (uint8 op = NP_CLNT_READY); +bool8 S9xNPSendPause (bool8 pause); +void S9xNPReset (); +void S9xNPSetAction (const char *action, bool8 force = FALSE); +void S9xNPSetError (const char *error); +void S9xNPSetWarning (const char *warning); +void S9xNPDiscardHeartbeats (); +void S9xNPServerQueueSendingFreezeFile (const char *filename); +void S9xNPServerQueueSyncAll (); +void S9xNPServerQueueSendingROMImage (); +void S9xNPServerQueueSendingLoadROMRequest (const char *filename); + +void S9xNPServerAddTask (uint32 task, void *data); + +bool8 S9xNPStartServer (int port); +void S9xNPStopServer (); +#ifdef __WIN32__ +#define S9xGetMilliTime timeGetTime +#else +uint32 S9xGetMilliTime (); +#endif +#endif + diff --git a/src/include/obc1.h b/src/include/obc1.h new file mode 100644 index 0000000..82ce89f --- /dev/null +++ b/src/include/obc1.h @@ -0,0 +1,102 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _OBC1_H_ +#define _OBC1_H_ + +START_EXTERN_C +uint8 GetOBC1 (uint16 Address); +void SetOBC1 (uint8 Byte, uint16 Address); +uint8 *GetBasePointerOBC1(uint32 Address); +uint8 *GetMemPointerOBC1(uint32 Address); +void ResetOBC1();//bool8 full); +END_EXTERN_C + +#endif + diff --git a/src/include/pixform.h b/src/include/pixform.h new file mode 100644 index 0000000..04e918f --- /dev/null +++ b/src/include/pixform.h @@ -0,0 +1,366 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _PIXFORM_H_ +#define _PIXFORM_H_ + +#ifdef GFX_MULTI_FORMAT + +enum { RGB565, RGB555, BGR565, BGR555, GBR565, GBR555, RGB5551 }; + +#define BUILD_PIXEL(R,G,B) ((*GFX.BuildPixel) (R, G, B)) +#define BUILD_PIXEL2(R,G,B) ((*GFX.BuildPixel2) (R, G, B)) +#define DECOMPOSE_PIXEL(Pixel,R,G,B) ((*GFX.DecomposePixel) (Pixel, R,G,B)) + +extern uint32 RED_LOW_BIT_MASK; +extern uint32 GREEN_LOW_BIT_MASK; +extern uint32 BLUE_LOW_BIT_MASK; +extern uint32 RED_HI_BIT_MASK; +extern uint32 GREEN_HI_BIT_MASK; +extern uint32 BLUE_HI_BIT_MASK; +extern uint32 MAX_RED; +extern uint32 MAX_GREEN; +extern uint32 MAX_BLUE; +extern uint32 SPARE_RGB_BIT_MASK; +extern uint32 GREEN_HI_BIT; +extern uint32 RGB_LOW_BITS_MASK; +extern uint32 RGB_HI_BITS_MASK; +extern uint32 RGB_HI_BITS_MASKx2; +extern uint32 RGB_REMOVE_LOW_BITS_MASK; +extern uint32 FIRST_COLOR_MASK; +extern uint32 SECOND_COLOR_MASK; +extern uint32 THIRD_COLOR_MASK; +extern uint32 ALPHA_BITS_MASK; +extern uint32 FIRST_THIRD_COLOR_MASK; +extern uint32 TWO_LOW_BITS_MASK; +extern uint32 HIGH_BITS_SHIFTED_TWO_MASK; + +#endif + +/* RGB565 format */ +#define BUILD_PIXEL_RGB565(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) (B)) +#define BUILD_PIXEL2_RGB565(R,G,B) (((int) (R) << 11) | ((int) (G) << 5) | (int) (B)) +#define DECOMPOSE_PIXEL_RGB565(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB565 (1 << 5) + +#define MAX_RED_RGB565 31 +#define MAX_GREEN_RGB565 63 +#define MAX_BLUE_RGB565 31 +#define RED_LOW_BIT_MASK_RGB565 0x0800 +#define GREEN_LOW_BIT_MASK_RGB565 0x0020 +#define BLUE_LOW_BIT_MASK_RGB565 0x0001 +#define RED_HI_BIT_MASK_RGB565 0x8000 +#define GREEN_HI_BIT_MASK_RGB565 0x0400 +#define BLUE_HI_BIT_MASK_RGB565 0x0010 +#define FIRST_COLOR_MASK_RGB565 0xF800 +#define SECOND_COLOR_MASK_RGB565 0x07E0 +#define THIRD_COLOR_MASK_RGB565 0x001F +#define ALPHA_BITS_MASK_RGB565 0x0000 + +/* RGB555 format */ +#define BUILD_PIXEL_RGB555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B)) +#define BUILD_PIXEL2_RGB555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B)) +#define DECOMPOSE_PIXEL_RGB555(PIX,R,G,B) {(R) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (B) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB555 (1 << 15) + +#define MAX_RED_RGB555 31 +#define MAX_GREEN_RGB555 31 +#define MAX_BLUE_RGB555 31 +#define RED_LOW_BIT_MASK_RGB555 0x0400 +#define GREEN_LOW_BIT_MASK_RGB555 0x0020 +#define BLUE_LOW_BIT_MASK_RGB555 0x0001 +#define RED_HI_BIT_MASK_RGB555 0x4000 +#define GREEN_HI_BIT_MASK_RGB555 0x0200 +#define BLUE_HI_BIT_MASK_RGB555 0x0010 +#define FIRST_COLOR_MASK_RGB555 0x7C00 +#define SECOND_COLOR_MASK_RGB555 0x03E0 +#define THIRD_COLOR_MASK_RGB555 0x001F +#define ALPHA_BITS_MASK_RGB555 0x0000 + +/* BGR565 format */ +#define BUILD_PIXEL_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 6) | (int) (R)) +#define BUILD_PIXEL2_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_BGR565(PIX,R,G,B) {(B) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_BGR565 (1 << 5) + +#define MAX_RED_BGR565 31 +#define MAX_GREEN_BGR565 63 +#define MAX_BLUE_BGR565 31 +#define RED_LOW_BIT_MASK_BGR565 0x0001 +#define GREEN_LOW_BIT_MASK_BGR565 0x0040 +#define BLUE_LOW_BIT_MASK_BGR565 0x0800 +#define RED_HI_BIT_MASK_BGR565 0x0010 +#define GREEN_HI_BIT_MASK_BGR565 0x0400 +#define BLUE_HI_BIT_MASK_BGR565 0x8000 +#define FIRST_COLOR_MASK_BGR565 0xF800 +#define SECOND_COLOR_MASK_BGR565 0x07E0 +#define THIRD_COLOR_MASK_BGR565 0x001F +#define ALPHA_BITS_MASK_BGR565 0x0000 + +/* BGR555 format */ +#define BUILD_PIXEL_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R)) +#define BUILD_PIXEL2_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_BGR555(PIX,R,G,B) {(B) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_BGR555 (1 << 15) + +#define MAX_RED_BGR555 31 +#define MAX_GREEN_BGR555 31 +#define MAX_BLUE_BGR555 31 +#define RED_LOW_BIT_MASK_BGR555 0x0001 +#define GREEN_LOW_BIT_MASK_BGR555 0x0020 +#define BLUE_LOW_BIT_MASK_BGR555 0x0400 +#define RED_HI_BIT_MASK_BGR555 0x0010 +#define GREEN_HI_BIT_MASK_BGR555 0x0200 +#define BLUE_HI_BIT_MASK_BGR555 0x4000 +#define FIRST_COLOR_MASK_BGR555 0x7C00 +#define SECOND_COLOR_MASK_BGR555 0x03E0 +#define THIRD_COLOR_MASK_BGR555 0x001F +#define ALPHA_BITS_MASK_BGR555 0x0000 + +/* GBR565 format */ +#define BUILD_PIXEL_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 6) | (int) (R)) +#define BUILD_PIXEL2_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_GBR565(PIX,R,G,B) {(G) = (PIX) >> 11; (B) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_GBR565 (1 << 5) + +#define MAX_RED_GBR565 31 +#define MAX_BLUE_GBR565 63 +#define MAX_GREEN_GBR565 31 +#define RED_LOW_BIT_MASK_GBR565 0x0001 +#define BLUE_LOW_BIT_MASK_GBR565 0x0040 +#define GREEN_LOW_BIT_MASK_GBR565 0x0800 +#define RED_HI_BIT_MASK_GBR565 0x0010 +#define BLUE_HI_BIT_MASK_GBR565 0x0400 +#define GREEN_HI_BIT_MASK_GBR565 0x8000 +#define FIRST_COLOR_MASK_GBR565 0xF800 +#define SECOND_COLOR_MASK_GBR565 0x07E0 +#define THIRD_COLOR_MASK_GBR565 0x001F +#define ALPHA_BITS_MASK_GBR565 0x0000 + +/* GBR555 format */ +#define BUILD_PIXEL_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R)) +#define BUILD_PIXEL2_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R)) +#define DECOMPOSE_PIXEL_GBR555(PIX,R,G,B) {(G) = (PIX) >> 10; (B) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; } +#define SPARE_RGB_BIT_MASK_GBR555 (1 << 15) + +#define MAX_RED_GBR555 31 +#define MAX_BLUE_GBR555 31 +#define MAX_GREEN_GBR555 31 +#define RED_LOW_BIT_MASK_GBR555 0x0001 +#define BLUE_LOW_BIT_MASK_GBR555 0x0020 +#define GREEN_LOW_BIT_MASK_GBR555 0x0400 +#define RED_HI_BIT_MASK_GBR555 0x0010 +#define BLUE_HI_BIT_MASK_GBR555 0x0200 +#define GREEN_HI_BIT_MASK_GBR555 0x4000 +#define FIRST_COLOR_MASK_GBR555 0x7C00 +#define SECOND_COLOR_MASK_GBR555 0x03E0 +#define THIRD_COLOR_MASK_GBR555 0x001F +#define ALPHA_BITS_MASK_GBR555 0x0000 + +/* RGB5551 format */ +#define BUILD_PIXEL_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1) +#define BUILD_PIXEL2_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1) +#define DECOMPOSE_PIXEL_RGB5551(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = ((PIX) >> 1) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB5551 (1) + +#define MAX_RED_RGB5551 31 +#define MAX_GREEN_RGB5551 31 +#define MAX_BLUE_RGB5551 31 +#define RED_LOW_BIT_MASK_RGB5551 0x0800 +#define GREEN_LOW_BIT_MASK_RGB5551 0x0040 +#define BLUE_LOW_BIT_MASK_RGB5551 0x0002 +#define RED_HI_BIT_MASK_RGB5551 0x8000 +#define GREEN_HI_BIT_MASK_RGB5551 0x0400 +#define BLUE_HI_BIT_MASK_RGB5551 0x0020 +#define FIRST_COLOR_MASK_RGB5551 0xf800 +#define SECOND_COLOR_MASK_RGB5551 0x07c0 +#define THIRD_COLOR_MASK_RGB5551 0x003e +#define ALPHA_BITS_MASK_RGB5551 0x0001 + +/* RGB1555 format */ +#ifndef DREAMCAST +#define BUILD_PIXEL_RGB1555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) ((R) ) | 0x8000) +#define BUILD_PIXEL2_RGB1555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) ((R) ) | 0x8000) +#define DECOMPOSE_PIXEL_RGB1555(PIX,R,G,B) {(B) = ((PIX) >> 10) & 0x1f; (G) = ((PIX) >> 5) & 0x1f; (R) = ((PIX) ) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB1555 (1 << 15) + +#define MAX_BLUE_RGB1555 31 +#define MAX_GREEN_RGB1555 31 +#define MAX_RED_RGB1555 31 +#define BLUE_LOW_BIT_MASK_RGB1555 0x0400 +#define GREEN_LOW_BIT_MASK_RGB1555 0x0020 +#define RED_LOW_BIT_MASK_RGB1555 0x0001 +#define BLUE_HI_BIT_MASK_RGB1555 0x4000 +#define GREEN_HI_BIT_MASK_RGB1555 0x0200 +#define RED_HI_BIT_MASK_RGB1555 0x0010 +#define THIRD_COLOR_MASK_RGB1555 0x7c00 +#define SECOND_COLOR_MASK_RGB1555 0x03e0 +#define FIRST_COLOR_MASK_RGB1555 0x001f +#define ALPHA_BITS_MASK_RGB1555 0x8000 + +#else +#define BUILD_PIXEL_RGB1555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) ((B) ) | 0x8000) +#define BUILD_PIXEL2_RGB1555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) ((B) ) | 0x8000) +#define DECOMPOSE_PIXEL_RGB1555(PIX,R,G,B) {(R) = ((PIX) >> 10) & 0x1f; (B) = ((PIX) >> 5) & 0x1f; (R) = ((PIX) ) & 0x1f; } +#define SPARE_RGB_BIT_MASK_RGB1555 (1 << 15) + +#define MAX_BLUE_RGB1555 31 +#define MAX_GREEN_RGB1555 31 +#define MAX_RED_RGB1555 31 +#define RED_LOW_BIT_MASK_RGB1555 0x0400 +#define GREEN_LOW_BIT_MASK_RGB1555 0x0020 +#define BLUE_LOW_BIT_MASK_RGB1555 0x0001 +#define RED_HI_BIT_MASK_RGB1555 0x4000 +#define GREEN_HI_BIT_MASK_RGB1555 0x0200 +#define BLUE_HI_BIT_MASK_RGB1555 0x0010 +#define FIRST_COLOR_MASK_RGB1555 0x7c00 +#define SECOND_COLOR_MASK_RGB1555 0x03e0 +#define THIRD_COLOR_MASK_RGB1555 0x001f +#define ALPHA_BITS_MASK_RGB1555 0x8000 + +#endif + + +#ifndef GFX_MULTI_FORMAT +#define CONCAT(X,Y) X##Y + +/* C pre-processor needs a two stage macro define to enable it to concat + * to macro names together to form the name of another macro. */ +#define BUILD_PIXEL_D(F,R,G,B) CONCAT(BUILD_PIXEL_,F) (R,G,B) +#define BUILD_PIXEL2_D(F,R,G,B) CONCAT(BUILD_PIXEL2_,F) (R,G,B) +#define DECOMPOSE_PIXEL_D(F,PIX,R,G,B) CONCAT(DECOMPOSE_PIXEL_,F) (PIX,R,G,B) + +#define BUILD_PIXEL(R,G,B) BUILD_PIXEL_D(PIXEL_FORMAT,R,G,B) +#define BUILD_PIXEL2(R,G,B) BUILD_PIXEL2_D(PIXEL_FORMAT,R,G,B) +#define DECOMPOSE_PIXEL(PIX,R,G,B) DECOMPOSE_PIXEL_D(PIXEL_FORMAT,PIX,R,G,B) + +#define MAX_RED_D(F) CONCAT(MAX_RED_,F) +#define MAX_BLUE_D(F) CONCAT(MAX_BLUE_,F) +#define MAX_GREEN_D(F) CONCAT(MAX_GREEN_,F) +#define RED_LOW_BIT_MASK_D(F) CONCAT(RED_LOW_BIT_MASK_,F) +#define BLUE_LOW_BIT_MASK_D(F) CONCAT(BLUE_LOW_BIT_MASK_,F) +#define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_,F) +#define RED_HI_BIT_MASK_D(F) CONCAT(RED_HI_BIT_MASK_,F) +#define BLUE_HI_BIT_MASK_D(F) CONCAT(BLUE_HI_BIT_MASK_,F) +#define GREEN_HI_BIT_MASK_D(F) CONCAT(GREEN_HI_BIT_MASK_,F) +#define FIRST_COLOR_MASK_D(F) CONCAT(FIRST_COLOR_MASK_,F) +#define SECOND_COLOR_MASK_D(F) CONCAT(SECOND_COLOR_MASK_,F) +#define THIRD_COLOR_MASK_D(F) CONCAT(THIRD_COLOR_MASK_,F) +#define ALPHA_BITS_MASK_D(F) CONCAT(ALPHA_BITS_MASK_,F) + +#define MAX_RED MAX_RED_D(PIXEL_FORMAT) +#define MAX_BLUE MAX_BLUE_D(PIXEL_FORMAT) +#define MAX_GREEN MAX_GREEN_D(PIXEL_FORMAT) +#define RED_LOW_BIT_MASK RED_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define BLUE_LOW_BIT_MASK BLUE_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define GREEN_LOW_BIT_MASK GREEN_LOW_BIT_MASK_D(PIXEL_FORMAT) +#define RED_HI_BIT_MASK RED_HI_BIT_MASK_D(PIXEL_FORMAT) +#define BLUE_HI_BIT_MASK BLUE_HI_BIT_MASK_D(PIXEL_FORMAT) +#define GREEN_HI_BIT_MASK GREEN_HI_BIT_MASK_D(PIXEL_FORMAT) +#define FIRST_COLOR_MASK FIRST_COLOR_MASK_D(PIXEL_FORMAT) +#define SECOND_COLOR_MASK SECOND_COLOR_MASK_D(PIXEL_FORMAT) +#define THIRD_COLOR_MASK THIRD_COLOR_MASK_D(PIXEL_FORMAT) +#define ALPHA_BITS_MASK ALPHA_BITS_MASK_D(PIXEL_FORMAT) + +#define GREEN_HI_BIT ((MAX_GREEN + 1) >> 1) +#define RGB_LOW_BITS_MASK (RED_LOW_BIT_MASK | GREEN_LOW_BIT_MASK | \ + BLUE_LOW_BIT_MASK) +#define RGB_HI_BITS_MASK (RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | \ + BLUE_HI_BIT_MASK) +#define RGB_HI_BITS_MASKx2 ((RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | \ + BLUE_HI_BIT_MASK) << 1) +#define RGB_REMOVE_LOW_BITS_MASK (~RGB_LOW_BITS_MASK) +#define FIRST_THIRD_COLOR_MASK (FIRST_COLOR_MASK | THIRD_COLOR_MASK) +#define TWO_LOW_BITS_MASK (RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1)) +#define HIGH_BITS_SHIFTED_TWO_MASK (( (FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & \ + ~TWO_LOW_BITS_MASK ) >> 2) +#endif + +#endif + diff --git a/src/include/port.h b/src/include/port.h new file mode 100644 index 0000000..a92e598 --- /dev/null +++ b/src/include/port.h @@ -0,0 +1,341 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _PORT_H_ +#define _PORT_H_ + +#ifdef DREAMCAST +#include +#endif + +#include + +#ifdef DREAMCAST +#include +#else +#ifndef STORM +#include +#include +#else +#include +#include +#endif +#endif + +#ifndef ACCEPT_SIZE_T +#ifdef __WIN32__ +#define ACCEPT_SIZE_T int +#else +#define ACCEPT_SIZE_T unsigned int +#endif +#endif + +#include + + +#ifdef USE_GL +#define PIXEL_FORMAT RGB1555 +#else +#define PIXEL_FORMAT RGB565 +#endif +//#define GFX_MULTI_FORMAT +#ifdef GFX_MULTI_FORMAT +#undef GFX_MULTI_FORMAT +#endif + + +#undef DEBUGGER /* Apple Universal Headers sometimes #define DEBUGGER */ +#undef GFX_MULTI_FORMAT + +int strncasecmp(const char *s1, const char *s2, unsigned n); +int strcasecmp(const char *s1, const char *s2 ); + +#endif /* TARGET_OS_MAC */ + +#ifndef snes9x_types_defined +#define snes9x_types_defined + +typedef unsigned char bool8; + +/* FIXME: Refactor this by moving out the BORLAND part and unifying typedefs */ +#ifndef __WIN32__ +typedef unsigned char uint8; +typedef unsigned short uint16; +#ifndef DREAMCAST +typedef signed char int8; +typedef int int32; +typedef unsigned int uint32; +#endif +typedef short int16; +# ifdef __GNUC__ /* long long is not part of ISO C++ */ +__extension__ +# endif +typedef long long int64; +#else /* __WIN32__ */ + +# ifdef __BORLANDC__ +# include +# else + +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef signed char int8; +typedef short int16; + +# ifndef WSAAPI +/* winsock2.h typedefs int32 as well. */ +typedef long int32; + +# define PLAT_SOUND_BUFFER SoundBuffer +# define RIGHTSHIFT_IS_SAR +# endif + +typedef unsigned int uint32; + +# endif /* __BORLANDC__ */ + +typedef __int64 int64; + +#endif /* __WIN32__ */ +#endif /* snes9x_types_defined */ + + +#include "pixform.h" + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifdef STORM +#define EXTERN_C +#define START_EXTERN_C +#define END_EXTERN_C +#else +#if defined(__cplusplus) || defined(c_plusplus) +#define EXTERN_C extern "C" +#define START_EXTERN_C extern "C" { +#define END_EXTERN_C } +#else +#define EXTERN_C extern +#define START_EXTERN_C +#define END_EXTERN_C +#endif +#endif + +#ifndef WIN32 + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#define _MAX_DIR PATH_MAX +#define _MAX_DRIVE 1 +#define _MAX_FNAME PATH_MAX +#define _MAX_EXT PATH_MAX +#define _MAX_PATH PATH_MAX + + +void _makepath (char *path, const char *drive, const char *dir, + const char *fname, const char *ext); +void _splitpath (const char *path, char *drive, char *dir, char *fname, + char *ext); +#else /* __WIN32__ */ +#define strcasecmp stricmp +#define strncasecmp strnicmp +#endif + +EXTERN_C void bzero(void *B, size_t LENGTH); +#define ZeroMemory bzero + +#define ZeroMemory_32 bzero +#define __ZeroMemory_32(SRC,N) \ +{ \ + register unsigned *__ptr=(unsigned *)SRC; \ + register unsigned __n=N /* >>5; */ ; \ + register unsigned __dat=0; \ + while(__n--) \ + { \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + } \ +} \ + +/* +static __inline__ void ZeroMemory_32(void *p, unsigned n) +{ + __ZeroMemory_32(p,n>>5); +} +*/ + +#define MemSet_32 memset + +#define __MemSet_32(SRC,DAT,N) \ +{ \ + register unsigned *__ptr=(unsigned *)SRC; \ + register unsigned __n=N>>5; \ + register unsigned __dat=(DAT<<24)|(DAT<<16)|(DAT<<8)|(DAT); \ + while(__n--) \ + { \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + *__ptr++=__dat; \ + } \ +} \ + + +EXTERN_C void S9xGenerateSound (); + +EXTERN_C void S9xGenerateSound (); + +#ifdef STORM +EXTERN_C int soundsignal; +EXTERN_C void MixSound(void); +/* Yes, CHECK_SOUND is getting defined correctly! */ +#define CHECK_SOUND if (Settings.APUEnabled) if(SetSignalPPC(0L, soundsignal) & soundsignal) MixSound +#else +#define CHECK_SOUND() +#endif + +#ifdef __DJGPP +#define SLASH_STR "\\" +#define SLASH_CHAR '\\' +#else +#define SLASH_STR "/" +#define SLASH_CHAR '/' +#endif + +/* Taken care of in signal.h on Linux. + * #ifdef __linux + * typedef void (*SignalHandler)(int); + * #define SIG_PF SignalHandler + * #endif + */ + +/* If including signal.h, do it before snes9.h and port.h to avoid clashes. */ +#ifndef SIG_PF +#define SIG_PF void(*)(int) +#endif + +#if defined(__i386__) || defined(__i486__) || defined(__i586__) || \ + defined(__WIN32__) || defined(__alpha__) || defined(DREAMCAST) || \ + defined(GP32) || defined(GPX2) +#define LSB_FIRST +#ifndef DREAMCAST +#define FAST_LSB_WORD_ACCESS +#endif +#else +#define MSB_FIRST +#endif + +#ifndef TITLE +#define TITLE "SNES4ALL" +#endif + +#ifdef STORM +#define STATIC +#define strncasecmp strnicmp +#else +#define STATIC static +#endif + diff --git a/src/include/ppu.h b/src/include/ppu.h new file mode 100644 index 0000000..8beab22 --- /dev/null +++ b/src/include/ppu.h @@ -0,0 +1,747 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _PPU_H_ +#define _PPU_H_ + + +//#define FIRST_VISIBLE_LINE 1 +#define FIRST_VISIBLE_LINE 0 + +extern uint8 GetBank; +extern uint16 SignExtend [2]; + +#define TILE_2BIT 0 +#define TILE_4BIT 1 +#define TILE_8BIT 2 + +#define MAX_2BIT_TILES 4096 +#define MAX_4BIT_TILES 2048 +#define MAX_8BIT_TILES 1024 + +#define PPU_H_BEAM_IRQ_SOURCE (1 << 0) +#define PPU_V_BEAM_IRQ_SOURCE (1 << 1) +#define GSU_IRQ_SOURCE (1 << 2) +#define SA1_IRQ_SOURCE (1 << 7) +#define SA1_DMA_IRQ_SOURCE (1 << 5) + +struct ClipData { + uint32 Count [6]; + uint32 Left [6][6]; + uint32 Right [6][6]; +}; + +struct InternalPPU { + bool8 ColorsChanged; + uint8 HDMA; + bool8 HDMAStarted; + uint8 MaxBrightness; + bool8 LatchedBlanking; + bool8 OBJChanged; + bool8 RenderThisFrame; + bool8 DirectColourMapsNeedRebuild; + uint32 FrameCount; + uint32 RenderedFramesCount; + uint32 DisplayedRenderedFrameCount; + uint32 SkippedFrames; + uint32 FrameSkip; + uint8 *TileCache [3]; + uint8 *TileCached [3]; +#ifdef CORRECT_VRAM_READS + uint16 VRAMReadBuffer; +#else + bool8 FirstVRAMRead; +#endif + bool8 DoubleHeightPixels; + bool8 Interlace; + bool8 InterlaceSprites; + bool8 DoubleWidthPixels; + int RenderedScreenHeight; + int RenderedScreenWidth; + uint32 Red [256]; + uint32 Green [256]; + uint32 Blue [256]; + uint8 *XB; + uint16 ScreenColors [256]; + int PreviousLine; + int CurrentLine; + int Controller; + uint32 Joypads[5]; + uint32 SuperScope; + uint32 Mouse[2]; + int PrevMouseX[2]; + int PrevMouseY[2]; + struct ClipData Clip [2]; +}; + +struct SOBJ +{ + short HPos; + uint16 VPos; + uint16 Name; + uint8 VFlip; + uint8 HFlip; + uint8 Priority; + uint8 Palette; + uint8 Size; +}; + +struct SPPU { + uint16 OAMAddr; + uint16 SavedOAMAddr; + uint16 ScreenHeight; + short HTimerPosition; + bool8 ForcedBlanking; + bool8 VTimerEnabled; + bool8 HTimerEnabled; + uint8 FirstSprite; + uint8 OAMFlip; + uint8 HVBeamCounterLatched; + uint8 Brightness; + uint16 IRQVBeamPos; + + uint8 BGMode; + uint8 BG3Priority; + bool8 CGFLIP; + uint8 LastSprite; + uint8 OAMPriorityRotation; + uint8 RangeTimeOver; + uint8 HBeamFlip; + uint8 VBeamFlip; + uint8 Joypad1ButtonReadPos; + uint8 Joypad2ButtonReadPos; + uint8 CGADD; + uint8 FixedColourRed; + uint8 FixedColourGreen; + uint8 FixedColourBlue; + uint8 BG_Forced; + bool8 OBJThroughMain; + bool8 OBJThroughSub; + uint8 OBJSizeSelect; + bool8 OBJAddition; + uint8 OAMReadFlip; + uint8 Mosaic; + bool8 Mode7HFlip; + bool8 Mode7VFlip; + uint8 Mode7Repeat; + uint8 Window1Left; + uint8 Window1Right; + uint8 Window2Left; + bool8 RecomputeClipWindows; + uint8 CGFLIPRead; + uint8 BGnxOFSbyte; + uint8 OpenBus1; + uint8 OpenBus2; + uint8 Window2Right; + bool8 Need16x8Mulitply; + uint8 Joypad3ButtonReadPos; + + uint16 OAMTileAddress; + uint16 IRQHBeamPos; + uint16 VBeamPosLatched; + uint16 HBeamPosLatched; + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; + uint16 OAMWriteRegister; + + uint16 OBJNameBase; + uint16 OBJNameSelect; + + uint32 WRAM; + + struct { + bool8 High; + uint8 Increment; + uint16 Address; + uint16 Mask1; + uint16 FullGraphicCount; + uint16 Shift; + } VMA; + + struct { + uint16 SCBase; + uint16 VOffset; + uint16 HOffset; + uint8 BGSize; + uint16 NameBase; + uint16 SCSize; + } BG [4]; + + + bool8 BGMosaic [4]; + uint8 ClipCounts [6]; + uint8 ClipWindowOverlapLogic [6]; + uint8 ClipWindow1Enable [6]; + uint8 ClipWindow2Enable [6]; + bool8 ClipWindow1Inside [6]; + bool8 ClipWindow2Inside [6]; + uint8 MouseSpeed[2]; + + // XXX Do these need to be added to snapshot.cpp? + uint16 CGDATA [256]; + struct SOBJ OBJ [128]; + uint8 OAMData [512 + 32]; +}; + +#define CLIP_OR 0 +#define CLIP_AND 1 +#define CLIP_XOR 2 +#define CLIP_XNOR 3 + +struct SDMA { + bool8 TransferDirection; + bool8 AAddressFixed; + bool8 AAddressDecrement; + uint8 TransferMode; + + uint8 ABank; + uint16 AAddress; + uint16 Address; + uint8 BAddress; + + // General DMA only: + uint16 TransferBytes; + + // H-DMA only: + bool8 HDMAIndirectAddressing; + uint16 IndirectAddress; + uint8 IndirectBank; + uint8 Repeat; + uint8 LineCount; + uint8 FirstLine; +}; + +START_EXTERN_C +void S9xUpdateScreen (); +void S9xResetPPU (); +void S9xSoftResetPPU (); +void S9xFixColourBrightness (); +void S9xUpdateJoypads (); +void S9xProcessMouse(int which1); +void S9xSuperFXExec (); + +#if defined(USE_SETPPU_TABLE) && defined(USE_SETPPU_SMALL_TABLE) +#error IMPOSIBLE SETPPU_SMALL_TABLE AND SETPU_LARGE_TABLE +#endif + +#if defined(USE_SETPPU_TABLE) || defined(USE_SETPPU_SMALL_TABLE) +typedef void (*S9xSetPPU_func_t)(uint8,uint16); +extern S9xSetPPU_func_t S9xSetPPU_func[]; +#ifdef USE_SETPPU_SMALL_TABLE +void S9xSetPPU (uint8 Byte, uint16 Address); +#else +#define S9xSetPPU(DAT,ADDR) S9xSetPPU_func[(ADDR)](DAT,ADDR) +#endif +#else +void S9xSetPPU (uint8 Byte, uint16 Address); +#endif + +#ifdef USE_GETPPU_TABLE +typedef uint8 (*S9xGetPPU_func_t)(uint16); +extern S9xGetPPU_func_t S9xGetPPU_func[0x10000]; +#define S9xGetPPU(ADDR) S9xGetPPU_func[(ADDR)](ADDR) +#else +uint8 S9xGetPPU (uint16 Address); +#endif + +void S9xSetCPU (uint8 Byte, uint16 Address); +uint8 S9xGetCPU (uint16 Address); + +void S9xInitC4 (); +void S9xSetC4 (uint8 Byte, uint16 Address); +uint8 S9xGetC4 (uint16 Address); +void S9xSetC4RAM (uint8 Byte, uint16 Address); +uint8 S9xGetC4RAM (uint16 Address); + +extern struct SPPU PPU; +extern struct SDMA DMA [8]; +extern struct InternalPPU IPPU; +END_EXTERN_C + +#include "gfx.h" +#include "memmap.h" + +typedef struct{ + uint8 _5C77; + uint8 _5C78; + uint8 _5A22; +} SnesModel; + +#ifndef NOW_IN_GLOBALS +extern SnesModel* Model; +extern SnesModel M1SNES; +extern SnesModel M2SNES; +#endif + +#define MAX_5C77_VERSION 0x01 +#define MAX_5C78_VERSION 0x03 +#define MAX_5A22_VERSION 0x02 + +#ifdef USE_GL +extern int videogl_cache_reseted; +extern unsigned videogl_changed_colors; +extern unsigned char videogl_changed_color[256]; +#endif + +static __inline__ uint8 REGISTER_4212() +{ + GetBank = 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && + CPU.V_Counter < PPU.ScreenHeight + FIRST_VISIBLE_LINE + 3) + GetBank = 1; + + GetBank |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; + if (CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE) + GetBank |= 0x80; /* XXX: 0x80 or 0xc0 ? */ + + return (GetBank); +} + +#define FLUSH_REDRAW_END() { \ + if (IPPU.PreviousLine != IPPU.CurrentLine) \ + S9xUpdateScreen (); \ +} + +#ifdef USE_RASTER_DIFF +#define FLUSH_REDRAW_PARTIAL() { \ + extern int snes4all_raster_diff; \ + int diff_rst=(int)IPPU.CurrentLine - (int)IPPU.PreviousLine; \ + if (diff_rst>=snes4all_raster_diff) \ + S9xUpdateScreen (); \ +} +#define FLUSH_REDRAW() { \ + extern int snes4all_raster; \ + if (snes4all_raster) \ + FLUSH_REDRAW_PARTIAL() \ +} +#else +#define FLUSH_REDRAW_PARTIAL() FLUSH_REDRAW_END() +#define FLUSH_REDRAW() FLUSH_REDRAW_END() +#endif + +static __inline__ void REGISTER_2104 (uint8 byte) +{ + if (PPU.OAMAddr & 0x100) + { + int addr = ((PPU.OAMAddr & 0x10f) << 1) + (PPU.OAMFlip & 1); + if (byte != PPU.OAMData [addr]){ + FLUSH_REDRAW (); + PPU.OAMData [addr] = byte; + IPPU.OBJChanged = TRUE; + + // X position high bit, and sprite size (x4) + struct SOBJ *pObj = &PPU.OBJ [(addr & 0x1f) * 4]; + + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 0) & 1]; + pObj++->Size = byte & 2; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 2) & 1]; + pObj++->Size = byte & 8; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 4) & 1]; + pObj++->Size = byte & 32; + pObj->HPos = (pObj->HPos & 0xFF) | SignExtend[(byte >> 6) & 1]; + pObj->Size = byte & 128; + } + PPU.OAMFlip ^= 1; + if(!(PPU.OAMFlip & 1)){ + ++PPU.OAMAddr; + PPU.OAMAddr &= 0x1ff; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; + IPPU.OBJChanged = TRUE; + } + } else { + if (PPU.OAMPriorityRotation && (PPU.OAMAddr&1)) IPPU.OBJChanged = TRUE; + } + } else if(!(PPU.OAMFlip & 1)){ + PPU.OAMWriteRegister &= 0xff00; + PPU.OAMWriteRegister |= byte; + PPU.OAMFlip |= 1; + if (PPU.OAMPriorityRotation && (PPU.OAMAddr&1)) IPPU.OBJChanged = TRUE; + } else { + PPU.OAMWriteRegister &= 0x00ff; + uint8 lowbyte = (uint8)(PPU.OAMWriteRegister); + uint8 highbyte = byte; + PPU.OAMWriteRegister |= byte << 8; + + int addr = (PPU.OAMAddr << 1); + + if (lowbyte != PPU.OAMData [addr] || + highbyte != PPU.OAMData [addr+1]) + { + FLUSH_REDRAW (); + PPU.OAMData [addr] = lowbyte; + PPU.OAMData [addr+1] = highbyte; + IPPU.OBJChanged = TRUE; + if (addr & 2) + { + // Tile + PPU.OBJ[addr = PPU.OAMAddr >> 1].Name = PPU.OAMWriteRegister & 0x1ff; + + // priority, h and v flip. + PPU.OBJ[addr].Palette = (highbyte >> 1) & 7; + PPU.OBJ[addr].Priority = (highbyte >> 4) & 3; + PPU.OBJ[addr].HFlip = (highbyte >> 6) & 1; + PPU.OBJ[addr].VFlip = (highbyte >> 7) & 1; + } + else + { + // X position (low) + PPU.OBJ[addr = PPU.OAMAddr >> 1].HPos &= 0xFF00; + PPU.OBJ[addr].HPos |= lowbyte; + + // Sprite Y position + PPU.OBJ[addr].VPos = highbyte; + } + } + PPU.OAMFlip &= ~1; + ++PPU.OAMAddr; + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) + { + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; + IPPU.OBJChanged = TRUE; + } + } + + CMemory_FillRAM [0x2104] = byte; +} + +static __inline__ void REGISTER_2118 (uint8 Byte) +{ + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + register uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + } + else + address=(PPU.VMA.Address << 1) & 0xFFFF; +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM[address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (!PPU.VMA.High) { + PPU.VMA.Address += PPU.VMA.Increment; + } +// CMemory_FillRAM [0x2118] = Byte; +} + +static __inline__ void REGISTER_2118_tile (uint8 Byte) +{ + uint32 address; + { + register uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = (((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) & 0xffff; + } +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM [address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// CMemory_FillRAM [0x2118] = Byte; +} + +static __inline__ void REGISTER_2118_linear (uint8 Byte) +{ + uint32 address=(PPU.VMA.Address << 1) & 0xFFFF; +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM[address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (!PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// CMemory_FillRAM [0x2118] = Byte; +} + +static __inline__ void REGISTER_2119 (uint8 Byte) +{ + uint32 address; + if (PPU.VMA.FullGraphicCount) + { + register uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + } + else + address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF; +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM [address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (PPU.VMA.High) { + PPU.VMA.Address += PPU.VMA.Increment; + } +// CMemory_FillRAM [0x2119] = Byte; +} + +static __inline__ void REGISTER_2119_tile (uint8 Byte) +{ + uint32 address; + { + register uint32 rem = PPU.VMA.Address & PPU.VMA.Mask1; + address = ((((PPU.VMA.Address & ~PPU.VMA.Mask1) + + (rem >> PPU.VMA.Shift) + + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3)) << 1) + 1) & 0xFFFF; + } +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM [address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// CMemory_FillRAM [0x2119] = Byte; +} + +static __inline__ void REGISTER_2119_linear (uint8 Byte) +{ + uint32 address = ((PPU.VMA.Address << 1) + 1) & 0xFFFF; +#ifdef TEST_CACHETILE + if (CMemory_VRAM [address] != Byte) + { +#endif + CMemory_VRAM[address] = Byte; +#ifdef DEBUG_TILECACHE + printf("Elimina 0-%i, 1-%i y 2-%i\n",address >> 4,address >> 5,address >> 6); +#endif + IPPU.TileCached [TILE_2BIT][address >> 4] = FALSE; + IPPU.TileCached [TILE_4BIT][address >> 5] = FALSE; + IPPU.TileCached [TILE_8BIT][address >> 6] = FALSE; +#ifdef TEST_CACHETILE + } +#endif + if (PPU.VMA.High) + PPU.VMA.Address += PPU.VMA.Increment; +// CMemory_FillRAM [0x2119] = Byte; +} + +static __inline__ void REGISTER_2122(uint8 Byte) +{ + // CG-RAM (palette) write + + if (PPU.CGFLIP) + { + if ((Byte & 0x7f) != (PPU.CGDATA[PPU.CGADD] >> 8)) + { + FLUSH_REDRAW (); + PPU.CGDATA[PPU.CGADD] &= 0x00FF; + PPU.CGDATA[PPU.CGADD] |= (Byte & 0x7f) << 8; +// IPPU.ColorsChanged = TRUE; + IPPU.Blue [PPU.CGADD] = IPPU.XB [(Byte >> 2) & 0x1f]; + IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; +#ifdef USE_GL + uint16 newcol=(uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], IPPU.Green [PPU.CGADD], IPPU.Blue [PPU.CGADD]); + if (IPPU.ScreenColors[PPU.CGADD]!=newcol) { +//printf("Cambiar Color %i de %.4X a %.4X (1)\n",PPU.CGADD,IPPU.ScreenColors[PPU.CGADD],newcol); + IPPU.ScreenColors [PPU.CGADD] = newcol; + if (!videogl_changed_color[PPU.CGADD]) { + videogl_changed_color[PPU.CGADD]=1; + videogl_changed_colors++; + } +// videogl_cache_reseted=1 + } +#else + IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], IPPU.Green [PPU.CGADD], IPPU.Blue [PPU.CGADD]); +#endif + } + PPU.CGADD++; + } + else + { + if (Byte != (uint8) (PPU.CGDATA[PPU.CGADD] & 0xff)) + { + FLUSH_REDRAW (); + PPU.CGDATA[PPU.CGADD] &= 0x7F00; + PPU.CGDATA[PPU.CGADD] |= Byte; +// IPPU.ColorsChanged = TRUE; + IPPU.Red [PPU.CGADD] = IPPU.XB [Byte & 0x1f]; + IPPU.Green [PPU.CGADD] = IPPU.XB [(PPU.CGDATA[PPU.CGADD] >> 5) & 0x1f]; +#ifdef USE_GL + uint16 newcol=(uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], IPPU.Green [PPU.CGADD], IPPU.Blue [PPU.CGADD]); + if (newcol!=IPPU.ScreenColors [PPU.CGADD]) { +//printf("Cambiar Color %i de %.4X a %.4X (2)\n",PPU.CGADD,IPPU.ScreenColors[PPU.CGADD],newcol); + IPPU.ScreenColors [PPU.CGADD]=newcol; + if (!videogl_changed_color[PPU.CGADD]) { + videogl_changed_color[PPU.CGADD]=1; + videogl_changed_colors++; + } +// videogl_cache_reseted=1 + } +#else + IPPU.ScreenColors [PPU.CGADD] = (uint16) BUILD_PIXEL (IPPU.Red [PPU.CGADD], IPPU.Green [PPU.CGADD], IPPU.Blue [PPU.CGADD]); +#endif + } + } + PPU.CGFLIP ^= 1; +// CMemory_FillRAM [0x2122] = Byte; +} + +static __inline__ void REGISTER_2180(uint8 Byte) +{ +//printf("REG RAM[%p]=%.2X\n",PPU.WRAM,Byte); +#ifdef USE_MMU + uint8 *mmu_ram=(uint8 *)(0); + if (PPU.WRAM<0x2000) { + mmu_ram[PPU.WRAM] = Byte; + } + mmu_ram=(uint8 *)(0x7e0000); + mmu_ram[PPU.WRAM++] = Byte; +#else + CMemory_RAM[PPU.WRAM++] = Byte; +#endif + PPU.WRAM &= 0x1FFFF; + CMemory_FillRAM [0x2180] = Byte; +} + + +//Platform specific input functions used by PPU.CPP +#define JustifierButtons(J) +#define JustifierOffscreen() false + +#endif + diff --git a/src/include/sa1.h b/src/include/sa1.h new file mode 100644 index 0000000..7bdacc3 --- /dev/null +++ b/src/include/sa1.h @@ -0,0 +1,219 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _sa1_h_ +#define _sa1_h_ + +#include "memmap.h" + +struct SSA1Registers { + uint8 PB; + uint8 DB; + pair P; + pair A; + pair D; + pair S; + pair X; + pair Y; + uint16 PC; +}; + +struct SSA1 { + uint8 _Carry; + uint8 _Zero; + uint8 _Negative; + uint8 _Overflow; + bool8 CPUExecuting; + bool8 Executing; + bool8 NMIActive; + bool8 IRQActive; + bool8 WaitingForInterrupt; + bool8 Waiting; + bool8 overflow; + uint8 VirtualBitmapFormat; + bool8 in_char_dma; + uint8 variable_bit_pos; + struct SOpcodes *S9xOpcodes; + uint32 ShiftedPB; + uint32 ShiftedDB; + uint32 Flags; + uint32 WaitCounter; + uint8 *PC; + uint8 *PCBase; + uint8 *BWRAM; + uint8 *PCAtOpcodeStart; + uint8 *WaitAddress; + uint8 *WaitByteAddress1; + uint8 *WaitByteAddress2; + uint8 *Map [MEMMAP_NUM_BLOCKS]; + uint8 *WriteMap [MEMMAP_NUM_BLOCKS]; + int16 op1; + int16 op2; + int arithmetic_op; + int64 sum; +}; + +#define SA1CheckZero() (SA1._Zero == 0) +#define SA1CheckCarry() (SA1._Carry) +#define SA1CheckIRQ() (SA1Registers.PL & IRQ) +#define SA1CheckDecimal() (SA1Registers.PL & Decimal) +#define SA1CheckIndex() (SA1Registers.PL & IndexFlag) +#define SA1CheckMemory() (SA1Registers.PL & MemoryFlag) +#define SA1CheckOverflow() (SA1._Overflow) +#define SA1CheckNegative() (SA1._Negative & 0x80) +#define SA1CheckEmulation() (SA1Registers.P.W & Emulation) + +#define SA1ClearFlags(f) (SA1Registers.P.W &= ~(f)) +#define SA1SetFlags(f) (SA1Registers.P.W |= (f)) +#define SA1CheckFlag(f) (SA1Registers.PL & (f)) + + +START_EXTERN_C +uint8 S9xSA1GetByte (uint32); +uint16 S9xSA1GetWord (uint32); +void S9xSA1SetByte (uint8, uint32); +void S9xSA1SetWord (uint16, uint32); +void S9xSA1SetPCBase (uint32); +uint8 S9xGetSA1 (uint32); +void S9xSetSA1 (uint8, uint32); + +extern struct SOpcodes S9xSA1OpcodesM1X1 [256]; +extern struct SOpcodes S9xSA1OpcodesM1X0 [256]; +extern struct SOpcodes S9xSA1OpcodesM0X1 [256]; +extern struct SOpcodes S9xSA1OpcodesM0X0 [256]; +extern struct SSA1Registers SA1Registers; +extern struct SSA1 SA1; + +void S9xSA1MainLoop (); +void S9xSA1Init (); +void S9xFixSA1AfterSnapshotLoad (); +void S9xSA1ExecuteDuringSleep (); +END_EXTERN_C + +#define SNES_IRQ_SOURCE (1 << 7) +#define TIMER_IRQ_SOURCE (1 << 6) +#define DMA_IRQ_SOURCE (1 << 5) + +static __inline__ void S9xSA1UnpackStatus() +{ + SA1._Zero = (SA1Registers.PL & Zero) == 0; + SA1._Negative = (SA1Registers.PL & Negative); + SA1._Carry = (SA1Registers.PL & Carry); + SA1._Overflow = (SA1Registers.PL & Overflow) >> 6; +} + +static __inline__ void S9xSA1PackStatus() +{ + SA1Registers.PL &= ~(Zero | Negative | Carry | Overflow); + SA1Registers.PL |= SA1._Carry | ((SA1._Zero == 0) << 1) | + (SA1._Negative & 0x80) | (SA1._Overflow << 6); +} + +static __inline__ void S9xSA1FixCycles () +{ + if (SA1CheckEmulation ()) + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + else + if (SA1CheckMemory ()) + { + if (SA1CheckIndex ()) + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + else + SA1.S9xOpcodes = S9xSA1OpcodesM1X0; + } + else + { + if (SA1CheckIndex ()) + SA1.S9xOpcodes = S9xSA1OpcodesM0X1; + else + SA1.S9xOpcodes = S9xSA1OpcodesM0X0; + } +} +#endif + diff --git a/src/include/sar.h b/src/include/sar.h new file mode 100644 index 0000000..58e5390 --- /dev/null +++ b/src/include/sar.h @@ -0,0 +1,138 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _SAR_H_ +#define _SAR_H_ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include "port.h" + +#ifndef snes9x_types_defined +#include "9xtypes.h" +#endif + +#ifdef RIGHTSHIFT_IS_SAR +#define SAR(b, n) ((b)>>(n)) +#else + +static __inline__ int8 SAR(const int8 b, const int n){ +#ifndef RIGHTSHIFT_INT8_IS_SAR + if(b<0) return (b>>n)|(-1<<(8-n)); +#endif + return b>>n; +} + +static __inline__ int16 SAR(const int16 b, const int n){ +#ifndef RIGHTSHIFT_INT16_IS_SAR + if(b<0) return (b>>n)|(-1<<(16-n)); +#endif + return b>>n; +} + +static __inline__ int32 SAR(const int32 b, const int n){ +#ifndef RIGHTSHIFT_INT32_IS_SAR + if(b<0) return (b>>n)|(-1<<(32-n)); +#endif + return b>>n; +} + +static __inline__ int64 SAR(const int64 b, const int n){ +#ifndef RIGHTSHIFT_INT64_IS_SAR + if(b<0) return (b>>n)|(-1<<(64-n)); +#endif + return b>>n; +} + +#endif + +#endif + diff --git a/src/include/screenshot.h b/src/include/screenshot.h new file mode 100644 index 0000000..ce44e42 --- /dev/null +++ b/src/include/screenshot.h @@ -0,0 +1,96 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef SCREENSHOT_H +#define SCREENSHOT_H + +bool8 S9xDoScreenshot(int width, int height); + +#endif + diff --git a/src/include/sdd1.h b/src/include/sdd1.h new file mode 100644 index 0000000..15c97ae --- /dev/null +++ b/src/include/sdd1.h @@ -0,0 +1,98 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef _SDD1_H_ +#define _SDD1_H_ +void S9xSetSDD1MemoryMap (uint32 bank, uint32 value); +void S9xResetSDD1 (); +void S9xSDD1PostLoadState (); +void S9xSDD1SaveLoggedData (); +void S9xSDD1LoadLoggedData (); +#endif + diff --git a/src/include/sdd1emu.h b/src/include/sdd1emu.h new file mode 100644 index 0000000..829ac4a --- /dev/null +++ b/src/include/sdd1emu.h @@ -0,0 +1,104 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef SDD1EMU_H +#define SDD1EMU_H + +/* for START_EXTERN_C/END_EXTERN_C */ +#include "port.h" + +START_EXTERN_C + +void SDD1_decompress(uint8 *out, uint8 *in, int output_length); + +void SDD1_init(uint8 *in); +uint8 SDD1_get_byte(void); + +END_EXTERN_C + +#endif diff --git a/src/include/sdlinterface.h b/src/include/sdlinterface.h new file mode 100644 index 0000000..a346cce --- /dev/null +++ b/src/include/sdlinterface.h @@ -0,0 +1,24 @@ +#ifndef SDLINTERFACE_H +#define SDLINTERFACE_H +#include + +extern SDL_Surface *screen, *gfxscreen; + + +/* +#if defined(__cplusplus) || defined(c_plusplus) +extern "C" { +#endif +*/ +void sound_play_menu_music(void); +void sound_play_beep(void); +void sound_enable_music(void); +void sound_disable_music(void); +void sound_play_beep(void); +/* +#if defined(__cplusplus) || defined(c_plusplus) +} +#endif +*/ + +#endif diff --git a/src/include/seta.h b/src/include/seta.h new file mode 100644 index 0000000..03f8fcd --- /dev/null +++ b/src/include/seta.h @@ -0,0 +1,160 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifndef NO_SETA +#ifndef _seta_h +#define _seta_h + +#include "port.h" + +#define ST_010 0x01 +#define ST_011 0x02 +#define ST_018 0x03 + + +#ifdef __cplusplus +extern "C" +{ +#endif +uint8 S9xGetSetaDSP(uint32 Address); +void S9xSetSetaDSP(uint8 byte,uint32 Address); +uint8 S9xGetST018(uint32 Address); +void S9xSetST018(uint8 Byte, uint32 Address); + +uint8 S9xGetST010(uint32 Address); +void S9xSetST010(uint32 Address, uint8 Byte); +uint8 S9xGetST011(uint32 Address); +void S9xSetST011(uint32 Address, uint8 Byte); +#ifdef __cplusplus +} +#endif + +extern void (*SetSETA)(uint32, uint8); +extern uint8 (*GetSETA)(uint32); + +typedef struct SETA_ST010_STRUCT +{ + uint8 input_params[16]; + uint8 output_params[16]; + uint8 op_reg; + uint8 execute; + bool8 control_enable; +} ST010_Regs; + +typedef struct SETA_ST011_STRUCT +{ + bool8 waiting4command; + uint8 status; + uint8 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters [512]; + uint8 output [512]; +} ST011_Regs; + +typedef struct SETA_ST018_STRUCT +{ + bool8 waiting4command; + uint8 status; + uint8 part_command; + uint8 pass; + uint32 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters [512]; + uint8 output [512]; +} ST018_Regs; + +#endif +#endif + diff --git a/src/include/snaporig.h b/src/include/snaporig.h new file mode 100644 index 0000000..e83ad8e --- /dev/null +++ b/src/include/snaporig.h @@ -0,0 +1,383 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _SNAPORIG_H_ +#define _SNAPORIG_H_ + +#define ORIG_SNAPSHOT_MAGIC "#!snes96" +#define ORIG_SNAPSHOT_VERSION 4 + +EXTERN_C bool8 S9xLoadOrigSnapshot (const char *filename); + +struct SOrigCPUState{ + uint32 Flags; + short Cycles_old; + short NextEvent_old; + uint8 CurrentFrame; + uint8 FastROMSpeed_old_old; + uint16 V_Counter_old; + bool8 BranchSkip; + bool8 NMIActive; + bool8 IRQActive; + bool8 WaitingForInterrupt; + bool8 InDMA; + uint8 WhichEvent; + uint8 *PC; + uint8 *PCBase; + uint16 MemSpeed_old; + uint16 MemSpeedx2_old; + uint16 FastROMSpeed_old; + bool8 FastDP; + uint8 *PCAtOpcodeStart; + uint8 *WaitAddress; + uint32 WaitCounter; + long Cycles; + long NextEvent; + long V_Counter; + long MemSpeed; + long MemSpeedx2; + long FastROMSpeed; +}; + +struct SOrigAPU +{ + uint32 Cycles; + bool8 ShowROM; + uint8 Flags; + uint8 KeyedChannels; + uint8 OutPorts [4]; + uint8 DSP [0x80]; + uint8 ExtraRAM [64]; + uint16 Timer [3]; + uint16 TimerTarget [3]; + bool8 TimerEnabled [3]; + bool8 TimerValueWritten [3]; +}; + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 A, Y; } B; +#else + struct { uint8 Y, A; } B; +#endif + uint16 W; +} OrigYAndA; + +struct SOrigAPURegisters{ + uint8 P; + OrigYAndA YA; + uint8 X; + uint8 S; + uint16 PC; +}; + +#define ORIG_MAX_BUFFER_SIZE (1024 * 4) +#ifndef SNES4ALL_NUM_CHANNELS +#define NUM_CHANNELS 8 +#else +#define NUM_CHANNELS SNES4ALL_NUM_CHANNELS +#endif + +typedef struct { + int state; + int type; + short volume_left; + short volume_right; + int frequency; + int count; + signed short wave [ORIG_MAX_BUFFER_SIZE]; + bool8 loop; + int envx; + short left_vol_level; + short right_vol_level; + short envx_target; + unsigned long int env_error; + unsigned long erate; + int direction; + unsigned long attack_rate; + unsigned long decay_rate; + unsigned long sustain_rate; + unsigned long release_rate; + unsigned long sustain_level; + signed short sample; + signed short decoded [16]; + signed short previous [2]; + uint16 sample_number; + bool8 last_block; + bool8 needs_decode; + uint32 block_pointer; + uint32 sample_pointer; + int *echo_buf_ptr; + int mode; + uint32 dummy [8]; +} OrigChannel; + +typedef struct +{ + short master_volume_left; + short master_volume_right; + short echo_volume_left; + short echo_volume_right; + int echo_enable; + int echo_feedback; + int echo_ptr; + int echo_buffer_size; + int echo_write_enabled; + int echo_channel_enable; + int pitch_mod; + // Just incase they are needed in the future, for snapshot compatibility. + uint32 dummy [3]; + OrigChannel channels [NUM_CHANNELS]; +} SOrigSoundData; + +struct SOrigOBJ +{ + short HPos; + uint16 VPos; + uint16 Name; + uint8 VFlip; + uint8 HFlip; + uint8 Priority; + uint8 Palette; + uint8 Size; + uint8 Prev; + uint8 Next; +}; + +struct SOrigPPU { + uint8 BGMode; + uint8 BG3Priority; + uint8 Brightness; + + struct { + bool8 High; + uint8 Increment; + uint16 Address; + uint16 Mask1; + uint16 FullGraphicCount; + uint16 Shift; + } VMA; + + struct { + uint8 TileSize; + uint16 TileAddress; + uint8 Width; + uint8 Height; + uint16 SCBase; + uint16 VOffset; + uint16 HOffset; + bool8 ThroughMain; + bool8 ThroughSub; + uint8 BGSize; + uint16 NameBase; + uint16 SCSize; + bool8 Addition; + } BG [4]; + + bool8 CGFLIP; + uint16 CGDATA [256]; + uint8 FirstSprite; + uint8 LastSprite; + struct SOrigOBJ OBJ [129]; + uint8 OAMPriorityRotation; + uint16 OAMAddr; + + uint8 OAMFlip; + uint16 OAMTileAddress; + uint16 IRQVBeamPos; + uint16 IRQHBeamPos; + uint16 VBeamPosLatched; + uint16 HBeamPosLatched; + + uint8 HBeamFlip; + uint8 VBeamFlip; + uint8 HVBeamCounterLatched; + + short MatrixA; + short MatrixB; + short MatrixC; + short MatrixD; + short CentreX; + short CentreY; + uint8 Joypad1ButtonReadPos; + uint8 Joypad2ButtonReadPos; + + uint8 CGADD; + uint8 FixedColourRed; + uint8 FixedColourGreen; + uint8 FixedColourBlue; + uint16 SavedOAMAddr; + uint16 ScreenHeight; + uint32 WRAM; + uint8 BG_Forced; + bool8 ForcedBlanking; + bool8 OBJThroughMain; + bool8 OBJThroughSub; + uint8 OBJSizeSelect; + uint8 OBJNameSelect_old; + uint16 OBJNameBase; + bool8 OBJAddition; + uint8 OAMReadFlip; + uint8 OAMData [512 + 32]; + bool8 VTimerEnabled; + bool8 HTimerEnabled; + short HTimerPosition; + uint8 Mosaic; + bool8 BGMosaic [4]; + bool8 Mode7HFlip; + bool8 Mode7VFlip; + uint8 Mode7Repeat; + uint8 Window1Left; + uint8 Window1Right; + uint8 Window2Left; + uint8 Window2Right; + uint8 ClipCounts [6]; + uint8 ClipLeftEdges [3][6]; + uint8 ClipRightEdges [3][6]; + uint8 ClipWindowOverlapLogic [6]; + uint8 ClipWindow1Enable [6]; + uint8 ClipWindow2Enable [6]; + bool8 ClipWindow1Inside [6]; + bool8 ClipWindow2Inside [6]; + bool8 RecomputeClipWindows; + uint8 CGFLIPRead; + uint16 OBJNameSelect; + bool8 Need16x8Mulitply; + uint8 Joypad3ButtonReadPos; + uint8 MouseSpeed[2]; +}; + +struct SOrigDMA { + bool8 TransferDirection; + bool8 AAddressFixed; + bool8 AAddressDecrement; + uint8 TransferMode; + + uint8 ABank; + uint16 AAddress; + uint16 Address; + uint8 BAddress; + + // General DMA only: + uint16 TransferBytes; + + // H-DMA only: + bool8 HDMAIndirectAddressing; + uint16 IndirectAddress; + uint8 IndirectBank; + uint8 Repeat; + uint8 LineCount; + uint8 FirstLine; + bool8 JustStarted; +}; + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 l,h; } B; +#else + struct { uint8 h,l; } B; +#endif + uint16 W; +} OrigPair; + +struct SOrigRegisters{ + uint8 PB; + uint8 DB; + OrigPair P; + OrigPair A; + OrigPair D; + OrigPair S; + OrigPair X; + OrigPair Y; + uint16 PC; +}; + +#endif + diff --git a/src/include/snapshot.h b/src/include/snapshot.h new file mode 100644 index 0000000..1843bfe --- /dev/null +++ b/src/include/snapshot.h @@ -0,0 +1,116 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _SNAPSHOT_H_ +#define _SNAPSHOT_H_ + +#include +#include "snes9x.h" + +#define SNAPSHOT_MAGIC "#!snes9x" +#define SNAPSHOT_VERSION 1 + +#define SUCCESS 1 +#define WRONG_FORMAT (-1) +#define WRONG_VERSION (-2) +#define FILE_NOT_FOUND (-3) +#define WRONG_MOVIE_SNAPSHOT (-4) +#define NOT_A_MOVIE_SNAPSHOT (-5) + +START_EXTERN_C +bool8 S9xFreezeGame (const char *filename); +bool8 S9xUnfreezeGame (const char *filename); +bool8 Snapshot (const char *filename); +bool8 S9xLoadSnapshot (const char *filename); +bool8 S9xSPCDump (const char *filename); +void S9xFreezeToStream (STREAM); +int S9xUnfreezeFromStream (STREAM); +END_EXTERN_C + +#endif + diff --git a/src/include/snes4all.h b/src/include/snes4all.h new file mode 100644 index 0000000..9c0bf9d --- /dev/null +++ b/src/include/snes4all.h @@ -0,0 +1,109 @@ +#ifndef _SNES4ALL_H_ +#define _SNES4ALL_H_ + +#include + +#ifndef SNES4ALL_MAX_ROM_SIZE +#define SNES4ALL_MAX_ROM_SIZE 0x600000 +#endif + +extern int snes4all_frameskip; +extern int snes4all_sound_enable; +extern int snes4all_transparency; +extern int snes4all_throttle; +extern char snes4all_image_file[]; +extern int snes4all_emulating; +extern unsigned snes4all_timeslice; +extern int snes4all_sound_throttle; + +extern unsigned snes4all_max_vcounter; +extern short snes4all_vcounter[]; + +extern unsigned snes4all_apu_hmax; +extern int snes4all_displayframerate; + +#ifdef NORES256 +#define SNES4ALL_SCREEN_WIDTH 320 +#else +#define SNES4ALL_SCREEN_WIDTH 256 +#endif + +#define SNES4ALL_SCREEN_HEIGHT 240 +#define SNES4ALL_SCREEN_DEPTH_BYTES 2 +#define SNES4ALL_SCREEN_DEPTH (8 * SNES4ALL_SCREEN_DEPTH_BYTES) +#ifndef USE_GL +#define SNES4ALL_SCREEN_PITCH (SNES4ALL_SCREEN_WIDTH * SNES4ALL_SCREEN_DEPTH_BYTES) +#else +#ifdef NORES256 +#define SNES4ALL_SCREEN_PITCH (512 * SNES4ALL_SCREEN_DEPTH_BYTES) +#else +#define SNES4ALL_SCREEN_PITCH (256 * SNES4ALL_SCREEN_DEPTH_BYTES) +#endif +#endif +#define SNES4ALL_SCREEN_PITCH2 (SNES4ALL_SCREEN_PITCH >> 1) + +#ifdef NORES256 +#define getY(Y) (SNES4ALL_SCREEN_WIDTH * SNES4ALL_SCREEN_DEPTH_BYTES * (Y) ) +#define getY2(Y) (((SNES4ALL_SCREEN_WIDTH * SNES4ALL_SCREEN_DEPTH_BYTES)>>1) * (Y) ) +#else +#define getY(Y) ( (Y) << 9 ) +#define getY2(Y) ( (Y) << 8 ) +#endif + + +#ifndef PROFILER_SNES4ALL + +#define snes4all_prof_start(A) +#define snes4all_prof_end(A) + +#else + +#define SNES4ALL_PROFILER_MAX 256 + +extern unsigned long long snes4all_prof_initial[SNES4ALL_PROFILER_MAX]; +extern unsigned long long snes4all_prof_sum[SNES4ALL_PROFILER_MAX]; +extern unsigned long long snes4all_prof_executed[SNES4ALL_PROFILER_MAX]; +extern int snes4all_prof_started[SNES4ALL_PROFILER_MAX]; + +static __inline__ void snes4all_prof_start(unsigned a) +{ + if (snes4all_prof_started[a]) + return; + snes4all_prof_executed[a]++; +#ifndef DREAMCAST + snes4all_prof_initial[a]=SDL_GetTicks(); +#else + snes4all_prof_initial[a]=timer_us_gettime64(); +#endif + snes4all_prof_started[a]=1; +} + + +static __inline__ void snes4all_prof_end(unsigned a) +{ + if (!snes4all_prof_started[a]) + return; +#ifndef DREAMCAST + snes4all_prof_sum[a]+=SDL_GetTicks()-snes4all_prof_initial[a]; +#else + extern unsigned snes4all_prof_total; + int i; + for(i=0;i +#include +#include + + +#include "language.h" + +#include "port.h" +#include "65c816.h" +#include "messages.h" + +#if defined(USE_GLIDE) && !defined(GFX_MULTI_FORMAT) +#define GFX_MULTI_FORMAT +#endif + +#define ROM_NAME_LEN 23 + +#ifdef ZLIB +#ifndef __WIN32__ +#include "zlib.h" +#endif +#define STREAM gzFile +#define READ_STREAM(p,l,s) gzread (s,p,l) +#define WRITE_STREAM(p,l,s) gzwrite (s,p,l) +#define OPEN_STREAM(f,m) gzopen (f,m) +#define REOPEN_STREAM(f,m) gzdopen (f,m) +#define FIND_STREAM(f) gztell(f) +#define REVERT_STREAM(f,o,s) gzseek(f,o,s) +#define CLOSE_STREAM(s) gzclose (s) +#else +#define STREAM FILE * +#define READ_STREAM(p,l,s) fread (p,1,l,s) +#define WRITE_STREAM(p,l,s) fwrite (p,1,l,s) +#define OPEN_STREAM(f,m) fopen (f,m) +#define REOPEN_STREAM(f,m) fdopen (f,m) +#define FIND_STREAM(f) ftell(f) +#define REVERT_STREAM(f,o,s) fseek(f,o,s) +#define CLOSE_STREAM(s) fclose (s) +#endif + + +/* SNES screen width and height */ +#define SNES_WIDTH 256 +#define SNES_HEIGHT 224 +#define SNES_HEIGHT_EXTENDED 239 +#define IMAGE_WIDTH (SNES_WIDTH) +#define IMAGE_HEIGHT (SNES_HEIGHT_EXTENDED) + +#define SNES_MAX_NTSC_VCOUNTER 262 +#define SNES_MAX_PAL_VCOUNTER 312 +#define SNES_HCOUNTER_MAX 342 +#define SPC700_TO_65C816_RATIO 2 +#define AUTO_FRAMERATE 200 + +/* NTSC master clock signal 21.47727MHz + * PPU: master clock / 4 + * 1 / PPU clock * 342 -> 63.695us + * 63.695us / (1 / 3.579545MHz) -> 228 cycles per scanline + * From Earth Worm Jim: APU executes an average of 65.14285714 cycles per + * scanline giving an APU clock speed of 1.022731096MHz */ + +/* PAL master clock signal 21.28137MHz + * PPU: master clock / 4 + * 1 / PPU clock * 342 -> 64.281us + * 64.281us / (1 / 3.546895MHz) -> 228 cycles per scanline. */ + +#define SNES_SCANLINE_TIME (63.695e-6) +#define SNES_CLOCK_SPEED (3579545) + +#define SNES_CLOCK_LEN (1.0 / SNES_CLOCK_SPEED) + +#define SNES_CYCLES_PER_SCANLINE ((uint32) ((SNES_SCANLINE_TIME / SNES_CLOCK_LEN) * 6 + 0.5)) + +#define SNES_APUTIMER2_CYCLEx10000 ((uint32) ((SNES_CYCLES_PER_SCANLINE * 10000) * (1.0 / 64000.0) / SNES_SCANLINE_TIME + 0.5)) + +#define SNES_APUTIMER2_CYCLE_pow13 ((uint32) ((SNES_CYCLES_PER_SCANLINE * 8192.0) * (1.0 / 64000.0) / SNES_SCANLINE_TIME + 0.5)) +#define ONE_CYCLE 6 +#define SLOW_ONE_CYCLE 8 +#define TWO_CYCLES 12 + + +#define SNES_TR_MASK (1 << 4) +#define SNES_TL_MASK (1 << 5) +#define SNES_X_MASK (1 << 6) +#define SNES_A_MASK (1 << 7) +#define SNES_RIGHT_MASK (1 << 8) +#define SNES_LEFT_MASK (1 << 9) +#define SNES_DOWN_MASK (1 << 10) +#define SNES_UP_MASK (1 << 11) +#define SNES_START_MASK (1 << 12) +#define SNES_SELECT_MASK (1 << 13) +#define SNES_Y_MASK (1 << 14) +#define SNES_B_MASK (1 << 15) + +enum { + SNES_MULTIPLAYER5, + SNES_JOYPAD, + SNES_MOUSE_SWAPPED, + SNES_MOUSE, + SNES_SUPERSCOPE, + SNES_JUSTIFIER, + SNES_JUSTIFIER_2, + SNES_MAX_CONTROLLER_OPTIONS +}; + +#define DEBUG_MODE_FLAG (1 << 0) +#define TRACE_FLAG (1 << 1) +#define SINGLE_STEP_FLAG (1 << 2) +#define BREAK_FLAG (1 << 3) +#define SCAN_KEYS_FLAG (1 << 4) +#define SAVE_SNAPSHOT_FLAG (1 << 5) +#define DELAYED_NMI_FLAG (1 << 6) +#define NMI_FLAG (1 << 7) +#define PROCESS_SOUND_FLAG (1 << 8) +#define FRAME_ADVANCE_FLAG (1 << 9) +#define DELAYED_NMI_FLAG2 (1 << 10) +#define IRQ_PENDING_FLAG (1 << 11) + +struct SCPUState{ + bool8 SRAMModified; + bool8 BRKTriggered; + bool8 TriedInterleavedMode2; + bool8 BranchSkip; + bool8 NMIActive; + bool8 IRQActive; + bool8 WaitingForInterrupt; + bool8 InDMA; + uint8 WhichEvent; + uint8 __pad1__; + uint8 __pad2__; + uint8 __pad3__; + uint32 NMICycleCount; + uint32 IRQCycleCount; + uint32 Flags; + uint8 *PC; + uint8 *PCBase; + uint8 *PCAtOpcodeStart; + uint8 *WaitAddress; + uint32 WaitCounter; + long Cycles; + long NextEvent; + long V_Counter; + long MemSpeed; + long MemSpeedx2; + long FastROMSpeed; + uint32 AutoSaveTimer; + uint32 NMITriggerPoint; +#ifdef DEBUG_MAXCOUNT + unsigned long GlobalLoopCount; +#endif +}; + +#define HBLANK_START_EVENT 0 +#define HBLANK_END_EVENT 1 +#define HTIMER_BEFORE_EVENT 2 +#define HTIMER_AFTER_EVENT 3 +#define NO_EVENT 4 + +struct SSettings{ + /* CPU options */ + bool8 APUEnabled; + bool8 Shutdown; + bool8 DisableIRQ; + bool8 Paused; + bool8 ForcedPause; + bool8 StopEmulation; + bool8 FrameAdvance; + bool8 PAL; + + /* Tracing options */ + bool8 TraceDMA; + bool8 TraceHDMA; + bool8 TraceVRAM; + bool8 TraceUnknownRegisters; + bool8 TraceDSP; + + /* Joystick options */ + bool8 SwapJoypads; + bool8 JoystickEnabled; + + /* ROM timing options (see also H_Max above) */ + bool8 ForcePAL; + bool8 ForceNTSC; + + long H_Max; + long HBlankStart; + long CyclesPercentage; + + uint32 FrameTimePAL; + uint32 FrameTimeNTSC; + uint32 FrameTime; + uint32 SkipFrames; + + /* ROM image options */ + bool8 ForceLoROM; + bool8 ForceHiROM; + bool8 ForceHeader; + bool8 ForceNoHeader; + bool8 ForceInterleaved; + bool8 ForceInterleaved2; + bool8 ForceNotInterleaved; + + /* Peripherial options */ + bool8 ForceSuperFX; + bool8 ForceNoSuperFX; + bool8 ForceDSP1; + bool8 ForceNoDSP1; + bool8 ForceSA1; + bool8 ForceNoSA1; + bool8 ForceC4; + bool8 ForceNoC4; + bool8 ForceSDD1; + bool8 ForceNoSDD1; + bool8 MultiPlayer5; + bool8 Mouse; + bool8 SuperScope; + bool8 SRTC; + uint32 ControllerOption; + + bool8 ShutdownMaster; + bool8 MultiPlayer5Master; + bool8 SuperScopeMaster; + bool8 MouseMaster; + bool8 SuperFX; + bool8 DSP1Master; + bool8 SA1; + bool8 C4; + bool8 SDD1; + bool8 SPC7110; + bool8 SPC7110RTC; + bool8 OBC1; + + /* Sound options */ + uint32 SoundPlaybackRate; + bool8 TraceSoundDSP; + bool8 Stereo; + int SoundBufferSize; + bool8 Mute; + bool8 NextAPUEnabled; + + /* Graphics options */ + bool8 Transparency; + + /* SNES graphics options */ +#ifdef MK_DEBUG_RTO + bool8 BGLayering; +#endif + + /* Others */ +#ifdef NETPLAY_SUPPORT + bool8 NetPlay; + bool8 NetPlayServer; + char ServerName [128]; + int Port; +#endif +#ifdef USE_GLIDE + bool8 GlideEnable; +#endif +#ifdef USE_OPENGL + bool8 OpenGLEnable; +#endif + int32 AutoSaveDelay; /* Time in seconds before S-RAM auto-saved if modified. */ + bool8 ApplyCheats; + bool8 TurboMode; + uint32 TurboSkipFrames; + uint32 AutoMaxSkipFrames; + +/* Fixes for individual games */ + bool8 StarfoxHack; + bool8 WinterGold; + bool8 BS; /* Japanese Satellite System games. */ + bool8 DaffyDuck; + uint8 APURAMInitialValue; + bool8 SampleCatchup; + bool8 JustifierMaster; + bool8 Justifier; + bool8 SecondJustifier; + int8 SETA; + bool8 TakeScreenshot; + int8 StretchScreenshots; + uint16 DisplayColor; + int SoundDriver; + int AIDOShmId; + bool8 SDD1Pack; + bool8 NoPatch; + bool8 ForceInterleaveGD24; +#ifdef DEBUG_MAXCOUNT + unsigned int MaxCount; +#endif +}; + +struct SSNESGameFixes +{ + uint8 alienVSpredetorFix; + uint8 APU_OutPorts_ReturnValueFix; + uint8 SRAMInitialValue; + uint8 Uniracers; + bool8 EchoOnlyOutput; +}; + +START_EXTERN_C +extern struct SSettings Settings; +extern struct SCPUState CPU; +extern struct SSNESGameFixes SNESGameFixes; +extern char String [513]; + +void S9xExit (); +void S9xMessage (int type, int number, const char *message); +void S9xLoadSDD1Data (); +END_EXTERN_C + +enum { + PAUSE_NETPLAY_CONNECT = (1 << 0), + PAUSE_TOGGLE_FULL_SCREEN = (1 << 1), + PAUSE_EXIT = (1 << 2), + PAUSE_MENU = (1 << 3), + PAUSE_INACTIVE_WINDOW = (1 << 4), + PAUSE_WINDOW_ICONISED = (1 << 5), + PAUSE_RESTORE_GUI = (1 << 6), + PAUSE_FREEZE_FILE = (1 << 7) +}; +void S9xSetPause (uint32 mask); +void S9xClearPause (uint32 mask); + +#endif + diff --git a/src/include/soundux.h b/src/include/soundux.h new file mode 100644 index 0000000..3f3c84b --- /dev/null +++ b/src/include/soundux.h @@ -0,0 +1,301 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _SOUND_H_ +#define _SOUND_H_ + +enum { SOUND_SAMPLE = 0, SOUND_NOISE, SOUND_EXTRA_NOISE, SOUND_MUTE }; +enum { SOUND_SILENT, SOUND_ATTACK, SOUND_DECAY, SOUND_SUSTAIN, + SOUND_RELEASE, SOUND_GAIN, SOUND_INCREASE_LINEAR, + SOUND_INCREASE_BENT_LINE, SOUND_DECREASE_LINEAR, + SOUND_DECREASE_EXPONENTIAL}; + +enum { MODE_NONE = SOUND_SILENT, MODE_ADSR, MODE_RELEASE = SOUND_RELEASE, + MODE_GAIN, MODE_INCREASE_LINEAR, MODE_INCREASE_BENT_LINE, + MODE_DECREASE_LINEAR, MODE_DECREASE_EXPONENTIAL}; + +#define MAX_ENVELOPE_HEIGHT 127 +#define ENVELOPE_SHIFT 7 +#define MAX_VOLUME 127 +#define VOLUME_SHIFT 7 +#define VOL_DIV 128 +#define SOUND_DECODE_LENGTH 16 + +#ifndef SNES4ALL_NUM_CHANNELS +#define NUM_CHANNELS 8 +#else +#define NUM_CHANNELS SNES4ALL_NUM_CHANNELS +#endif +#define SOUND_BUFFER_SIZE (1024 * 16) +#define MAX_BUFFER_SIZE SOUND_BUFFER_SIZE +#define SOUND_BUFFER_SIZE_MASK (SOUND_BUFFER_SIZE - 1) + +#define SOUND_BUFS 4 + +#ifdef __sgi +# include +#endif /* __sgi */ + +typedef struct { +#ifdef SNES4ALL_SOUND_FD + int sound_fd; +#endif +#ifdef SNES4ALL_SOUND_SWITCH + int sound_switch; +#endif +#ifdef SNES4ALL_PLAYBACK_RATE + int playback_rate; +#endif + int buffer_size; + int noise_gen; + bool8 mute_sound; +#ifdef SNES4ALL_STEREO + int stereo; +#endif +#if 0 + bool8 encoded; +#endif +#ifdef __sun + int last_eof; +#endif +#ifdef __sgi + ALport al_port; +#endif /* __sgi */ + int32 samples_mixed_so_far; + int32 play_position; + uint32 err_counter; +#ifdef SNES4ALL_PLAYBACK_RATE + uint32 err_rate; +#endif +} SoundStatus; + +#ifndef SNES4ALL_PLAYBACK_RATE +#ifndef PLAYBACK_RATE +#define PLAYBACK_RATE 16384 +//#define PLAYBACK_RATE 16500 +#endif +#define ERR_RATE ((uint32)(SNES_SCANLINE_TIME * FIXED_POINT / (1.0 / (double)PLAYBACK_RATE))) +#else +#define PLAYBACK_RATE so.playback_rate +#define ERR_RATE so.err_rate +#endif + +#ifndef SNES4ALL_STEREO +#define SOUND_STEREO 0 +#else +#define SOUND_STEREO so.stereo +#endif + +EXTERN_C volatile SoundStatus so; + +typedef struct { + int state; + int type; + short volume_left; + short volume_right; + uint32 hertz; + uint32 frequency; + uint32 count; + bool8 loop; + int envx; + short left_vol_level; + short right_vol_level; + short envx_target; + unsigned long int env_error; + unsigned long erate; + int direction; + unsigned long attack_rate; + unsigned long decay_rate; + unsigned long sustain_rate; + unsigned long release_rate; + unsigned long sustain_level; + signed short sample; + signed short decoded [16]; + signed short previous16 [2]; + signed short *block; + uint16 sample_number; + bool8 last_block; + bool8 needs_decode; + uint32 block_pointer; + uint32 sample_pointer; + int *echo_buf_ptr; + int mode; + int32 envxx; + signed short next_sample; + int32 interpolate; + int32 previous [2]; + // Just incase they are needed in the future, for snapshot compatibility. + int32 current; + uint32 freq; + uint32 nchan; + uint32 Imax; + uint32 dummy [4]; +// unsigned short last_valid_header; +} Channel; + +typedef struct +{ +#ifdef ENABLE_MASTER_VOLUMEN + short master_volume_left; + short master_volume_right; +#endif +#ifdef ENABLE_ECHO_SOUND + short echo_volume_left; + short echo_volume_right; + int echo_enable; + int echo_feedback; + int echo_ptr; + int echo_buffer_size; + int echo_write_enabled; + int echo_channel_enable; +#endif + int pitch_mod; + // Just incase they are needed in the future, for snapshot compatibility. + uint32 dummy [3]; + Channel channels [NUM_CHANNELS]; + bool8 no_filter; +#ifdef ENABLE_MASTER_VOLUMEN + int master_volume [2]; +#endif +#ifdef ENABLE_ECHO_SOUND + int echo_volume [2]; +#endif + int noise_hertz; +} SSoundData; + +EXTERN_C SSoundData SoundData; + +void S9xSetSoundVolume (int channel, short volume_left, short volume_right); +void S9xSetSoundFrequency (int channel, int hertz); +void S9xSetSoundHertz (int channel, int hertz); +void S9xSetSoundType (int channel, int type_of_sound); +#ifdef ENABLE_MASTER_VOLUMEN +void S9xSetMasterVolume (short master_volume_left, short master_volume_right); +#endif +#ifdef ENABLE_ECHO_SOUND +void S9xSetEchoVolume (short echo_volume_left, short echo_volume_right); +#endif +void S9xSetSoundControl (int sound_switch); +bool8 S9xSetSoundMute (bool8 mute); +void S9xSetEnvelopeHeight (int channel, int height); +void S9xSetSoundADSR (int channel, int attack, int decay, int sustain, + int sustain_level, int release); +void S9xSetSoundKeyOff (int channel); +void S9xSetSoundDecayMode (int channel); +void S9xSetSoundAttachMode (int channel); +void S9xSoundStartEnvelope (Channel *); +void S9xSetSoundSample (int channel, uint16 sample_number); +#ifdef ENABLE_ECHO_SOUND +void S9xSetEchoFeedback (int echo_feedback); +void S9xSetEchoEnable (uint8 byte); +void S9xSetEchoDelay (int byte); +void S9xSetEchoWriteEnable (uint8 byte); +#endif +void S9xSetFilterCoefficient (int tap, int value); +void S9xSetFrequencyModulationEnable (uint8 byte); +void S9xSetEnvelopeRate (int channel, unsigned long rate, int direction, + int target); +bool8 S9xSetSoundMode (int channel, int mode); +#if 0 +int S9xGetEnvelopeHeight (int channel); +#else +#define S9xGetEnvelopeHeight(CH) 0 +#endif +void S9xResetSound (bool8 full); +void S9xFixSoundAfterSnapshotLoad (); +void S9xPlaybackSoundSetting (int channel); +void S9xPlaySample (int channel); +void S9xFixEnvelope (int channel, uint8 gain, uint8 adsr1, uint8 adsr2); +void S9xStartSample (int channel); + +EXTERN_C void S9xMixSamples (uint8 *buffer, int sample_count); +EXTERN_C void S9xMixSamplesO (uint8 *buffer, int sample_count, int byte_offset); +bool8 S9xOpenSoundDevice (int, bool8, int); +void S9xSetPlaybackRate (uint32 rate); +#endif + diff --git a/src/include/spc700.h b/src/include/spc700.h new file mode 100644 index 0000000..3f06dd3 --- /dev/null +++ b/src/include/spc700.h @@ -0,0 +1,194 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _SPC700_H_ +#define _SPC700_H_ + +#ifdef SPCTOOL +#define NO_CHANNEL_STRUCT +#include "spctool/dsp.h" +#include "spctool/spc700.h" +#include "spctool/soundmod.h" +#endif + +#define Carry 1 +#define Zero 2 +#define Interrupt 4 +#define HalfCarry 8 +#define BreakFlag 16 +#define DirectPageFlag 32 +#define Overflow 64 +#define Negative 128 + +#define APUClearCarry() (IAPU._Carry = 0) +#define APUSetCarry() (IAPU._Carry = 1) +#define APUSetInterrupt() (APURegisters.P |= Interrupt) +#define APUClearInterrupt() (APURegisters.P &= ~Interrupt) +#define APUSetHalfCarry() (APURegisters.P |= HalfCarry) +#define APUClearHalfCarry() (APURegisters.P &= ~HalfCarry) +#define APUSetBreak() (APURegisters.P |= BreakFlag) +#define APUClearBreak() (APURegisters.P &= ~BreakFlag) +#define APUSetDirectPage() (APURegisters.P |= DirectPageFlag) +#define APUClearDirectPage() (APURegisters.P &= ~DirectPageFlag) +#define APUSetOverflow() (IAPU._Overflow = 1) +#define APUClearOverflow() (IAPU._Overflow = 0) + +#define APUCheckZero() (IAPU._Zero == 0) +#define APUCheckCarry() (IAPU._Carry) +#define APUCheckInterrupt() (APURegisters.P & Interrupt) +#define APUCheckHalfCarry() (APURegisters.P & HalfCarry) +#define APUCheckBreak() (APURegisters.P & BreakFlag) +#define APUCheckDirectPage() (APURegisters.P & DirectPageFlag) +#define APUCheckOverflow() (IAPU._Overflow) +#define APUCheckNegative() (IAPU._Zero & 0x80) + +#define APUClearFlags(f) (APURegisters.P &= ~(f)) +#define APUSetFlags(f) (APURegisters.P |= (f)) +#define APUCheckFlag(f) (APURegisters.P & (f)) + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8 A, Y; } B; +#else + struct { uint8 Y, A; } B; +#endif + uint16 W; +} YAndA; + +struct SAPURegisters{ + uint8 P; + YAndA YA; + uint8 X; + uint8 S; + uint16 PC; +}; + +EXTERN_C struct SAPURegisters APURegisters; + +// Needed by ILLUSION OF GAIA +//#define ONE_APU_CYCLE 14 +#define ONE_APU_CYCLE 21 + +// Needed by all games written by the software company called Human +//#define ONE_APU_CYCLE_HUMAN 17 +#define ONE_APU_CYCLE_HUMAN 21 + +// 1.953us := 1.024065.54MHz + +#ifdef SPCTOOL +EXTERN_C int32 ESPC (int32); + +#define APU_EXECUTE() \ +{ \ + int32 l = (CPU.Cycles - APU.Cycles) / 14; \ + if (l > 0) \ + { \ + l -= _EmuSPC(l); \ + APU.Cycles += l * 14; \ + } \ +} + +#else + +#define APU_EXECUTE1() \ +{ \ + APU.Cycles += S9xAPUCycles [*IAPU.PC]; \ + (*S9xApuOpcodes[*IAPU.PC]) (); \ +} + +#define APU_EXECUTE() \ +if (IAPU.APUExecuting) \ +{\ + while (APU.Cycles <= CPU.Cycles) \ + APU_EXECUTE1(); \ +} +#endif + +#endif + diff --git a/src/include/spc7110.h b/src/include/spc7110.h new file mode 100644 index 0000000..6932136 --- /dev/null +++ b/src/include/spc7110.h @@ -0,0 +1,199 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _spc7110_h +#define _spc7110_h +#include "port.h" + +#define DECOMP_BUFFER_SIZE 0x10000 + +extern void (*LoadUp7110)(char*); +extern void (*CleanUp7110)(void); +extern void (*Copy7110)(void); + +extern uint16 cacheMegs; + +//void Del7110Gfx(void); +void Close7110Gfx(void); +void Drop7110Gfx(void); +#ifdef __cplusplus +extern "C"{ +#endif +uint8 S9xGetSPC7110(uint16 Address); +uint8 S9xGetSPC7110Byte(uint32 Address); +uint8* Get7110BasePtr(uint32); +#ifdef __cplusplus +} +#endif +void S9xSetSPC7110 (uint8 data, uint16 Address); +void S9xSpc7110Init(); +uint8* Get7110BasePtr(uint32); +void S9xSpc7110Reset(); +void S9xUpdateRTC (); +//void Do7110Logging(); +int S9xRTCDaysInMonth( int month, int year ); + +//These are platform-dependant functions, but should work on +//most systems that use GNU compilers, and on Win32. +void SPC7110Load(char*); +void SPC7110Open(char*); +void SPC7110Grab(char*); + +typedef struct SPC7110RTC +{ + unsigned char reg[16]; + short index; + uint8 control; + bool8 init; + time_t last_used; +} S7RTC; + +typedef struct SPC7110EmuVars +{ + unsigned char reg4800; + unsigned char reg4801; + unsigned char reg4802; + unsigned char reg4803; + unsigned char reg4804; + unsigned char reg4805; + unsigned char reg4806; + unsigned char reg4807; + unsigned char reg4808; + unsigned char reg4809; + unsigned char reg480A; + unsigned char reg480B; + unsigned char reg480C; + unsigned char reg4811; + unsigned char reg4812; + unsigned char reg4813; + unsigned char reg4814; + unsigned char reg4815; + unsigned char reg4816; + unsigned char reg4817; + unsigned char reg4818; + unsigned char reg4820; + unsigned char reg4821; + unsigned char reg4822; + unsigned char reg4823; + unsigned char reg4824; + unsigned char reg4825; + unsigned char reg4826; + unsigned char reg4827; + unsigned char reg4828; + unsigned char reg4829; + unsigned char reg482A; + unsigned char reg482B; + unsigned char reg482C; + unsigned char reg482D; + unsigned char reg482E; + unsigned char reg482F; + unsigned char reg4830; + unsigned char reg4831; + unsigned char reg4832; + unsigned char reg4833; + unsigned char reg4834; + unsigned char reg4840; + unsigned char reg4841; + unsigned char reg4842; + uint8 AlignBy; + uint8 written; + uint8 offset_add; + uint32 DataRomOffset; + uint32 DataRomSize; + uint32 bank50Internal; + uint8 bank50[DECOMP_BUFFER_SIZE]; + +} SPC7110Regs; +extern SPC7110Regs s7r; +extern S7RTC rtc_f9; +// These are defined in spc7110.cpp +bool8 S9xSaveSPC7110RTC (S7RTC *rtc_f9); +bool8 S9xLoadSPC7110RTC (S7RTC *rtc_f9); + +#endif + diff --git a/src/include/srtc.h b/src/include/srtc.h new file mode 100644 index 0000000..4ee24b0 --- /dev/null +++ b/src/include/srtc.h @@ -0,0 +1,157 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _srtc_h_ +#define _srtc_h_ + +#include + +#define MAX_RTC_INDEX 0xC + +#define MODE_READ 0 +#define MODE_LOAD_RTC 1 +#define MODE_COMMAND 2 +#define MODE_COMMAND_DONE 3 + +#define COMMAND_LOAD_RTC 0 +#define COMMAND_CLEAR_RTC 4 + + +/*** The format of the rtc_data structure is: + +Index Description Range (nibble) +----- -------------- --------------------------------------- + + 0 Seconds low 0-9 + 1 Seconds high 0-5 + + 2 Minutes low 0-9 + 3 Minutes high 0-5 + + 4 Hour low 0-9 + 5 Hour high 0-2 + + 6 Day low 0-9 + 7 Day high 0-3 + + 8 Month 1-C (0xC is December, 12th month) + + 9 Year ones 0-9 + A Year tens 0-9 + B Year High 9-B (9=19xx, A=20xx, B=21xx) + + C Day of week 0-6 (0=Sunday, 1=Monday,...,6=Saturday) + +***/ + +typedef struct +{ + bool8 needs_init; + bool8 count_enable; // Does RTC mark time or is it frozen + uint8 data [MAX_RTC_INDEX+1]; + int8 index; + uint8 mode; + + time_t system_timestamp; // Of latest RTC load time + uint32 pad; +} SRTC_DATA; + +extern SRTC_DATA rtc; + +void S9xUpdateSrtcTime (); +void S9xSetSRTC (uint8 data, uint16 Address); +uint8 S9xGetSRTC (uint16 Address); +void S9xSRTCPreSaveState (); +void S9xSRTCPostLoadState (); +void S9xResetSRTC (); +void S9xHardResetSRTC (); + +#define SRTC_SRAM_PAD (4 + 8 + 1 + MAX_RTC_INDEX) + +#endif // _srtc_h + diff --git a/src/include/tile.h b/src/include/tile.h new file mode 100644 index 0000000..5478391 --- /dev/null +++ b/src/include/tile.h @@ -0,0 +1,445 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#ifndef _TILE_H_ +#define _TILE_H_ + +#define TILE_AssignPixel(N, value) Screen[N]=(value);Depth[N]=GFX.Z2; +#define TILE_AssignPixel_(value) *Screen=(value);*Depth=_GFX_Z2_; + +#define TILE_SetPixel(N, Pixel) TILE_AssignPixel(N, (uint8) GFX.ScreenColors [Pixel]); +#define TILE_SetPixel16(N, Pixel) TILE_AssignPixel(N, GFX.ScreenColors [Pixel]); +#define TILE_SetPixel16_(Pixel) TILE_AssignPixel_(GFX.ScreenColors[Pixel]); + +#define TILE_AddPixel16(N, Pixel) TILE_AssignPixel(N, COLOR_ADD(GFX.ScreenColors[Pixel], Screen[GFX.Delta+N])); +#define TILE_AddFPixel16(N, Pixel) TILE_AssignPixel(N, COLOR_ADD(GFX.ScreenColors[Pixel], GFX.FixedColour)); +#define TILE_AddPixel16Half(N, Pixel) TILE_AssignPixel(N, (uint16)COLOR_ADD1_2(GFX.ScreenColors[Pixel], Screen[GFX.Delta+N])); +#define TILE_AddFPixel16Half(N, Pixel) TILE_AssignPixel(N, (uint16)COLOR_ADD1_2(GFX.ScreenColors[Pixel], GFX.FixedColour)); + +#define TILE_SubPixel16(N, Pixel) TILE_AssignPixel(N, COLOR_SUB(GFX.ScreenColors[Pixel], Screen[GFX.Delta+N])); +#define TILE_SubFPixel16(N, Pixel) TILE_AssignPixel(N, COLOR_SUB(GFX.ScreenColors[Pixel], GFX.FixedColour)); +#define TILE_SubPixel16Half(N, Pixel) TILE_AssignPixel(N, (uint16)COLOR_SUB1_2(GFX.ScreenColors[Pixel], Screen[GFX.Delta+N])); +#define TILE_SubFPixel16Half(N, Pixel) TILE_AssignPixel(N, (uint16)COLOR_SUB1_2(GFX.ScreenColors[Pixel], GFX.FixedColour)); + +#define TILE_Select3(N,Pixel,FAddType, AddType) \ + switch(SubDepth[N]) \ + { \ + case 0: TILE_SetPixel16(N, Pixel); break; \ + case 1: TILE_##FAddType(N, Pixel); break; \ + default: TILE_##AddType(N, Pixel); break; \ + } + +#define TILE_Select2(N,Pixel,FAddType) \ + switch(SubDepth[N]) \ + { \ + case 1: TILE_##FAddType(N, Pixel); break; \ + default: TILE_SetPixel16(N, Pixel); break; \ + } + +#define TILE_SelectAddPixel16(N, Pixel) TILE_Select3(N,Pixel, AddFPixel16, AddPixel16) +#define TILE_SelectAddPixel16Half(N, Pixel) TILE_Select3(N,Pixel, AddFPixel16, AddPixel16Half) +#define TILE_SelectSubPixel16(N, Pixel) TILE_Select3(N,Pixel, SubFPixel16, SubPixel16) +#define TILE_SelectSubPixel16Half(N, Pixel) TILE_Select3(N,Pixel, SubFPixel16, SubPixel16Half) + +#define TILE_SelectFAddPixel16Half(N, Pixel) TILE_Select2(N,Pixel, AddFPixel16Half) +#define TILE_SelectFSubPixel16Half(N, Pixel) TILE_Select2(N,Pixel, SubFPixel16Half) + +/*******************/ + +#ifdef DIRECT_COLOR_MAP +#define CHECK_DIRECTCOLOUR_TILE \ + if (BG.DirectColourMode) \ + { \ + if (IPPU.DirectColourMapsNeedRebuild) \ + S9xBuildDirectColourMaps (); \ + GFX.ScreenColors = DirectColourMaps [(Tile >> 10) & BG.PaletteMask]; \ + } \ + else +#else +#define CHECK_DIRECTCOLOUR_TILE +#endif + +#ifdef DEBUG_TILECACHE +extern unsigned snes4all_debug_tilecache_fails; +extern unsigned snes4all_debug_tilecache_tiles; +#define PRINT_NEWTILE \ +{ \ + unsigned tipo; \ + if (BG.Buffered==IPPU.TileCached[0]) \ + tipo=0; \ + else if (BG.Buffered==IPPU.TileCached[1]) \ + tipo=1; \ + else \ + tipo=2; \ + printf("%i,%i\n",tipo,TileNumber); \ + snes4all_debug_tilecache_fails++; \ +} +#define INC_EFICIENCIA \ +{ \ + snes4all_debug_tilecache_tiles++; \ +} +#else +#define INC_EFICIENCIA +#define PRINT_NEWTILE +#endif + +#ifdef USE_GL +#define TILE_DEFINE_CONVERTED int tile_converted=0; +#define TILE_CONVERTED tile_converted=1; +#else +#define TILE_DEFINE_CONVERTED +#define TILE_CONVERTED +#endif + +#define TILE_PREAMBLE \ + uint8 *pCache; \ + TILE_DEFINE_CONVERTED \ +\ + uint32 TileAddr = BG.TileAddress + ((Tile & 0x3ff) << BG.TileShift); \ + if ((Tile & 0x1ff) >= 256) \ + TileAddr += BG.NameSelect; \ +\ + TileAddr &= 0xffff; \ +\ + uint32 TileNumber; \ + pCache = &BG.Buffer[(TileNumber = (TileAddr >> BG.TileShift)) << 6]; \ +\ + INC_EFICIENCIA \ + if (!BG.Buffered [TileNumber]) \ + { \ + PRINT_NEWTILE \ + TILE_CONVERTED \ + BG.Buffered[TileNumber] = ConvertTile (pCache, TileAddr); \ + } \ +\ + if (BG.Buffered [TileNumber] == BLANK_TILE) \ + return; \ +\ + register uint32 l; \ + CHECK_DIRECTCOLOUR_TILE \ + GFX.ScreenColors = &IPPU.ScreenColors [(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette]; + +#if defined(DREAMCAST) && defined(USE_RENDER_PREFETCH) +#define PREFETCH_BP(BP) asm("pref @%0" : : "r" (((unsigned)(BP)) + 32)) +#define PREFETCH_BPN(BP) asm("pref @%0" : : "r" (((unsigned)(BP)) - 32)) +#else +#define PREFETCH_BP(BP) +#define PREFETCH_BPN(BP) +#endif + +#define RENDER_TILE(NORMAL, FLIPPED, N) \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + bp = pCache + StartLine; \ + PREFETCH_BP(bp); \ + for (l = LineCount; l != 0; l--, bp += 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if (*(uint32 *) bp) \ + NORMAL (Offset, bp); \ + if (*(uint32 *) (bp + 4)) \ + NORMAL (Offset + N, bp + 4); \ + } \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + bp = pCache + StartLine; \ + PREFETCH_BP(bp); \ + for (l = LineCount; l != 0; l--, bp += 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if (*(uint32 *) (bp + 4)) \ + FLIPPED (Offset, bp + 4); \ + if (*(uint32 *) bp) \ + FLIPPED (Offset + N, bp); \ + } \ + } \ + else \ + if (Tile & H_FLIP) \ + { \ + bp = pCache + 56 - StartLine; \ + PREFETCH_BPN(bp); \ + for (l = LineCount; l != 0; l--, bp -= 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if (*(uint32 *) (bp + 4)) \ + FLIPPED (Offset, bp + 4); \ + if (*(uint32 *) bp) \ + FLIPPED (Offset + N, bp); \ + } \ + } \ + else \ + { \ + bp = pCache + 56 - StartLine; \ + PREFETCH_BPN(bp); \ + for (l = LineCount; l != 0; l--, bp -= 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if (*(uint32 *) bp) \ + NORMAL (Offset, bp); \ + if (*(uint32 *) (bp + 4)) \ + NORMAL (Offset + N, bp + 4); \ + } \ + } + +#define RENDER_TILE2(NORMAL, NORMALV, FLIPPED, FLIPPEDV) \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + bp = pCache + StartLine; \ + NORMAL (Offset, bp, LineCount); \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + bp = pCache + StartLine; \ + FLIPPED (Offset, bp, LineCount); \ + } \ + else \ + if (Tile & H_FLIP) \ + { \ + bp = pCache + 56 - StartLine; \ + FLIPPEDV (Offset, bp, LineCount); \ + } \ + else \ + { \ + bp = pCache + 56 - StartLine; \ + NORMALV (Offset, bp, LineCount); \ + } + + +#define TILE_CLIP_PREAMBLE \ + uint32 dd; \ + uint32 d1; \ + uint32 d2; \ +\ + if (StartPixel < 4) \ + { \ + d1 = HeadMask [StartPixel]; \ + if (StartPixel + Width < 4) \ + d1 &= TailMask [StartPixel + Width]; \ + } \ + else \ + d1 = 0; \ +\ + if (StartPixel + Width > 4) \ + { \ + if (StartPixel > 4) \ + d2 = HeadMask [StartPixel - 4]; \ + else \ + d2 = 0xffffffff; \ +\ + d2 &= TailMask [(StartPixel + Width - 4)]; \ + } \ + else \ + d2 = 0; + + +#define RENDER_CLIPPED_TILE(NORMAL, FLIPPED, N) \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + bp = pCache + StartLine; \ + PREFETCH_BP(bp); \ + for (l = LineCount; l != 0; l--, bp += 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if ((dd = (*(uint32 *) bp) & d1)) \ + NORMAL (Offset, (uint8 *) &dd); \ + if ((dd = (*(uint32 *) (bp + 4)) & d2)) \ + NORMAL (Offset + N, (uint8 *) &dd); \ + } \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + bp = pCache + StartLine; \ + PREFETCH_BP(bp); \ + SWAP_DWORD (d1); \ + SWAP_DWORD (d2); \ + for (l = LineCount; l != 0; l--, bp += 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if ((dd = *(uint32 *) (bp + 4) & d1)) \ + FLIPPED (Offset, (uint8 *) &dd); \ + if ((dd = *(uint32 *) bp & d2)) \ + FLIPPED (Offset + N, (uint8 *) &dd); \ + } \ + } \ + else \ + if (Tile & H_FLIP) \ + { \ + bp = pCache + 56 - StartLine; \ + PREFETCH_BPN(bp); \ + SWAP_DWORD (d1); \ + SWAP_DWORD (d2); \ + for (l = LineCount; l != 0; l--, bp -= 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if ((dd = *(uint32 *) (bp + 4) & d1)) \ + FLIPPED (Offset, (uint8 *) &dd); \ + if ((dd = *(uint32 *) bp & d2)) \ + FLIPPED (Offset + N, (uint8 *) &dd); \ + } \ + } \ + else \ + { \ + bp = pCache + 56 - StartLine; \ + PREFETCH_BPN(bp); \ + for (l = LineCount; l != 0; l--, bp -= 8, Offset += SNES4ALL_SCREEN_PITCH2) \ + { \ + if ((dd = (*(uint32 *) bp) & d1)) \ + NORMAL (Offset, (uint8 *) &dd); \ + if ((dd = (*(uint32 *) (bp + 4)) & d2)) \ + NORMAL (Offset + N, (uint8 *) &dd); \ + } \ + } + +#define RENDER_TILE_LARGE(PIXEL, FUNCTION) \ + if (!(Tile & (V_FLIP | H_FLIP))) \ + { \ + if ((pixel = *(pCache + StartLine + StartPixel))) \ + { \ + pixel = PIXEL; \ + for (l = LineCount; l != 0; l--, sp += SNES4ALL_SCREEN_PITCH2, Depth += SNES4ALL_SCREEN_PITCH2) \ + { \ + for (int z = Pixels - 1; z >= 0; z--) \ + if (GFX.Z1 > Depth [z]) \ + { \ + sp [z] = FUNCTION(sp + z, pixel); \ + Depth [z] = GFX.Z2; \ + }\ + } \ + } \ + } \ + else \ + if (!(Tile & V_FLIP)) \ + { \ + StartPixel = 7 - StartPixel; \ + if ((pixel = *(pCache + StartLine + StartPixel))) \ + { \ + pixel = PIXEL; \ + for (l = LineCount; l != 0; l--, sp += SNES4ALL_SCREEN_PITCH2, Depth += SNES4ALL_SCREEN_PITCH2) \ + { \ + for (int z = Pixels - 1; z >= 0; z--) \ + if (GFX.Z1 > Depth [z]) \ + { \ + sp [z] = FUNCTION(sp + z, pixel); \ + Depth [z] = GFX.Z2; \ + }\ + } \ + } \ + } \ + else \ + if (Tile & H_FLIP) \ + { \ + StartPixel = 7 - StartPixel; \ + if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \ + { \ + pixel = PIXEL; \ + for (l = LineCount; l != 0; l--, sp += SNES4ALL_SCREEN_PITCH2, Depth += SNES4ALL_SCREEN_PITCH2) \ + { \ + for (int z = Pixels - 1; z >= 0; z--) \ + if (GFX.Z1 > Depth [z]) \ + { \ + sp [z] = FUNCTION(sp + z, pixel); \ + Depth [z] = GFX.Z2; \ + }\ + } \ + } \ + } \ + else \ + { \ + if ((pixel = *(pCache + 56 - StartLine + StartPixel))) \ + { \ + pixel = PIXEL; \ + for (l = LineCount; l != 0; l--, sp += SNES4ALL_SCREEN_PITCH2, Depth += SNES4ALL_SCREEN_PITCH2) \ + { \ + for (int z = Pixels - 1; z >= 0; z--) \ + if (GFX.Z1 > Depth [z]) \ + { \ + sp [z] = FUNCTION(sp + z, pixel); \ + Depth [z] = GFX.Z2; \ + }\ + } \ + } \ + } +#endif + diff --git a/src/include/videogl.h b/src/include/videogl.h new file mode 100644 index 0000000..be36e67 --- /dev/null +++ b/src/include/videogl.h @@ -0,0 +1,136 @@ +#if !defined(_VIDEOGL_H_) && defined(USE_GL) +#define _VIDEOGL_H_ + +#include +#include +#include +#include +#ifndef WIN32 +#include +#else +#include +#ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#endif +#ifndef GL_UNSIGNED_SHORT_5_6_5 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#endif +#endif + +#include "snes9x.h" +#include "ppu.h" + +#if defined(CYGWIN) && defined(__WIN32__) +#undef __WIN32__ +#endif + +#define VIDEO_GL_WIDTH 640 +#define VIDEO_GL_HEIGHT 480 +#define VIDEO_GL_MAX_TILES 0x8000 + +#ifndef DREAMCAST +#define SNES4ALL_FILTER_NONE GL_NEAREST +#define SNES4ALL_FILTER_BILINEAR GL_LINEAR +#else +#define SNES4ALL_FILTER_NONE GL_FILTER_NONE +#define SNES4ALL_FILTER_BILINEAR GL_FILTER_BILINEAR +#endif + +#ifndef VIDEO_GL_MAX_TEX +//#define VIDEO_GL_MAX_TEX (8*(MAX_2BIT_TILES + MAX_4BIT_TILES + MAX_8BIT_TILES)) +#define VIDEO_GL_MAX_TEX (8*(2048 + 2048)) +#endif + +#define VIDEO_GL_TILE_Z_INIT 0.1 +#define VIDEO_GL_TILE_Z_INC 0.000000069f + +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET +#define VIDEO_GL_SELECTIVE_MAX_CACHE (VIDEO_GL_MAX_TEX/16) +extern unsigned short videogl_selective[256]; +extern unsigned short videogl_selective_cache[VIDEO_GL_SELECTIVE_MAX_CACHE*256]; +#endif + +#ifndef VIDEO_GL_RASTER +#define VIDEO_GL_RASTER 64 +#endif + +extern SDL_Surface *videogl_screen; +extern void *videogl_screen_buffer; +extern GLint videogl_screen_texture; +extern unsigned videogl_screen_endY; +extern float videogl_z; +extern GLint videogl_tex[VIDEO_GL_MAX_TEX]; +extern unsigned short *videogl_cache; +extern unsigned short videogl_cached[VIDEO_GL_MAX_TEX]; + +typedef struct { + unsigned char z,x,y,flip,clipx,clipy; +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET + unsigned char pal; +#endif +#ifdef USE_VIDEOGL_EXTEND_TILELIST + unsigned char add; +#if !defined(USE_VGL_LARGE_TABLE) || !defined(USE_VGL_TABLE) + unsigned char y1, mosaic; +#endif +#endif + unsigned short tile; +}videogl_tile_list_t; + +extern videogl_tile_list_t videogl_tile[VIDEO_GL_MAX_TEX]; +extern videogl_tile_list_t *videogl_tile_p[VIDEO_GL_MAX_TEX]; +extern unsigned short videogl_tiles_z[256]; + +extern unsigned videogl_tiles; +extern unsigned char videogl_min_z, videogl_max_z; + +extern int videogl_used_addfix; +extern unsigned short videogl_addfix_color[VIDEO_GL_RASTER]; +extern int videogl_addfix_x0, videogl_addfix_y0, videogl_addfix_x1, videogl_addfix_y1; + +extern unsigned char videogl_first_brightness; +extern unsigned char videogl_brightness; + +extern int videogl_used_sub; +extern unsigned short videogl_sub_color; +extern int videogl_sub_x0, videogl_sub_y0, videogl_sub_x1, videogl_sub_y1; + +extern unsigned short videogl_background_color[VIDEO_GL_RASTER]; +extern int videogl_used_screen; + +extern int videogl_fps_enabled; +extern void *videogl_fps_buffer; + +extern struct ClipData *videogl_clip; +extern int videogl_clip_enabled; + +extern unsigned short videogl_cache_slot[VIDEO_GL_MAX_TEX]; +extern unsigned short videogl_cache_tile_slot[VIDEO_GL_MAX_TEX]; +extern unsigned videogl_cache_slot_last; + +extern int videogl_hw_render; +extern int videogl_8bit_tiles; + +#ifdef DREAMCAST +extern void *videogl_dc_buffer; +#endif + +extern int videogl_cache_to_reseted; + +void videogl_flip(SDL_bool); +SDL_bool videogl_init(void); +void videogl_change_render(int); + + +static __inline__ void loadTextureParams(int filter) +{ +// glPixelStorei(GL_UNPACK_ROW_LENGTH, 16); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE, GL_REPLACE); +} + + +#endif diff --git a/src/loadzip.cpp b/src/loadzip.cpp new file mode 100644 index 0000000..8c84f55 --- /dev/null +++ b/src/loadzip.cpp @@ -0,0 +1,270 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifdef UNZIP_SUPPORT +/**********************************************************************************************/ +/* Loadzip.CPP */ +/* This file contains a function for loading a SNES ROM image from a zip file */ +/**********************************************************************************************/ + +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include + +#ifndef NO_INLINE_SET_GET +#define NO_INLINE_SET_GET +#endif + +#include "snes9x.h" +#include "memmap.h" + +#include "unzip.h" +#include +#include +#include + +bool8 LoadZip(const char* zipname, + int32 *TotalFileSize, + int32 *headers, uint8* buffer) +{ + *TotalFileSize = 0; + *headers = 0; + + unzFile file = unzOpen(zipname); + if(file == NULL) + return (FALSE); + + // find largest file in zip file (under MAX_ROM_SIZE) + // or a file with extension .1 + char filename[132]; + int filesize = 0; + int port = unzGoToFirstFile(file); + unz_file_info info; + while(port == UNZ_OK) + { + char name[132]; + unzGetCurrentFileInfo(file, &info, name,128, NULL,0, NULL,0); + +#if 0 + int calc_size = info.uncompressed_size / 0x2000; + calc_size *= 0x2000; + if(!(info.uncompressed_size - calc_size == 512 || info.uncompressed_size == calc_size)) + { + port = unzGoToNextFile(file); + continue; + } +#endif + + if(info.uncompressed_size > (CMemory_MAX_ROM_SIZE + 512)) + { + port = unzGoToNextFile(file); + continue; + } + + if ((int) info.uncompressed_size > filesize) + { + strcpy(filename,name); + filesize = info.uncompressed_size; + } + int len = strlen(name); + if(name[len-2] == '.' && name[len-1] == '1') + { + strcpy(filename,name); + filesize = info.uncompressed_size; + break; + } + port = unzGoToNextFile(file); + } + if( !(port == UNZ_END_OF_LIST_OF_FILE || port == UNZ_OK) || filesize == 0) + { + assert( unzClose(file) == UNZ_OK ); + return (FALSE); + } + + // Find extension + char tmp[2]; + tmp[0] = tmp[1] = 0; + char *ext = strrchr(filename,'.'); + if(ext) ext++; + else ext = tmp; + + uint8 *ptr = buffer; + bool8 more = FALSE; + + unzLocateFile(file,filename,1); + unzGetCurrentFileInfo(file, &info, filename,128, NULL,0, NULL,0); + + if( unzOpenCurrentFile(file) != UNZ_OK ) + { + unzClose(file); + return (FALSE); + } + + do + { + assert(info.uncompressed_size <= CMemory_MAX_ROM_SIZE + 512); + int FileSize = info.uncompressed_size; + + int calc_size = FileSize / 0x2000; + calc_size *= 0x2000; + + int l = unzReadCurrentFile(file,ptr,FileSize); + if(unzCloseCurrentFile(file) == UNZ_CRCERROR) + { + unzClose(file); + return (FALSE); + } + + if(l <= 0 || l != FileSize) + { + unzClose(file); + switch(l) + { + case UNZ_ERRNO: + break; + case UNZ_EOF: + break; + case UNZ_PARAMERROR: + break; + case UNZ_BADZIPFILE: + break; + case UNZ_INTERNALERROR: + break; + case UNZ_CRCERROR: + break; + } + return (FALSE); + } + + if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) || + Settings.ForceHeader) + { + memmove (ptr, ptr + 512, calc_size); + (*headers)++; + FileSize -= 512; + } + ptr += FileSize; + (*TotalFileSize) += FileSize; + + int len; + if (ptr - CMemory_ROM < CMemory_MAX_ROM_SIZE + 0x200 && + (isdigit (ext [0]) && ext [1] == 0 && ext [0] < '9')) + { + more = TRUE; + ext [0]++; + } + else if (ptr - CMemory_ROM < CMemory_MAX_ROM_SIZE + 0x200 && + (((len = strlen (filename)) == 7 || len == 8) && + strncasecmp (filename, "sf", 2) == 0 && + isdigit (filename [2]) && isdigit (filename [3]) && isdigit (filename [4]) && + isdigit (filename [5]) && isalpha (filename [len - 1]))) + { + more = TRUE; + filename [len - 1]++; + } + else + more = FALSE; + + if(more) + { + if( unzLocateFile(file,filename,1) != UNZ_OK || + unzGetCurrentFileInfo(file, &info, filename,128, NULL,0, NULL,0) != UNZ_OK || + unzOpenCurrentFile(file) != UNZ_OK) + break; + } + + } while(more); + + unzClose(file); + return (TRUE); +} +#endif + diff --git a/src/memmap.cpp b/src/memmap.cpp new file mode 100644 index 0000000..11af8e0 --- /dev/null +++ b/src/memmap.cpp @@ -0,0 +1,4461 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include + +#ifdef __linux +#include +#endif + +#ifdef JMA_SUPPORT +#include "jma/s9x-jma.h" +#endif + +#include "snes9x.h" +#include "memmap.h" +#include "cpuexec.h" +#include "ppu.h" +#include "display.h" +#include "cheats.h" +#include "apu.h" +#include "sa1.h" +#include "dsp1.h" +#include "srtc.h" +#include "sdd1.h" +#include "spc7110.h" +#include "seta.h" +#include "unzip.h" +#include "snes4all.h" + +#ifdef __W32_HEAP +#include +#endif + +#ifndef ZSNES_FX +#include "fxemu.h" +extern struct FxInit_s SuperFX; +#else +START_EXTERN_C +extern uint8 *SFXPlotTable; +END_EXTERN_C +#endif + + +#ifndef SET_UI_COLOR +#define SET_UI_COLOR(r,g,b) ; +#endif + +//you would think everyone would have these +//since they're so useful. +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifdef USE_MMU +#define MMU_ALIGN __attribute__ ((__aligned__ (0x1000))) +#else +#define MMU_ALIGN +#endif + +static int retry_count=0; +static uint8 bytes0x2000 [0x2000] MMU_ALIGN; +static int is_bsx(unsigned char *); +static int bs_name(unsigned char *); +static int check_char(unsigned); +static void S9xDeinterleaveType2 (bool8 reset); +static __inline__ uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32); + +extern char *rom_filename; + +const uint32 crc32Table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + + + +void S9xDeinterleaveType1(int TotalFileSize, uint8 * base) +{ + if(Settings.DisplayColor==0xffff) + { + Settings.DisplayColor=BUILD_PIXEL(0,31,0); + SET_UI_COLOR(0,255,0); + } + + int i; + int nblocks = TotalFileSize >> 16; + uint8 blocks [256]; + for (i = 0; i < nblocks; i++) + { + blocks [i * 2] = i + nblocks; + blocks [i * 2 + 1] = i; + } + uint8 *tmp = (uint8 *) malloc (0x8000); + if (tmp) + { + for (i = 0; i < nblocks * 2; i++) + { + int j; + for (j = i; j < nblocks * 2; j++) + { + if (blocks [j] == i) + { + memmove (tmp, &base [blocks [j] * 0x8000], 0x8000); + memmove (&base [blocks [j] * 0x8000], + &base [blocks [i] * 0x8000], 0x8000); + memmove (&base [blocks [i] * 0x8000], tmp, 0x8000); + uint8 b = blocks [j]; + blocks [j] = blocks [i]; + blocks [i] = b; + break; + } + } + } + free ((char *) tmp); + } +} + +void S9xDeinterleaveGD24(int TotalFileSize, uint8 * base) +{ + + if(TotalFileSize!=0x300000) + return; + + if(Settings.DisplayColor==0xffff) + { + Settings.DisplayColor=BUILD_PIXEL(0,31,31); + SET_UI_COLOR(0,255,255); + } + + uint8 *tmp = (uint8 *) malloc (0x80000); + if (tmp) + { + memmove(tmp, &base[0x180000], 0x80000); + memmove(&base[0x180000], &base[0x200000], 0x80000); + memmove(&base[0x200000], &base[0x280000], 0x80000); + memmove(&base[0x280000], tmp, 0x80000); + free ((char *) tmp); + + S9xDeinterleaveType1(TotalFileSize, base); + } +} + +bool8 CMemory_AllASCII (uint8 *b, int size) +{ + int i; + for (i = 0; i < size; i++) + { + if (b[i] < 32 || b[i] > 126) + return (FALSE); + } + return (TRUE); +} + +int CMemory_ScoreHiROM (bool8 skip_header, int32 romoff) +{ + int score = 0; + int o = skip_header ? 0xff00 + 0x200 : 0xff00; + + o+=romoff; + + if(CMemory_ROM [o + 0xd5] & 0x1) + score+=2; + + //Mode23 is SA-1 + if(CMemory_ROM [o + 0xd5] == 0x23) + score-=2; + + if(CMemory_ROM [o+0xd4] == 0x20) + score +=2; + + if ((CMemory_ROM [o + 0xdc] + (CMemory_ROM [o + 0xdd] << 8) + + CMemory_ROM [o + 0xde] + (CMemory_ROM [o + 0xdf] << 8)) == 0xffff) + { + score += 2; + if(0!=(CMemory_ROM [o + 0xde] + (CMemory_ROM [o + 0xdf] << 8))) + score++; + } + + if (CMemory_ROM [o + 0xda] == 0x33) + score += 2; + if ((CMemory_ROM [o + 0xd5] & 0xf) < 4) + score += 2; + if (!(CMemory_ROM [o + 0xfd] & 0x80)) + score -= 6; + if ((CMemory_ROM [o + 0xfc]|(CMemory_ROM [o + 0xfd]<<8))>0xFFB0) + score -= 2; //reduced after looking at a scan by Cowering + if (CMemory_CalculatedSize > 1024 * 1024 * 3) + score += 4; + if ((1 << (CMemory_ROM [o + 0xd7] - 7)) > 48) + score -= 1; + if (!CMemory_AllASCII (&CMemory_ROM [o + 0xb0], 6)) + score -= 1; + if (!CMemory_AllASCII (&CMemory_ROM [o + 0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); +} + +int CMemory_ScoreLoROM (bool8 skip_header, int32 romoff) +{ + int score = 0; + int o = skip_header ? 0x7f00 + 0x200 : 0x7f00; + + o+=romoff; + + if(!(CMemory_ROM [o + 0xd5] & 0x1)) + score+=3; + + //Mode23 is SA-1 + if(CMemory_ROM [o + 0xd5] == 0x23) + score+=2; + + if ((CMemory_ROM [o + 0xdc] + (CMemory_ROM [o + 0xdd] << 8) + + CMemory_ROM [o + 0xde] + (CMemory_ROM [o + 0xdf] << 8)) == 0xffff) + { + score += 2; + if(0!=(CMemory_ROM [o + 0xde] + (CMemory_ROM [o + 0xdf] << 8))) + score++; + } + + if (CMemory_ROM [o + 0xda] == 0x33) + score += 2; + if ((CMemory_ROM [o + 0xd5] & 0xf) < 4) + score += 2; + if (CMemory_CalculatedSize <= 1024 * 1024 * 16) + score += 2; + if (!(CMemory_ROM [o + 0xfd] & 0x80)) + score -= 6; + if ((CMemory_ROM [o + 0xfc]|(CMemory_ROM [o + 0xfd]<<8))>0xFFB0) + score -= 2;//reduced per Cowering suggestion + if ((1 << (CMemory_ROM [o + 0xd7] - 7)) > 48) + score -= 1; + if (!CMemory_AllASCII (&CMemory_ROM [o + 0xb0], 6)) + score -= 1; + if (!CMemory_AllASCII (&CMemory_ROM [o + 0xc0], ROM_NAME_LEN - 1)) + score -= 1; + + return (score); +} + +char *CMemory_Safe (const char *s) +{ + static char *safe; + static int safe_len = 0; + + if(s==NULL) + { + if(safe!=NULL) + { + free((char*)safe); + safe = NULL; + } + return NULL; + } + int len = strlen (s); + if (!safe || len + 1 > safe_len) + { + if (safe) + free ((char *) safe); + safe = (char *) malloc (safe_len = len + 1); + } + {int i; + for (i = 0; i < len; i++) + { + if (s [i] >= 32 && s [i] < 127) + safe [i] = s[i]; + else + safe [i] = '?'; + } + } + safe [len] = 0; + return (safe); +} + +/**********************************************************************************************/ +/* Init() */ +/* This function allocates all the memory needed by the emulator */ +/**********************************************************************************************/ + +#if SNES4ALL_MAX_ROM_SIZE != 0x600000 +#error SNES4ALL_MAX_ROM_SIZE_INCORRECT +#endif +#if MAX_2BIT_TILES != 4096 +#error MAX_2BIT_TILES_INCORRECT +#endif +#if MAX_4BIT_TILES != 2048 +#error MAX_4BIT_TILES_INCORRECT +#endif +#if MAX_8BIT_TILES != 1024 +#error MAX_4BIT_TILES_INCORRECT +#endif + +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +static char _IPPU_TileCache_2_[MAX_2BIT_TILES * 128]; +static char _IPPU_TileCache_4_[MAX_4BIT_TILES * 128]; +static char _IPPU_TileCache_8_[MAX_8BIT_TILES * 128]; +static char _IPPU_TileCached_2_[MAX_2BIT_TILES]; +static char _IPPU_TileCached_4_[MAX_4BIT_TILES]; +static char _IPPU_TileCached_8_[MAX_8BIT_TILES]; +uint8 CMemory_RAM[0x20000] MMU_ALIGN; +uint8 CMemory_SRAM[0x20000] MMU_ALIGN; +uint8 CMemory_VRAM[0x10000] MMU_ALIGN; +uint8 CMemory_BSRAM[0x80000] MMU_ALIGN; +uint8 CMemory_FillRAM[SNES4ALL_MAX_ROM_SIZE + 0x200 + 0x8000] MMU_ALIGN; +#else +extern char _IPPU_TileCache_2_[MAX_2BIT_TILES * 128]; +extern char _IPPU_TileCache_4_[MAX_4BIT_TILES * 128]; +extern char _IPPU_TileCache_8_[MAX_8BIT_TILES * 128]; +extern char _IPPU_TileCached_2_[MAX_2BIT_TILES]; +extern char _IPPU_TileCached_4_[MAX_4BIT_TILES]; +extern char _IPPU_TileCached_8_[MAX_8BIT_TILES]; +#endif + +bool8 CMemory_Init () +{ + memset (CMemory_RAM, 0, 0x20000); + memset (CMemory_SRAM, 0, 0x20000); + memset (CMemory_VRAM, 0, 0x10000); + memset (CMemory_FillRAM, 0, SNES4ALL_MAX_ROM_SIZE + 0x200 + 0x8000); + memset (CMemory_BSRAM, 0, 0x80000); + + IPPU.TileCache [TILE_2BIT] = (uint8 *) &_IPPU_TileCache_2_; + IPPU.TileCache [TILE_4BIT] = (uint8 *) &_IPPU_TileCache_4_; + IPPU.TileCache [TILE_8BIT] = (uint8 *) &_IPPU_TileCache_8_; + + IPPU.TileCached [TILE_2BIT] = (uint8 *) &_IPPU_TileCached_2_; + IPPU.TileCached [TILE_4BIT] = (uint8 *) &_IPPU_TileCached_4_; + IPPU.TileCached [TILE_8BIT] = (uint8 *) &_IPPU_TileCached_8_; + +#if 0 + if (!CMemory_RAM || !CMemory_SRAM || !CMemory_VRAM || !CMemory_ROM || !CMemory_BSRAM || + !IPPU.TileCache [TILE_2BIT] || !IPPU.TileCache [TILE_4BIT] || + !IPPU.TileCache [TILE_8BIT] || !IPPU.TileCached [TILE_2BIT] || + !IPPU.TileCached [TILE_4BIT] || !IPPU.TileCached [TILE_8BIT]) + { + CMemory_Deinit (); + return (FALSE); + } +#endif + +#ifdef ZSNES_FX + SFXPlotTable = CMemory_ROM + 0x400000; +#else + SuperFX.pvRegisters = &CMemory_FillRAM [0x3000]; + SuperFX.nRamBanks = 2; // Most only use 1. 1=64KB, 2=128KB=1024Mb + SuperFX.pvRam = CMemory_SRAM; + SuperFX.nRomBanks = (2 * 1024 * 1024) / (32 * 1024); + SuperFX.pvRom = (uint8 *) CMemory_ROM; +#endif + + ZeroMemory (IPPU.TileCache [TILE_2BIT], MAX_2BIT_TILES * 128); + ZeroMemory (IPPU.TileCache [TILE_4BIT], MAX_4BIT_TILES * 128); + ZeroMemory (IPPU.TileCache [TILE_8BIT], MAX_8BIT_TILES * 128); + + ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); + + CMemory_SDD1Data = NULL; + CMemory_SDD1Index = NULL; + + return (TRUE); +} + +void CMemory_Deinit () +{ +#ifdef __W32_HEAP + if(_HEAPOK!=_heapchk()) + MessageBox(GUI.hWnd, "CMemory_Deinit", "Heap Corrupt", MB_OK); +#endif + + IPPU.TileCache [TILE_2BIT] = NULL; + IPPU.TileCache [TILE_4BIT] = NULL; + IPPU.TileCache [TILE_8BIT] = NULL; + IPPU.TileCached [TILE_2BIT] = NULL; + IPPU.TileCached [TILE_4BIT] = NULL; + IPPU.TileCached [TILE_8BIT] = NULL; + CMemory_FreeSDD1Data (); + CMemory_Safe(NULL); +} + +void CMemory_FreeSDD1Data () +{ + if (CMemory_SDD1Index) + { + free ((char *) CMemory_SDD1Index); + CMemory_SDD1Index = NULL; + } + if (CMemory_SDD1Data) + { + free ((char *) CMemory_SDD1Data); + CMemory_SDD1Data = NULL; + } +} + +/**********************************************************************************************/ +/* LoadROM() */ +/* This function loads a Snes-Backup image */ +/**********************************************************************************************/ + +bool8 CMemory_LoadROM (const char *filename) +{ + int32 TotalFileSize = 0; + bool8 Interleaved = FALSE; + bool8 Tales = FALSE; + + uint8* RomHeader=CMemory_ROM; + + CMemory_ExtendedFormat=NOPE; + +#if 0 + if(CleanUp7110!=NULL) + (*CleanUp7110)(); +#endif + + memset (&SNESGameFixes, 0, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; + + memset (bytes0x2000, 0, 0x2000); + CPU.TriedInterleavedMode2 = FALSE; + + CMemory_CalculatedSize = 0; + retry_count =0; + +again: + Settings.DisplayColor=0xffff; + SET_UI_COLOR(255,255,255); + + TotalFileSize = CMemory_FileLoader(CMemory_ROM, filename, CMemory_MAX_ROM_SIZE); + + if (!TotalFileSize) + return FALSE; // it ends here + else if(!Settings.NoPatch) + CMemory_CheckForIPSPatch (filename, CMemory_HeaderCount != 0, &TotalFileSize); + + //fix hacked games here. + if((strncmp("HONKAKUHA IGO GOSEI", (char*)&CMemory_ROM[0x7FC0],19)==0)&&(CMemory_ROM[0x7FD5]!=0x31)) + { + CMemory_ROM[0x7FD5]=0x31; + CMemory_ROM[0x7FD6]=0x02; + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + if((strncmp("HONKAKUHA IGO GOSEI", (char*)&CMemory_ROM[0xFFC0],19)==0)&&(CMemory_ROM[0xFFD5]!=0x31)) + { + CMemory_ROM[0xFFD5]=0x31; + CMemory_ROM[0xFFD6]=0x02; + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + if((CMemory_ROM[0x7FD5]==0x42)&&(CMemory_ROM[0x7FD6]==0x13)&&(strncmp("METAL COMBAT",(char*)&CMemory_ROM[0x7FC0],12)==0)) + { + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!"); + } + + int orig_hi_score, orig_lo_score; + int hi_score, lo_score; + + orig_hi_score = hi_score = CMemory_ScoreHiROM (FALSE,0); + orig_lo_score = lo_score = CMemory_ScoreLoROM (FALSE,0); + + if (CMemory_HeaderCount == 0 && !Settings.ForceNoHeader && + ((hi_score > lo_score && CMemory_ScoreHiROM (TRUE,0) > hi_score) || + (hi_score <= lo_score && CMemory_ScoreLoROM (TRUE,0) > lo_score))) + { + memmove (CMemory_ROM, CMemory_ROM + 512, TotalFileSize - 512); + TotalFileSize -= 512; + S9xMessage (S9X_INFO, S9X_HEADER_WARNING, + "Try specifying the -nhd command line option if the game doesn't work\n"); + //modifying ROM, so we need to rescore + orig_hi_score = hi_score = CMemory_ScoreHiROM (FALSE,0); + orig_lo_score = lo_score = CMemory_ScoreLoROM (FALSE,0); + } + + CMemory_CalculatedSize = (TotalFileSize / 0x2000) * 0x2000; + ZeroMemory (CMemory_ROM + CMemory_CalculatedSize, CMemory_MAX_ROM_SIZE - CMemory_CalculatedSize); + + if(CMemory_CalculatedSize >0x400000&& + !(CMemory_ROM[0x7FD5]==0x32&&((CMemory_ROM[0x7FD6]&0xF0)==0x40)) && //exclude S-DD1 + !(CMemory_ROM[0xFFD5]==0x3A&&((CMemory_ROM[0xFFD6]&0xF0)==0xF0))) //exclude SPC7110 + { + //you might be a Jumbo! + CMemory_ExtendedFormat=YEAH; + } + + //If both vectors are invalid, it's type 1 LoROM + + if(CMemory_ExtendedFormat==NOPE&&((CMemory_ROM[0x7FFC]|(CMemory_ROM[0x7FFD]<<8))<0x8000)&&((CMemory_ROM[0xFFFC]|(CMemory_ROM[0xFFFD]<<8)) <0x8000)) + { + if(Settings.DisplayColor==0xffff) + { + Settings.DisplayColor=BUILD_PIXEL(0,31,0); + SET_UI_COLOR(0,255,0); + } + if(!Settings.ForceInterleaved) + S9xDeinterleaveType1(TotalFileSize, CMemory_ROM); + } + + //CMemory_CalculatedSize is now set, so rescore + orig_hi_score = hi_score = CMemory_ScoreHiROM (FALSE,0); + orig_lo_score = lo_score = CMemory_ScoreLoROM (FALSE,0); + + if(NOPE!=CMemory_ExtendedFormat) + { + int loromscore, hiromscore, swappedlorom, swappedhirom; + loromscore=CMemory_ScoreLoROM(FALSE,0); + hiromscore=CMemory_ScoreHiROM(FALSE,0); + swappedlorom=CMemory_ScoreLoROM(FALSE, 0x400000); + swappedhirom=CMemory_ScoreHiROM(FALSE, 0x400000); + + //set swapped here. + + if(max(swappedlorom, swappedhirom) >= max(loromscore, hiromscore)) + { + CMemory_ExtendedFormat = BIGFIRST; + hi_score=swappedhirom; + lo_score=swappedlorom; + RomHeader=CMemory_ROM+0x400000; + } + else + { + CMemory_ExtendedFormat = SMALLFIRST; + lo_score=loromscore; + hi_score=hiromscore; + RomHeader=CMemory_ROM; + } + + + } + + Interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2; + if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score)) + { + CMemory_LoROM = TRUE; + CMemory_HiROM = FALSE; + + // Ignore map type byte if not 0x2x or 0x3x + if ((RomHeader [0x7fd5] & 0xf0) == 0x20 || (RomHeader [0x7fd5] & 0xf0) == 0x30) + { + switch (RomHeader [0x7fd5] & 0xf) + { + case 1: + Interleaved = TRUE; + break; + case 5: + Interleaved = TRUE; + Tales = TRUE; + break; + } + } + } + else + { + if ((RomHeader [0xffd5] & 0xf0) == 0x20 || (RomHeader [0xffd5] & 0xf0) == 0x30) + { + switch (RomHeader [0xffd5] & 0xf) + { + case 0: + case 3: + Interleaved = TRUE; + break; + } + } + CMemory_LoROM = FALSE; + CMemory_HiROM = TRUE; + } + + // More + if (!Settings.ForceHiROM && !Settings.ForceLoROM && + !Settings.ForceInterleaved && !Settings.ForceInterleaved2 && + !Settings.ForceNotInterleaved && !Settings.ForcePAL && + !Settings.ForceSuperFX && !Settings.ForceDSP1 && + !Settings.ForceSA1 && !Settings.ForceC4 && + !Settings.ForceSDD1) + { + + +#ifdef DETECT_NASTY_FX_INTERLEAVE +//MK: Damn. YI trips a BRK currently. Maybe even on a real cart. + +#ifdef LSB_FIRST + if(strncmp((char *) &CMemory_ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(*(uint16*)&ROM[0x7FDE])==57611&&ROM[0x10002]==0xA9) +#else + if(strncmp((char *) &CMemory_ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(ROM[0x7FDE]+(ROM[0x7FDF]<<8))==57611&&ROM[0x10002]==0xA9) +#endif + { + Interleaved=TRUE; + Settings.ForceInterleaved2=TRUE; + } +#endif + if (strncmp ((char *) &CMemory_ROM [0x7fc0], "YUYU NO QUIZ DE GO!GO!", 22) == 0) + { + CMemory_LoROM = TRUE; + CMemory_HiROM = FALSE; + Interleaved = FALSE; + } + } + + if (!Settings.ForceNotInterleaved && Interleaved) + { + CPU.TriedInterleavedMode2 = TRUE; + S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO, + "ROM image is in interleaved format - converting..."); + + if (Tales) + { + if(CMemory_ExtendedFormat==BIGFIRST) + { + S9xDeinterleaveType1(0x400000, CMemory_ROM); + S9xDeinterleaveType1(CMemory_CalculatedSize-0x400000, CMemory_ROM+0x400000); + } + else + { + S9xDeinterleaveType1(CMemory_CalculatedSize-0x400000, CMemory_ROM); + S9xDeinterleaveType1(0x400000, CMemory_ROM+CMemory_CalculatedSize-0x400000); + + } + + CMemory_LoROM = FALSE; + CMemory_HiROM = TRUE; + + + } + else if (Settings.ForceInterleaved2) + { + S9xDeinterleaveType2(FALSE); + } + else if (Settings.ForceInterleaveGD24 && CMemory_CalculatedSize ==0x300000) + { + bool8 t = CMemory_LoROM; + + CMemory_LoROM = CMemory_HiROM; + CMemory_HiROM = t; + S9xDeinterleaveGD24(CMemory_CalculatedSize, CMemory_ROM); + } + else + { + if(Settings.DisplayColor==0xffff) + { + Settings.DisplayColor=BUILD_PIXEL(0,31,0); + SET_UI_COLOR(0,255,0); + } + bool8 t = CMemory_LoROM; + + CMemory_LoROM = CMemory_HiROM; + CMemory_HiROM = t; + + S9xDeinterleaveType1(CMemory_CalculatedSize, CMemory_ROM); + } + + hi_score = CMemory_ScoreHiROM (FALSE,0); + lo_score = CMemory_ScoreLoROM (FALSE,0); + + if ((CMemory_HiROM && + (lo_score >= hi_score || hi_score < 0)) || + (CMemory_LoROM && + (hi_score > lo_score || lo_score < 0))) + { + if (retry_count == 0) + { + S9xMessage (S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO, + "ROM lied about its type! Trying again."); + Settings.ForceNotInterleaved = TRUE; + Settings.ForceInterleaved = FALSE; + retry_count++; + goto again; + } + } + } + + if(CMemory_ExtendedFormat==SMALLFIRST) + Tales=TRUE; + + CMemory_FreeSDD1Data (); + CMemory_InitROM (Tales); + S9xLoadCheatFile (S9xGetFilename(".cht")); + S9xInitCheatData (); + S9xApplyCheats (); + + S9xReset (); + + return (TRUE); +} + +uint32 CMemory_FileLoader (uint8* buffer, const char* filename, int32 maxsize) +{ + + + STREAM ROMFile; + int32 TotalFileSize = 0; + int len = 0; + int nFormat=FILE_DEFAULT; + + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char fname [_MAX_PATH + 1]; + + unsigned long FileSize = 0; + +#ifdef UNZIP_SUPPORT + unzFile file=NULL; +#endif + + _splitpath (filename, drive, dir, name, ext); + _makepath (fname, drive, dir, name, ext); + +#if defined(__WIN32__) || defined(__MACOSX__) + memmove (&ext [0], &ext[1], 4); +#endif + + if (strcasecmp (ext, "zip") == 0) + nFormat = FILE_ZIP; + else if (strcasecmp (ext, "rar") == 0) + nFormat = FILE_RAR; + else if (strcasecmp (ext, "jma") == 0) + nFormat = FILE_JMA; + else + nFormat = FILE_DEFAULT; + + + switch( nFormat ) + { + case FILE_ZIP: + +#ifdef UNZIP_SUPPORT + + file = unzOpen(fname); + + if(file != NULL) + { + + // its a valid ZIP, close it and let LoadZIP handle it. + + unzClose(file); + + if (!LoadZip (fname, &TotalFileSize, &CMemory_HeaderCount, CMemory_ROM)) + return (0); + + strcpy (CMemory_ROMFilename, fname); + + } + else + { + // its a bad zip file. Walk away + + S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Invalid Zip Archive."); + return (0); + } +#else + S9xMessage (S9X_ERROR, S9X_ROM_INFO, "This binary was not created with Zip support."); + return (0); +#endif + break; + + case FILE_JMA: + { +#ifdef JMA_SUPPORT + size_t FileSize = load_jma_file(fname, ROM); + + if (!FileSize) + { + S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Invalid JMA."); + return (0); + } + + TotalFileSize = FileSize; + CMemory_HeaderCount = 0; + + size_t calc_size = (FileSize / 0x2000) * 0x2000; + + + if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) || + Settings.ForceHeader) + { + memmove (ROM, ROM + 512, calc_size); + CMemory_HeaderCount = 1; + FileSize -= 512; + } + + strcpy (ROMFilename, fname); +#else + S9xMessage (S9X_ERROR, S9X_ROM_INFO, "This binary was not created with JMA support."); + return (0); +#endif + break; + } + + case FILE_RAR: + // non existant rar loading + S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Rar Archives are not currently supported."); + return (0); + break; + + case FILE_DEFAULT: + default: + // any other roms go here + + if ((ROMFile = OPEN_STREAM (fname, "rb")) == NULL) + return (0); + + strcpy (CMemory_ROMFilename, fname); + + CMemory_HeaderCount = 0; + uint8 *ptr = buffer; + bool8 more = FALSE; + + do + { + FileSize = READ_STREAM (ptr, maxsize + 0x200 - (ptr - CMemory_ROM), ROMFile); + CLOSE_STREAM (ROMFile); + + int calc_size = (FileSize / 0x2000) * 0x2000; + + if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) || + Settings.ForceHeader) + { + memmove (ptr, ptr + 512, calc_size); + CMemory_HeaderCount++; + FileSize -= 512; + } + + ptr += FileSize; + TotalFileSize += FileSize; + + + // check for multi file roms + + if (ptr - CMemory_ROM < maxsize + 0x200 && + (isdigit (ext [0]) && ext [1] == 0 && ext [0] < '9')) + { + more = TRUE; + ext [0]++; +#if defined(__WIN32__) || defined(__MACOSX__) + memmove (&ext [1], &ext [0], 4); + ext [0] = '.'; +#endif + _makepath (fname, drive, dir, name, ext); + } + else if (ptr - CMemory_ROM < maxsize + 0x200 && + (((len = strlen (name)) == 7 || len == 8) && + strncasecmp (name, "sf", 2) == 0 && + isdigit (name [2]) && isdigit (name [3]) && isdigit (name [4]) && + isdigit (name [5]) && isalpha (name [len - 1]))) + { + more = TRUE; + name [len - 1]++; +#if defined(__WIN32__) || defined(__MACOSX__) + memmove (&ext [1], &ext [0], 4); + ext [0] = '.'; +#endif + _makepath (fname, drive, dir, name, ext); + } + else + more = FALSE; + + } while (more && (ROMFile = OPEN_STREAM (fname, "rb")) != NULL); + + break; + } + + + + if (CMemory_HeaderCount == 0) + S9xMessage (S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found."); + else + { + if (CMemory_HeaderCount == 1) + S9xMessage (S9X_INFO, S9X_HEADERS_INFO, + "Found ROM file header (and ignored it)."); + else + S9xMessage (S9X_INFO, S9X_HEADERS_INFO, + "Found multiple ROM file headers (and ignored them)."); + } + + + return TotalFileSize; + +} + +#if 0 +/**********************************************************************************************/ +/* LoadMulti() */ +/* This function loads a Slotted SNES-Backup image and fills the slot. */ +/**********************************************************************************************/ + +bool8 CMemory_LoadMulti (const char *basename, const char *slot1name, const char *slot2name) +{ + unsigned long FileSize = 0; + + if(*basename=='\0') + return FALSE; + + SufamiTurbo=TRUE; + + int32 offset; + + memset (&SNESGameFixes, 0, sizeof(SNESGameFixes)); + SNESGameFixes.SRAMInitialValue = 0x60; + + memset (bytes0x2000, 0, 0x2000); + + CMemory_CalculatedSize = 0; + + Settings.DisplayColor=0xffff; + SET_UI_COLOR(255,255,255); + + int32 TotalFileSize = CMemory_FileLoader(ROM, basename, MAX_ROM_SIZE); + + if(0== TotalFileSize) + return FALSE; + else CheckForIPSPatch (basename, CMemory_HeaderCount != 0, TotalFileSize); + + CMemory_CalculatedSize=TotalFileSize; + + for(offset=0; offset0x100000||size <0x80000) + return FALSE; + //probably a minicart + return TRUE; + } + return FALSE; +} + +bool8 SameGameSig(uint8* file, int32 size) +{ + //preheader sig + if(strcmp((char*)(file+0xFFA0),"1995/12/16 10:2018ZS5J")) + return FALSE; + if(size!=0x100000) + return FALSE; + if(0x133E1C5B==caCRC32(file, size,0xFFFFFFFF)) + return TRUE; + return FALSE; +} +bool8 GNextSig(uint8* file, int32 size) +{ + //preheader sig + if(strcmp((char*)(file+0xFFAA),"GNEXT B2ZX3J")) + return FALSE; + if(size!=0x180000) + return FALSE; + if(0x845E420D==caCRC32(file, size,0xFFFFFFFF)) + return TRUE; + return FALSE; +} +int MultiType(uint8* file, int32 size) +{ + //check for ST signiture + if(SufamiTurboBIOSSig(file, size)) + return 1; + //check for Same Game signiture + if(SameGameSig(file, size)) + return 2; + //check for G-Next signiture + if(GNextSig(file, size)) + return 3; + return 0; +} + +#endif + +//compatibility wrapper +void S9xDeinterleaveMode2 () +{ + S9xDeinterleaveType2(TRUE); +} + +void S9xDeinterleaveType2 (bool8 reset) +{ + if(Settings.DisplayColor==0xffff||Settings.DisplayColor==BUILD_PIXEL(0,31,0)) + { + Settings.DisplayColor=BUILD_PIXEL(31,14,6); + SET_UI_COLOR(255,119,25); + + } + S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO, + "ROM image is in interleaved format - converting..."); + + int nblocks = CMemory_CalculatedSize >> 16; + int step = 64; + + while (nblocks <= step) + step >>= 1; + + nblocks = step; + uint8 blocks [256]; + int i; + + for (i = 0; i < nblocks * 2; i++) + { + blocks [i] = (i & ~0xF) | ((i & 3) << 2) | + ((i & 12) >> 2); + } + + uint8 *tmp = (uint8 *) malloc (0x10000); + + if (tmp) + { + for (i = 0; i < nblocks * 2; i++) + { + int j; + for (j = i; j < nblocks * 2; j++) + { + if (blocks [j] == i) + { + memmove (tmp, &CMemory_ROM [blocks [j] * 0x10000], 0x10000); + memmove (&CMemory_ROM [blocks [j] * 0x10000], + &CMemory_ROM [blocks [i] * 0x10000], 0x10000); + memmove (&CMemory_ROM [blocks [i] * 0x10000], tmp, 0x10000); + uint8 b = blocks [j]; + blocks [j] = blocks [i]; + blocks [i] = b; + break; + } + } + } + free ((char *) tmp); + tmp=NULL; + } + if(reset) + { + CMemory_InitROM (FALSE); + S9xReset (); + } +} + +//CRC32 for char arrays +static __inline__ uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32) +{ + register uint32 i; + for (i = 0; i < size; i++) + { + crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ array[i]) & 0xFF]; + } + return ~crc32; +} + +void CMemory_InitROM (bool8 Interleaved) +{ +#ifndef ZSNES_FX + SuperFX.nRomBanks = CMemory_CalculatedSize >> 15; +#endif + Settings.MultiPlayer5Master = Settings.MultiPlayer5; + Settings.MouseMaster = Settings.Mouse; + Settings.SuperScopeMaster = Settings.SuperScope; + Settings.DSP1Master = Settings.ForceDSP1; + Settings.SuperFX = FALSE; + Settings.SA1 = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + Settings.SRTC = FALSE; + Settings.SPC7110=FALSE; + Settings.SPC7110RTC=FALSE; + Settings.BS=FALSE; + Settings.OBC1=FALSE; + Settings.SETA=FALSE; + s7r.DataRomSize = 0; + CMemory_CalculatedChecksum=0; + uint8* RomHeader; + + RomHeader=CMemory_ROM+0x7FB0; + + if(CMemory_ExtendedFormat==BIGFIRST) + RomHeader+=0x400000; + + if(CMemory_HiROM) + RomHeader+=0x8000; + +// if(!Settings.BS) + { + Settings.BS=(-1!=is_bsx(CMemory_ROM+0x7FC0)); + + if(Settings.BS) + { + CMemory_LoROM=TRUE; + CMemory_HiROM=FALSE; + } + + else + { + Settings.BS=(-1!=is_bsx(CMemory_ROM+0xFFC0)); + if(Settings.BS) + { + CMemory_HiROM=TRUE; + CMemory_LoROM=FALSE; + } + } + } + + ZeroMemory (CMemory_BlockIsRAM, MEMMAP_NUM_BLOCKS); + ZeroMemory (CMemory_BlockIsROM, MEMMAP_NUM_BLOCKS); + + memset (CMemory_ROMId, 0, 5); + memset (CMemory_CompanyId, 0, 3); + + CMemory_ParseSNESHeader(RomHeader); + + // Try to auto-detect the DSP1 chip + if (!Settings.ForceNoDSP1 && + (CMemory_ROMType & 0xf) >= 3 && (CMemory_ROMType & 0xf0) == 0) + Settings.DSP1Master = TRUE; + + if (CMemory_HiROM) + { +// Settings.C4 = Settings.ForceC4; + // Enable S-RTC (Real Time Clock) emulation for Dai Kaijyu Monogatari 2 + Settings.SRTC = ((CMemory_ROMType & 0xf0) >> 4) == 5; + + if(((CMemory_ROMSpeed&0x0F)==0x0A)&&((CMemory_ROMType&0xF0)==0xF0)) + { + Settings.SPC7110=TRUE; + if((CMemory_ROMType&0x0F)==0x09) + Settings.SPC7110RTC=TRUE; + } + + if (Settings.BS) + CMemory_BSHiROMMap (); + else if(Settings.SPC7110) + { + CMemory_SPC7110HiROMMap(); + } + else if ((CMemory_ROMSpeed & ~0x10) == 0x25) + { + CMemory_TalesROMMap (Interleaved); + } + else CMemory_HiROMMap (); + } + else + { + Settings.SuperFX = Settings.ForceSuperFX; + + if(CMemory_ROMType==0x25) + { + Settings.OBC1=TRUE; + } + + //BS-X BIOS + if(CMemory_ROMType==0xE5) + { + Settings.BS=TRUE; + } + + if ((CMemory_ROMType & 0xf0) == 0x10) + Settings.SuperFX = !Settings.ForceNoSuperFX; + + Settings.SDD1 = Settings.ForceSDD1; + if ((CMemory_ROMType & 0xf0) == 0x40) + Settings.SDD1 = !Settings.ForceNoSDD1; + + if (Settings.SDD1) + S9xLoadSDD1Data (); + + if(((CMemory_ROMType &0xF0) == 0xF0)&((CMemory_ROMSpeed&0x0F)!=5)) + { + CMemory_SRAMSize=2; + SNESGameFixes.SRAMInitialValue = 0x00; + if((CMemory_ROMType &0x0F)==6) + { + if(CMemory_ROM[0x7FD7]==0x09) + { + Settings.SETA=ST_011; + SetSETA=&S9xSetST011; + GetSETA=&S9xGetST011; + } + else + { + Settings.SETA=ST_010; + SetSETA=&S9xSetST010; + GetSETA=&S9xGetST010; + } + } + else + { + Settings.SETA=ST_018; + CMemory_SRAMSize=2; + } + } + Settings.C4 = Settings.ForceC4; + if ((CMemory_ROMType & 0xf0) == 0xf0 && + (strncmp (CMemory_ROMName, "MEGAMAN X", 9) == 0 || + strncmp (CMemory_ROMName, "ROCKMAN X", 9) == 0)) + { + Settings.C4 = !Settings.ForceNoC4; + } + + if(Settings.SETA&&Settings.SETA!=ST_018) + { + CMemory_SetaDSPMap(); + } + else if (Settings.SuperFX) + { + //CMemory_SRAM = CMemory_ROM + 1024 * 1024 * 4; + CMemory_SuperFXROMMap (); + Settings.MultiPlayer5Master = FALSE; + //Settings.MouseMaster = FALSE; + //Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + Settings.SA1 = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + } + else if (Settings.ForceSA1 || + (!Settings.ForceNoSA1 && (CMemory_ROMSpeed & ~0x10) == 0x23 && + (CMemory_ROMType & 0xf) > 3 && (CMemory_ROMType & 0xf0) == 0x30)) + { + Settings.SA1 = TRUE; +// Settings.MultiPlayer5Master = FALSE; + //Settings.MouseMaster = FALSE; + //Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + Settings.C4 = FALSE; + Settings.SDD1 = FALSE; + CMemory_SA1ROMMap (); + } + else if ((CMemory_ROMSpeed & ~0x10) == 0x25) + CMemory_TalesROMMap (Interleaved); + else if(CMemory_ExtendedFormat!=NOPE) + CMemory_JumboLoROMMap(Interleaved); + else if (strncmp ((char *) &CMemory_ROM [0x7fc0], "SOUND NOVEL-TCOOL", 17) == 0 || + strncmp ((char *) &CMemory_ROM [0x7fc0], "DERBY STALLION 96", 17) == 0) + { + CMemory_LoROM24MBSMap (); + Settings.DSP1Master = FALSE; + } + + else if (strncmp ((char *) &CMemory_ROM [0x7fc0], "THOROUGHBRED BREEDER3", 21) == 0 || + strncmp ((char *) &CMemory_ROM [0x7fc0], "RPG-TCOOL 2", 11) == 0) + { + CMemory_SRAM512KLoROMMap (); + Settings.DSP1Master = FALSE; + } + else if (strncmp ((char *) &CMemory_ROM [0x7fc0], "ADD-ON BASE CASSETE", 19) == 0) + { + Settings.MultiPlayer5Master = FALSE; + Settings.MouseMaster = FALSE; + Settings.SuperScopeMaster = FALSE; + Settings.DSP1Master = FALSE; + CMemory_SufamiTurboLoROMMap(); + CMemory_SRAMSize = 3; + } + else if ((CMemory_ROMSpeed & ~0x10) == 0x22 && + strncmp (CMemory_ROMName, "Super Street Fighter", 20) != 0) + { + CMemory_AlphaROMMap (); + } + else if (Settings.BS) + CMemory_BSLoROMMap(); + else CMemory_LoROMMap (); + } + + if(Settings.BS) + { + CMemory_ROMRegion=0; + } + + uint32 sum1 = 0; + uint32 sum2 = 0; + if(0==CMemory_CalculatedChecksum) + { + int power2 = 0; + int size = CMemory_CalculatedSize; + + while (size >>= 1) + power2++; + + size = 1 << power2; + uint32 remainder = CMemory_CalculatedSize - size; + + + int i; + + for (i = 0; i < size; i++) + sum1 += CMemory_ROM [i]; + + for (i = 0; i < (int) remainder; i++) + sum2 += CMemory_ROM [size + i]; + + int sub = 0; + if (Settings.BS&& CMemory_ROMType!=0xE5) + { + if (CMemory_HiROM) + { + for (i = 0; i < 48; i++) + sub += CMemory_ROM[0xffb0 + i]; + } + else if (CMemory_LoROM) + { + for (i = 0; i < 48; i++) + sub += CMemory_ROM[0x7fb0 + i]; + } + sum1 -= sub; + } + + + if (remainder) + { + sum1 += sum2 * (size / remainder); + } + + + sum1 &= 0xffff; + CMemory_CalculatedChecksum=sum1; + } + //now take a CRC32 + CMemory_ROMCRC32 = caCRC32(CMemory_ROM, CMemory_CalculatedSize,0xFFFFFFFF); + + if (Settings.ForceNTSC) + Settings.PAL = FALSE; + else if (Settings.ForcePAL) + Settings.PAL = TRUE; + else + { + //Korea refers to South Korea, which uses NTSC + switch(CMemory_ROMRegion) + { + case 13: + case 1: + case 0: + Settings.PAL=FALSE; + break; + default: Settings.PAL=TRUE; + break; + } + } + if (Settings.PAL) + { + snes4all_max_vcounter=SNES_MAX_PAL_VCOUNTER; + Settings.FrameTime = Settings.FrameTimePAL; + CMemory_ROMFramesPerSecond = 50; + } + else + { + snes4all_max_vcounter=SNES_MAX_NTSC_VCOUNTER; + Settings.FrameTime = Settings.FrameTimeNTSC; + CMemory_ROMFramesPerSecond = 60; + } + + CMemory_ROMName[ROM_NAME_LEN - 1] = 0; + if (strlen (CMemory_ROMName)) + { + char *p = CMemory_ROMName + strlen (CMemory_ROMName) - 1; + + while (p > CMemory_ROMName && *(p - 1) == ' ') + p--; + *p = 0; + } + + { + CMemory_SRAMMask = CMemory_SRAMSize ? + ((1 << (CMemory_SRAMSize + 3)) * 128) - 1 : 0; + } + if((CMemory_ROMChecksum + CMemory_ROMComplementChecksum != 0xffff) || CMemory_ROMChecksum != CMemory_CalculatedChecksum || ((uint32)CMemory_CalculatedSize > (uint32)(((1<<(CMemory_ROMSize-7))*128)*1024))) + { + if(Settings.DisplayColor==0xffff || Settings.DisplayColor!=BUILD_PIXEL(31,0,0)) + { + Settings.DisplayColor=BUILD_PIXEL(31,31,0); + SET_UI_COLOR(255,255,0); + } + } + + IAPU.OneCycle = ONE_APU_CYCLE; + Settings.Shutdown = Settings.ShutdownMaster; + +#ifndef USE_OLD_DSP1 + SetDSP=&DSP1SetByte; + GetDSP=&DSP1GetByte; +#endif + + CMemory_ResetSpeedMap(); + CMemory_ApplyROMFixes (); + sprintf (CMemory_ROMName, "%s", CMemory_Safe (CMemory_ROMName)); + sprintf (CMemory_ROMId, "%s", CMemory_Safe (CMemory_ROMId)); + sprintf (CMemory_CompanyId, "%s", CMemory_Safe (CMemory_CompanyId)); + + sprintf (String, "\"%s\" [%s] %s, %s, Type: %s, Mode: %s, TV: %s, S-RAM: %s, ROMId: %s Company: %2.2s CRC32: %08X", + CMemory_ROMName, + (CMemory_ROMChecksum + CMemory_ROMComplementChecksum != 0xffff || + CMemory_ROMChecksum != CMemory_CalculatedChecksum) ? "bad checksum" : "checksum ok", + CMemory_MapType (), + CMemory_Size (), + CMemory_KartContents (), + CMemory_MapMode (), + CMemory_TVStandard (), + CMemory_StaticRAMSize (), + CMemory_ROMId, + CMemory_CompanyId, + CMemory_ROMCRC32); + + S9xMessage (S9X_INFO, S9X_ROM_INFO, String); +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_ROM_INFO, MF_ENABLED); + #endif + #ifdef RTC_DEBUGGER + if(Settings.SPC7110RTC) + EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_ENABLED); + else EnableMenuItem(GUI.hMenu, IDM_7110_RTC, MF_GRAYED); + #endif +#endif + Settings.ForceHeader = Settings.ForceHiROM = Settings.ForceLoROM = + Settings.ForceInterleaved = Settings.ForceNoHeader = Settings.ForceNotInterleaved = + Settings.ForceInterleaved2=FALSE; +} + +bool8 CMemory_LoadSRAM (const char *filename) +{ + int size = CMemory_SRAMSize ? + (1 << (CMemory_SRAMSize + 3)) * 128 : 0; + + memset (CMemory_SRAM, SNESGameFixes.SRAMInitialValue, 0x20000); + + if (size > 0x20000) + size = 0x20000; + + if (size) + { + extern int snes4all_autosave; + if (snes4all_autosave) + { + FILE *file; + if ((file = fopen (filename, "rb"))) + { + int len = fread ((char*) CMemory_SRAM, 1, 0x20000, file); + fclose (file); + if (len - size == 512) + { + // S-RAM file has a header - remove it + memmove (CMemory_SRAM, CMemory_SRAM + 512, size); + } + if (len == size + SRTC_SRAM_PAD) + { + S9xSRTCPostLoadState (); + S9xResetSRTC (); + rtc.index = -1; + rtc.mode = MODE_READ; + } + else + S9xHardResetSRTC (); + + if(Settings.SPC7110RTC) + { + S9xLoadSPC7110RTC (&rtc_f9); + } + +#ifndef USE_GL + sprintf(String, "Loaded %s", S9xBasename (filename)); + S9xMessage (S9X_INFO, S9X_FREEZE_FILE_INFO, String); +#endif + return (TRUE); + } + } + S9xHardResetSRTC (); + return (FALSE); + } + if (Settings.SDD1) + S9xSDD1LoadLoggedData (); + + return (TRUE); +} + +bool8 CMemory_SaveSRAM (const char *filename) +{ + if(Settings.SuperFX && CMemory_ROMType < 0x15) + return TRUE; + if(Settings.SA1 && CMemory_ROMType == 0x34) + return TRUE; + + int size = CMemory_SRAMSize ? + (1 << (CMemory_SRAMSize + 3)) * 128 : 0; + if (Settings.SRTC) + { + size += SRTC_SRAM_PAD; + S9xSRTCPreSaveState (); + } + + if (Settings.SDD1) + S9xSDD1SaveLoggedData (); + + if (size > 0x20000) + size = 0x20000; + + if (size && *CMemory_ROMFilename) + { + extern int snes4all_autosave; + if (snes4all_autosave) + { + FILE *file; + if ((file = fopen (filename, "wb"))) + { + fwrite ((char *) CMemory_SRAM, size, 1, file); + fclose (file); +#if defined(__linux) + chown (filename, getuid (), getgid ()); +#endif + if(Settings.SPC7110RTC) + { + S9xSaveSPC7110RTC (&rtc_f9); + } +#ifndef USE_GL + sprintf(String, "Saved %s", S9xBasename (filename)); + S9xMessage (S9X_INFO, S9X_FREEZE_FILE_INFO, String); +#endif + return (TRUE); + } + } + } + return (FALSE); +} + +void CMemory_FixROMSpeed () +{ + int c; + + if(CPU.FastROMSpeed==0) + CPU.FastROMSpeed=SLOW_ONE_CYCLE; + + + for (c = 0x800; c < 0x1000; c++) + { + if (c&0x8 || c&0x400) + CMemory_MemorySpeed [c] = (uint8) CPU.FastROMSpeed; + } +} + + +void CMemory_ResetSpeedMap() +{ + int i; + memset(CMemory_MemorySpeed, SLOW_ONE_CYCLE, 0x1000); + for(i=0;i<0x400;i+=0x10) + { + CMemory_MemorySpeed[i+2]=CMemory_MemorySpeed[0x800+i+2]= ONE_CYCLE; + CMemory_MemorySpeed[i+3]=CMemory_MemorySpeed[0x800+i+3]= ONE_CYCLE; + CMemory_MemorySpeed[i+4]=CMemory_MemorySpeed[0x800+i+4]= ONE_CYCLE; + CMemory_MemorySpeed[i+5]=CMemory_MemorySpeed[0x800+i+5]= ONE_CYCLE; + } + CMemory_FixROMSpeed (); +} + +void CMemory_WriteProtectROM () +{ + memmove ((void *) CMemory_WriteMap, (void *) CMemory_Map, sizeof (CMemory_Map)); + int c; + for (c = 0; c < 0x1000; c++) + { + if (CMemory_BlockIsROM [c]) + CMemory_WriteMap [c] = (uint8 *) CMemory_MAP_NONE; + } +} + +void CMemory_MapRAM () +{ + int c; + + if(CMemory_LoROM&&!Settings.SDD1) + { + // Banks 70->77, S-RAM + for (c = 0; c < 0x0f; c++) + { + int i; + for(i=0;i<8;i++) + { + CMemory_Map [(c<<4) + 0xF00+i]=CMemory_Map [(c<<4) + 0x700+i] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [(c<<4) + 0xF00+i] =CMemory_BlockIsRAM [(c<<4) + 0x700+i] = TRUE; + CMemory_BlockIsROM [(c<<4) + 0xF00+i] =CMemory_BlockIsROM [(c<<4) + 0x700+i] = FALSE; + } + } + } + else if(CMemory_LoROM&&Settings.SDD1) + { + // Banks 70->77, S-RAM + for (c = 0; c < 0x0f; c++) + { + int i; + for(i=0;i<8;i++) + { + CMemory_Map [(c<<4) + 0x700+i] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [(c<<4) + 0x700+i] = TRUE; + CMemory_BlockIsROM [(c<<4) + 0x700+i] = FALSE; + } + } + } + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = CMemory_RAM; + CMemory_Map [c + 0x7f0] = CMemory_RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + CMemory_WriteProtectROM (); +} + +void CMemory_MapExtraRAM () +{ + int c; + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = CMemory_RAM; + CMemory_Map [c + 0x7f0] = CMemory_RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + + // Banks 70->73, S-RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x700] = CMemory_SRAM; + CMemory_Map [c + 0x710] = CMemory_SRAM + 0x8000; + CMemory_Map [c + 0x720] = CMemory_SRAM + 0x10000; + CMemory_Map [c + 0x730] = CMemory_SRAM + 0x18000; + + CMemory_BlockIsRAM [c + 0x700] = TRUE; + CMemory_BlockIsROM [c + 0x700] = FALSE; + CMemory_BlockIsRAM [c + 0x710] = TRUE; + CMemory_BlockIsROM [c + 0x710] = FALSE; + CMemory_BlockIsRAM [c + 0x720] = TRUE; + CMemory_BlockIsROM [c + 0x720] = FALSE; + CMemory_BlockIsRAM [c + 0x730] = TRUE; + CMemory_BlockIsROM [c + 0x730] = FALSE; + } +} + +void CMemory_LoROMMap () +{ + int c; + int i; + int j; + int mask[4]; + for (j=0; j<4; j++) + mask[j]=0x00ff; + + mask[0]=(CMemory_CalculatedSize/0x8000)-1; + + int x; + bool8 foundZeros; + bool8 pastZeros; + + for(j=0;j<3;j++) + { + x=1; + foundZeros=FALSE; + pastZeros=FALSE; + + mask[j+1]=mask[j]; + + while (x>0x100&&!pastZeros) + { + if(mask[j]&x) + { + x<<=1; + if(foundZeros) + pastZeros=TRUE; + } + else + { + foundZeros=TRUE; + pastZeros=FALSE; + mask[j+1]|=x; + x<<=1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + if(Settings.SETA==ST_018) + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_SETA_RISC; + else CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + if (Settings.DSP1Master) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_DSP; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_DSP; + } + else if (Settings.C4) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_C4; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_C4; + } + else if(Settings.OBC1) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_OBC_RAM; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_OBC_RAM; + } + else + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; + } + + for (i = c + 8; i < c + 16; i++) + { + int e=3; + int d=c>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + CMemory_Map [i] = CMemory_Map [i + 0x800] = CMemory_ROM + (((d)-1)*0x8000); + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + if (Settings.DSP1Master) + { + // Banks 30->3f and b0->bf + for (c = 0x300; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = (uint8 *) CMemory_MAP_DSP; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = FALSE; + } + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) % CMemory_CalculatedSize]; + + for (i = c + 8; i < c + 16; i++) + { + int e=3; + int d=(c+0x400)>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = CMemory_ROM + (((d)-1)*0x8000); + } + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + if (Settings.DSP1Master) + { + for (c = 0; c < 0x100; c++) + { + CMemory_Map [c + 0xe00] = (uint8 *) CMemory_MAP_DSP; + CMemory_BlockIsROM [c + 0xe00] = FALSE; + } + } + + int sum=0, k,l, bankcount; + bankcount=1<<(CMemory_ROMSize-7);//Mbits + + //safety for corrupt headers + if(bankcount > 128) + bankcount = (CMemory_CalculatedSize/0x8000)/4; + bankcount*=4;//to banks + bankcount<<=4;//Map banks + bankcount+=0x800;//normalize + for(k=0x800;k<(bankcount);k+=16) + { + uint8* bank=0x8000+CMemory_Map[k+8]; + for(l=0;l<0x8000;l++) + sum+=bank[l]; + } + CMemory_CalculatedChecksum=sum&0xFFFF; + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_SetaDSPMap () +{ + int c; + int i; + int j; + int mask[4]; + for (j=0; j<4; j++) + mask[j]=0x00ff; + + mask[0]=(CMemory_CalculatedSize/0x8000)-1; + + int x; + bool8 foundZeros; + bool8 pastZeros; + + for(j=0;j<3;j++) + { + x=1; + foundZeros=FALSE; + pastZeros=FALSE; + + mask[j+1]=mask[j]; + + while (x>0x100&&!pastZeros) + { + if(mask[j]&x) + { + x<<=1; + if(foundZeros) + pastZeros=TRUE; + } + else + { + foundZeros=TRUE; + pastZeros=FALSE; + mask[j+1]|=x; + x<<=1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; + + for (i = c + 8; i < c + 16; i++) + { + int e=3; + int d=c>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + CMemory_Map [i] = CMemory_Map [i + 0x800] = CMemory_ROM + (((d)-1)*0x8000); + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + int e=3; + int d=(c+0x400)>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = CMemory_ROM + (((d)-1)*0x8000); + } + + //only upper half is ROM + for (i = c+8; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + memset(CMemory_SRAM, 0, 0x1000); + for (c=0x600;c<0x680;c+=0x10) + { + for(i=0;i<0x08;i++) + { + //where does the SETA chip access, anyway? + //please confirm this? + CMemory_Map[c+0x80+i]=(uint8*)CMemory_MAP_SETA_DSP; + CMemory_BlockIsROM [c+0x80+i] = FALSE; + CMemory_BlockIsRAM [c+0x80+i] = TRUE; + } + + for(i=0;i<0x04;i++) + { + //and this! + CMemory_Map[c+i]=(uint8*)CMemory_MAP_SETA_DSP; + CMemory_BlockIsROM [c+i] = FALSE; + } + } + + int sum=0, k,l, bankcount; + bankcount=1<<(CMemory_ROMSize-7);//Mbits + //safety for corrupt headers + if(bankcount > 128) + bankcount = (CMemory_CalculatedSize/0x8000)/4; + bankcount*=4;//to banks + bankcount<<=4;//Map banks + bankcount+=0x800;//normalize + for(k=0x800;k<(bankcount);k+=16) + { + uint8* bank=0x8000+CMemory_Map[k+8]; + for(l=0;l<0x8000;l++) + sum+=bank[l]; + } + CMemory_CalculatedChecksum=sum&0xFFFF; + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_BSLoROMMap () +{ + int c; + int i; + + if(Settings.BS) + CMemory_SRAMSize=5; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_SRAM; +CMemory_BlockIsRAM [c + 5] = CMemory_BlockIsRAM [c + 0x805] = TRUE; + +// CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *)CMemory_MAP_NONE; +// CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *)CMemory_MAP_NONE; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_SRAM; +CMemory_BlockIsRAM [c + 6] = CMemory_BlockIsRAM [c + 0x806] = TRUE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_SRAM; +CMemory_BlockIsRAM [c + 7] = CMemory_BlockIsRAM [c + 0x807] = TRUE; + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [(c << 11) % CMemory_CalculatedSize] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + for(c=0;c<8;c++) + { + CMemory_Map[(c<<4)+0x105]=(uint8*)CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsROM [(c<<4)+0x105] = FALSE; + CMemory_BlockIsRAM [(c<<4)+0x105] = TRUE; + } + + + /* // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &ROM [(c << 11) % CMemory_CalculatedSize]; + + for (i = c + 8; i < c + 16; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &ROM [((c << 11) + 0x200000) % CMemory_CalculatedSize - 0x8000]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + */ + for(c=1;c<=4;c++) + { + for(i=0;i<16; i++) + { + CMemory_Map[0x400+i+(c<<4)]=(uint8*)CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM[0x400+i+(c<<4)]=TRUE; + CMemory_BlockIsROM[0x400+i+(c<<4)]=FALSE; + } + } + + for(i=0;i<0x80;i++) + { + CMemory_Map[0x700+i]=&CMemory_BSRAM[0x10000*(i/16)]; + CMemory_BlockIsRAM[0x700+i]=TRUE; + CMemory_BlockIsROM[0x700+i]=FALSE; + } + for (i=0; i<8;i++) + { + CMemory_Map[0x205+(i<<4)]=CMemory_Map[0x285+(i<<4)]=CMemory_Map[0x305+(i<<4)]=CMemory_Map[0x385+(i<<4)]=CMemory_Map[0x705+(i<<4)]; + CMemory_BlockIsRAM[0x205+(i<<4)]=CMemory_BlockIsRAM[0x285+(i<<4)]=CMemory_BlockIsRAM[0x305+(i<<4)]=CMemory_BlockIsRAM[0x385+(i<<4)]=TRUE; + CMemory_BlockIsROM[0x205+(i<<4)]=CMemory_BlockIsROM[0x285+(i<<4)]=CMemory_BlockIsROM[0x305+(i<<4)]=CMemory_BlockIsROM[0x385+(i<<4)]=FALSE; + } + for(c=0;c<8;c++) + { + CMemory_Map[(c<<4)+0x005]=CMemory_BSRAM-0x5000; + CMemory_BlockIsROM [(c<<4)+0x005] = FALSE; + CMemory_BlockIsRAM [(c<<4)+0x005] = TRUE; + } + CMemory_MapRAM (); + CMemory_WriteProtectROM (); + + +} + +void CMemory_HiROMMap () +{ + int i; + int c; + int j; + + int mask[4]; + for (j=0; j<4; j++) + mask[j]=0x00ff; + + mask[0]=(CMemory_CalculatedSize/0x10000)-1; + + if (Settings.ForceSA1 || + (!Settings.ForceNoSA1 && (CMemory_ROMSpeed & ~0x10) == 0x23 && + (CMemory_ROMType & 0xf) > 3 && (CMemory_ROMType & 0xf0) == 0x30)) + { + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + } + + + int x; + bool8 foundZeros; + bool8 pastZeros; + + for(j=0;j<3;j++) + { + x=1; + foundZeros=FALSE; + pastZeros=FALSE; + + mask[j+1]=mask[j]; + + while (x>0x100&&!pastZeros) + { + if(mask[j]&x) + { + x<<=1; + if(foundZeros) + pastZeros=TRUE; + } + else + { + foundZeros=TRUE; + pastZeros=FALSE; + mask[j+1]|=x; + x<<=1; + } + } + } + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + + if (Settings.DSP1Master) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_DSP; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_DSP; + } + else + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + } + + for (i = c + 8; i < c + 16; i++) + { + int e=3; + int d=c>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + CMemory_Map [i] = CMemory_Map [i + 0x800] = CMemory_ROM + (d*0x10000); + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + CMemory_Map [0x306 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0x307 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0xb06 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0xb07 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_BlockIsRAM [0x306 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0x307 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0xb06 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0xb07 + (c << 4)] = TRUE; + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + int e=3; + int d=(c)>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = CMemory_ROM + (d*0x10000); + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + int bankmax=0x40+ (1<<(CMemory_ROMSize-6)); + //safety for corrupt headers + if(bankmax > 128) + bankmax = 0x80; + int sum=0; + for(i=0x40;i3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + + //makes more sense to map the range here. + //ToP seems to use sram to skip intro??? + if(c>=0x300) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_BlockIsRAM [6 + c] = CMemory_BlockIsRAM [7 + c] = + CMemory_BlockIsRAM [0x806 + c]= CMemory_BlockIsRAM [0x807 + c] = TRUE; + } + else + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + } + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = &CMemory_ROM [((c << 12) % (CMemory_CalculatedSize-0x400000)) + OFFSET0]; + CMemory_Map [i + 0x800] = &CMemory_ROM [((c << 12) % 0x400000) + OFFSET2]; + CMemory_BlockIsROM [i] = TRUE; + CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + { + CMemory_Map [i + 0x400] = &CMemory_ROM [((c << 12) % (CMemory_CalculatedSize-0x400000)) + OFFSET1]; + CMemory_Map [i + 0x408] = &CMemory_ROM [((c << 12) % (CMemory_CalculatedSize-0x400000)) + OFFSET1]; + CMemory_Map [i + 0xc00] = &CMemory_ROM [((c << 12) %0x400000)+ OFFSET2]; + CMemory_Map [i + 0xc08] = &CMemory_ROM [((c << 12) % 0x400000) + OFFSET2]; + CMemory_BlockIsROM [i + 0x400] = TRUE; + CMemory_BlockIsROM [i + 0x408] = TRUE; + CMemory_BlockIsROM [i + 0xc00] = TRUE; + CMemory_BlockIsROM [i + 0xc08] = TRUE; + } + } + + if((strncmp("TALES",(char*)CMemory_Map[8]+0xFFC0, 5)==0)) + { + if(((*(CMemory_Map[8]+0xFFDE))==(*(CMemory_Map[0x808]+0xFFDE)))) + { + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + } + } + + CMemory_ROMChecksum = *(CMemory_Map[8]+0xFFDE) + (*(CMemory_Map[8]+0xFFDF) << 8); + CMemory_ROMComplementChecksum = *(CMemory_Map[8]+0xFFDC) + (*(CMemory_Map[8]+0xFFDD) << 8); + +int sum=0; +for(i=0x40;i<0x80; i++) +{ + uint8 * bank_low=(uint8*)CMemory_Map[i<<4]; + uint8 * bank_high=(uint8*)CMemory_Map[(i<<4)+0x800]; + for (c=0;c<0x10000; c++) + { + sum+=bank_low[c]; + sum+=bank_high[c]; + } +} + +CMemory_CalculatedChecksum=sum&0xFFFF; + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_AlphaROMMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = TRUE; + } + } + + // Banks 40->7f and c0->ff + + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0x400] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void DetectSuperFxRamSize() +{ + if(CMemory_ROM[0x7FDA]==0x33) + { + CMemory_SRAMSize=CMemory_ROM[0x7FBD]; + } + else + { + if(strncmp(CMemory_ROMName, "STAR FOX 2", 10)==0) + { + CMemory_SRAMSize=6; + } + else CMemory_SRAMSize=5; + } +} + +void CMemory_SuperFXROMMap () +{ + int c; + int i; + + DetectSuperFxRamSize(); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [0x006 + c] = CMemory_Map [0x806 + c] = (uint8 *) CMemory_SRAM - 0x6000; + CMemory_Map [0x007 + c] = CMemory_Map [0x807 + c] = (uint8 *) CMemory_SRAM - 0x6000; + CMemory_BlockIsRAM [0x006 + c] = CMemory_BlockIsRAM [0x007 + c] = CMemory_BlockIsRAM [0x806 + c] = CMemory_BlockIsRAM [0x807 + c] = TRUE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = CMemory_RAM; + CMemory_Map [c + 0x7f0] = CMemory_RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + + // Banks 70->71, S-RAM + for (c = 0; c < 32; c++) + { + CMemory_Map [c + 0x700] = CMemory_SRAM + (((c >> 4) & 1) << 16); + CMemory_BlockIsRAM [c + 0x700] = TRUE; + CMemory_BlockIsROM [c + 0x700] = FALSE; + } + + // Replicate the first 2Mb of the ROM at ROM + 2MB such that each 32K + // block is repeated twice in each 64K block. + for (c = 0; c < 64; c++) + { + memmove (&CMemory_ROM [0x200000 + c * 0x10000], &CMemory_ROM [c * 0x8000], 0x8000); + memmove (&CMemory_ROM [0x208000 + c * 0x10000], &CMemory_ROM [c * 0x8000], 0x8000); + } + + CMemory_WriteProtectROM (); +} + +void CMemory_SA1ROMMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) &CMemory_FillRAM [0x3000] - 0x3000; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM; + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + CMemory_Map [i + 0x400] = (uint8 *) &CMemory_SRAM [(c << 12) & 0x1ffff]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = FALSE; + } + } + + // c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = CMemory_RAM; + CMemory_Map [c + 0x7f0] = CMemory_RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + CMemory_WriteProtectROM (); + + // Now copy the map and correct it for the SA1 CPU. + memmove ((void *) SA1.WriteMap, (void *) CMemory_WriteMap, sizeof (CMemory_WriteMap)); + memmove ((void *) SA1.Map, (void *) CMemory_Map, sizeof (CMemory_Map)); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 0] = SA1.Map [c + 0x800] = &CMemory_FillRAM [0x3000]; + SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8 *) CMemory_MAP_NONE; + SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &CMemory_FillRAM [0x3000]; + SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8 *) CMemory_MAP_NONE; + } + + // Banks 60->6f + for (c = 0; c < 0x100; c++) + SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8 *) CMemory_MAP_BWRAM_BITMAP; + + CMemory_BWRAM = CMemory_SRAM; +} + +void CMemory_LoROM24MBSMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x200; c += 16) + { + CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000 + 0x200000; + CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + CMemory_MapExtraRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_SufamiTurboLoROMMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + if (Settings.DSP1Master) + { + for (c = 0; c < 0x100; c++) + { + CMemory_Map [c + 0xe00] = (uint8 *) CMemory_MAP_DSP; + CMemory_BlockIsROM [c + 0xe00] = FALSE; + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = CMemory_RAM; + CMemory_Map [c + 0x7f0] = CMemory_RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + + // Banks 60->67, S-RAM + for (c = 0; c < 0x80; c++) + { + CMemory_Map [c + 0x600] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [c + 0x600] = TRUE; + CMemory_BlockIsROM [c + 0x600] = FALSE; + } + + CMemory_WriteProtectROM (); +} + +#if 0 + +//untested!! +void CMemory_SameGameMap () +{ + int i; + int c; + int j; + + int mask[4]; + int mask2[4]; + for (j=0; j<4; j++) + mask[j]=mask2[j]=0x00ff; + + mask[0]=(CMemory_CalculatedSize/0x10000)-1; + mask2[0]=(Slot1Size/0x10000)-1; + + int x; + bool8 foundZeros; + bool8 pastZeros; + + for(j=0;j<3;j++) + { + x=1; + foundZeros=FALSE; + pastZeros=FALSE; + + mask[j+1]=mask[j]; + + while (x>0x100&&!pastZeros) + { + if(mask[j]&x) + { + x<<=1; + if(foundZeros) + pastZeros=TRUE; + } + else + { + foundZeros=TRUE; + pastZeros=FALSE; + mask[j+1]|=x; + x<<=1; + } + } + } + + for(j=0;j<3;j++) + { + x=1; + foundZeros=FALSE; + pastZeros=FALSE; + + mask2[j+1]=mask2[j]; + + while (x>0x100&&!pastZeros) + { + if(mask2[j]&x) + { + x<<=1; + if(foundZeros) + pastZeros=TRUE; + } + else + { + foundZeros=TRUE; + pastZeros=FALSE; + mask2[j+1]|=x; + x<<=1; + } + } + } + + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = RAM; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + CMemory_Map [0x306 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0x307 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0xb06 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0xb07 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_BlockIsRAM [0x306 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0x307 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0xb06 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0xb07 + (c << 4)] = TRUE; + } + + for c=0; c<0x200; c+=16) + { + for(i=0;i<8;i++) + { + int e=3; + int d=c>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + + int f=3; + int g=c>>4; + while(g>mask2[0]) + { + g&=mask2[f]; + f--; + } + + //stuff in HiROM areas + Map[c+0x400+i]=&ROM[d*0x10000]; + Map[c+0xC00+i]=&ROM[d*0x10000]; + //MINI + Map[c+0x600+i]=&ROMOffset1[g*0x10000]; + Map[c+0xE00+i]=&ROMOffset1[g*0x10000]; + + } + for(i=8;i<16;i++) + { + int e=3; + int d=c>>4; + while(d>mask[0]) + { + d&=mask[e]; + e--; + } + + int f=3; + int g=c>>4; + while(g>mask2[0]) + { + g&=mask2[f]; + f--; + } + + + //all stuff + //BASE + Map[c+i]=&ROM[d*0x10000]; + Map[c+0x800+i]=&ROM[d*0x10000]; + Map[c+0x400+i]=&ROM[d*0x10000]; + Map[c+0xC00+i]=&ROM[d*0x10000]; + //MINI + Map[c+0x200+i]=&ROMOffset1[g*0x10000]; + Map[c+0xA00+i]=&ROMOffset1[g*0x10000]; + Map[c+0x600+i]=&ROMOffset1[g*0x10000]; + Map[c+0xE00+i]=&ROMOffset1[g*0x10000]; + } + + } + + int bankmax=0x40+ (1<<(CMemory_ROMSize-6)); + //safety for corrupt headers + if(bankmax > 128) + bankmax = 0x80; + int sum=0; + for(i=0x40;i3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) &CMemory_FillRAM [0x3000] - 0x3000; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM; + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + + // Banks 40->4f (was 7f, but SNES docs and GNext overdumping shows nothing here.) + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 16; i++) + CMemory_Map [i + 0x400] = (uint8 *) &SRAM [(c << 12) & 0x1ffff]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = FALSE; + } + } + + for (c = 0; c < 0x100; c += 16) + { + for (i = c; i < c + 16; i++) + CMemory_Map [i + 0x700] = (uint8 *) &ROMOffset1 [(c << 12) & (Slot1Size-1)]; + } + + // c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0xc00] = &ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = RAM; + CMemory_Map [c + 0x7f0] = RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + CMemory_WriteProtectROM (); + + // Now copy the map and correct it for the SA1 CPU. + memmove ((void *) SA1.WriteMap, (void *) CMemory_WriteMap, sizeof (CMemory_WriteMap)); + memmove ((void *) SA1.Map, (void *) Map, sizeof (Map)); + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 0] = SA1.Map [c + 0x800] = &CMemory_FillRAM [0x3000]; + SA1.Map [c + 1] = SA1.Map [c + 0x801] = (uint8 *) CMemory_MAP_NONE; + SA1.WriteMap [c + 0] = SA1.WriteMap [c + 0x800] = &CMemory_FillRAM [0x3000]; + SA1.WriteMap [c + 1] = SA1.WriteMap [c + 0x801] = (uint8 *) CMemory_MAP_NONE; + } + + // Banks 60->6f + for (c = 0; c < 0x100; c++) + SA1.Map [c + 0x600] = SA1.WriteMap [c + 0x600] = (uint8 *) CMemory_MAP_BWRAM_BITMAP; + + CMemory_BWRAM = SRAM; +} + +void CMemory_SufamiTurboAltROMMap () +{ + int c; + int i; + + if(Slot1Size!=0) + Slot1CMemory_SRAMSize=(1<<((uint8)ROMOffset1[0x32]))*1024; + else Slot1Size=0x8000; + if(Slot2Size!=0) + Slot2CMemory_SRAMSize=(1<<((uint8)ROMOffset2[0x32]))*1024; +else Slot2Size=0x8000; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + +// for (i = c + 8; i < c + 16; i++) +// { +// CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROM [c << 11] - 0x8000; +// CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; +// } + + } + + //Map Bios + + for (c=0; c<0x200; c+=16) + { + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROM [((c>>4)*0x8000)%CMemory_CalculatedSize] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + + } + + + for (c=0x200; c<0x400; c+=16) + { + for (i = c + 8; i < c + 16; i++) + { + if(Slot1Size!=0) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROMOffset1 [(((c>>4)*0x8000)%Slot1Size)] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + else CMemory_Map [i] = CMemory_Map [i + 0x800] = (uint8*)CMemory_MAP_NONE; + } + + } + + for (c=0x400; c<0x600; c+=16) + { + for (i = c; i < c + 8; i++) + { + if(Slot2Size!=0) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROMOffset2[(((c>>4)*0x8000)%Slot2Size)]; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + else CMemory_Map [i] = CMemory_Map [i + 0x800] = (uint8*)CMemory_MAP_NONE; + + } + for (i = c + 8; i < c + 16; i++) + { + if(Slot2Size!=0) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &ROMOffset2[(((c>>4)*0x8000)%Slot2Size)] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + else CMemory_Map [i] = CMemory_Map [i + 0x800] = (uint8*)CMemory_MAP_NONE; + + } + + } + + // Banks 60->67 (7F?), S-RAM + if(Slot1CMemory_SRAMSize!=0) + { + for (c = 0; c < 0x100; c++) + { + CMemory_Map [c + 0xE00] = CMemory_Map [c + 0x600] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [c + 0xE00] = CMemory_BlockIsRAM [c + 0x600] = TRUE; + CMemory_BlockIsROM [c + 0xE00] = CMemory_BlockIsROM [c + 0x600] = FALSE; + } + } + if(Slot2CMemory_SRAMSize!=0) + { + for (c = 0; c < 0x100; c++) + { + CMemory_Map [c + 0xF00] = CMemory_Map [c + 0x700] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [c + 0xF00] = CMemory_BlockIsRAM [c + 0x700] = TRUE; + CMemory_BlockIsROM [c + 0xF00] = CMemory_BlockIsROM [c + 0x700] = FALSE; + } + } + + // Banks 7e->7f, RAM + for (c = 0; c < 16; c++) + { + CMemory_Map [c + 0x7e0] = RAM; + CMemory_Map [c + 0x7f0] = RAM + 0x10000; + CMemory_BlockIsRAM [c + 0x7e0] = TRUE; + CMemory_BlockIsRAM [c + 0x7f0] = TRUE; + CMemory_BlockIsROM [c + 0x7e0] = FALSE; + CMemory_BlockIsROM [c + 0x7f0] = FALSE; + } + + CMemory_WriteProtectROM (); +} +#endif + + +void CMemory_SRAM512KLoROMMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [c << 11] - 0x8000; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 8; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000]; + + for (i = c + 8; i < c + 16; i++) + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 11) + 0x200000 - 0x8000]; + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + CMemory_MapExtraRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_BSHiROMMap () +{ + int c; + int i; + + CMemory_SRAMSize=5; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + // XXX: How large is SRAM?? + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) SRAM; + CMemory_BlockIsRAM [c + 5] = CMemory_BlockIsRAM [c + 0x805] = TRUE; +// CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_NONE; +// CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_NONE; + + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) SRAM; +CMemory_BlockIsRAM [c + 6] = CMemory_BlockIsRAM [c + 0x806] = TRUE; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_RAM; +// CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) SRAM; +CMemory_BlockIsRAM [c + 7] = CMemory_BlockIsRAM [c + 0x807] = TRUE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 60->7d offset 0000->7fff & 60->7f offset 8000->ffff PSRAM + // XXX: How large is PSRAM? + + //not adjusted, but The Dumper says "4 Mbits" + for (c = 0x600; c < 0x7e0; c += 16) + { + for (i = c; i < c + 8; i++) + { + CMemory_Map [i] = &CMemory_ROM [0x400000 + (c << 11)]; + CMemory_BlockIsRAM [i] = TRUE; + } + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = &CMemory_ROM [0x400000 + (c << 11) - 0x8000]; + CMemory_BlockIsRAM [i] = TRUE; + } + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + for(i=0;i<0x80;i++) + { + CMemory_Map[0x700+i]=&CMemory_BSRAM[0x10000*(i/16)]; + CMemory_BlockIsRAM[0x700+i]=TRUE; + CMemory_BlockIsROM[0x700+i]=FALSE; + } + for (i=0; i<8;i++) + { + CMemory_Map[0x205+(i<<4)]=CMemory_Map[0x285+(i<<4)]=CMemory_Map[0x305+(i<<4)]=CMemory_Map[0x385+(i<<4)]=CMemory_Map[0x705+(i<<4)]; + CMemory_BlockIsRAM[0x205+(i<<4)]=CMemory_BlockIsRAM[0x285+(i<<4)]=CMemory_BlockIsRAM[0x305+(i<<4)]=CMemory_BlockIsRAM[0x385+(i<<4)]=TRUE; + CMemory_BlockIsROM[0x205+(i<<4)]=CMemory_BlockIsROM[0x285+(i<<4)]=CMemory_BlockIsROM[0x305+(i<<4)]=CMemory_BlockIsROM[0x385+(i<<4)]=FALSE; + } + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_JumboLoROMMap (bool8 Interleaved) +{ + int c; + int i; + + uint32 OFFSET0 = 0x400000; + uint32 OFFSET1 = 0x400000; + uint32 OFFSET2 = 0x000000; + + if (Interleaved) + { + OFFSET0 = 0x000000; + OFFSET1 = 0x000000; + OFFSET2 = CMemory_CalculatedSize-0x400000; //changed to work with interleaved DKJM2. + } + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + if (Settings.DSP1Master) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_DSP; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_DSP; + } + else if (Settings.C4) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) CMemory_MAP_C4; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) CMemory_MAP_C4; + } + else + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = (uint8 *) bytes0x2000 - 0x6000; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = (uint8 *) bytes0x2000 - 0x6000; + } + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i]= &CMemory_ROM [((c << 11) % (CMemory_CalculatedSize - 0x400000)) + OFFSET0] - 0x8000; + CMemory_Map [i + 0x800] = &CMemory_ROM [((c << 11) % (0x400000)) + OFFSET2] - 0x8000; + CMemory_BlockIsROM [i + 0x800] = CMemory_BlockIsROM [i] = TRUE; + } + } + + if (Settings.DSP1Master) + { + // Banks 30->3f and b0->bf + for (c = 0x300; c < 0x400; c += 16) + { + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i + 0x800] = (uint8 *) CMemory_MAP_DSP; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = FALSE; + } + } + } + + // Banks 40->7f and c0->ff + for (c = 0x400; c < 0x800; c += 16) + { + //updated mappings to correct A15 mirroring + for (i = c; i < c + 8; i++) + { + CMemory_Map [i]= &CMemory_ROM [((c << 11) % (CMemory_CalculatedSize - 0x400000)) + OFFSET0]; + CMemory_Map [i + 0x800] = &CMemory_ROM [((c << 11) % 0x400000) +OFFSET2]; + } + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i]= &CMemory_ROM [((c << 11) % (CMemory_CalculatedSize - 0x400000)) + OFFSET0] - 0x8000; + CMemory_Map [i + 0x800] = &CMemory_ROM [((c << 11) % 0x400000) + OFFSET2 ] - 0x8000; + } + + for (i = c; i < c + 16; i++) + { + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + //ROM type has to be 64 Mbit header! + int sum=0, k,l; + for(k=0;k<256;k++) + { + uint8* bank=0x8000+CMemory_Map[8+(k<<4)];//use upper half of the banks, and adjust for LoROM. + for(l=0;l<0x8000;l++) + sum+=bank[l]; + } + CMemory_CalculatedChecksum=sum&0xFFFF; + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} + +void CMemory_SPC7110HiROMMap () +{ + int c; + int i; + + // Banks 00->3f and 80->bf + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 0] = CMemory_Map [c + 0x800] = CMemory_RAM; + CMemory_BlockIsRAM [c + 0] = CMemory_BlockIsRAM [c + 0x800] = TRUE; + CMemory_Map [c + 1] = CMemory_Map [c + 0x801] = CMemory_RAM; + CMemory_BlockIsRAM [c + 1] = CMemory_BlockIsRAM [c + 0x801] = TRUE; + + CMemory_Map [c + 2] = CMemory_Map [c + 0x802] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 3] = CMemory_Map [c + 0x803] = (uint8 *) CMemory_MAP_PPU; + CMemory_Map [c + 4] = CMemory_Map [c + 0x804] = (uint8 *) CMemory_MAP_CPU; + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = (uint8 *) CMemory_MAP_CPU; + + CMemory_Map [c + 6] /*= CMemory_Map [c + 0x806]*/ = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [c + 7] /*= CMemory_Map [c + 0x807]*/ = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [c + 0x806]=CMemory_Map [c + 0x807]= (uint8 *) CMemory_MAP_NONE; + + for (i = c + 8; i < c + 16; i++) + { + CMemory_Map [i] = CMemory_Map [i + 0x800] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i] = CMemory_BlockIsROM [i + 0x800] = TRUE; + } + } + + // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM. + for (c = 0; c < 16; c++) + { + CMemory_Map [0x306 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0x307 + (c << 4)] = (uint8 *) CMemory_MAP_HIROM_SRAM; + CMemory_Map [0xb06 + (c << 4)] = (uint8 *) CMemory_MAP_NONE; + CMemory_Map [0xb07 + (c << 4)] = (uint8 *) CMemory_MAP_NONE; + CMemory_BlockIsRAM [0x306 + (c << 4)] = TRUE; + CMemory_BlockIsRAM [0x307 + (c << 4)] = TRUE; + // CMemory_BlockIsRAM [0xb06 + (c << 4)] = TRUE; + // CMemory_BlockIsRAM [0xb07 + (c << 4)] = TRUE; + } + + // Banks 40->7f and c0->ff + for (c = 0; c < 0x400; c += 16) + { + for (i = c; i < c + 16; i++) + { + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &CMemory_ROM [(c << 12) % CMemory_CalculatedSize]; + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = TRUE; + } + } + + for (c=0;c<0x10;c++) + { + CMemory_Map [0x500+c]=(uint8 *)CMemory_MAP_SPC7110_DRAM; + CMemory_BlockIsROM [0x500+c]=TRUE; + } + + for (c=0;c<0x100;c++) + { + CMemory_Map [0xD00+c] = (uint8 *) CMemory_MAP_SPC7110_ROM; + CMemory_Map [0xE00+c] = (uint8 *) CMemory_MAP_SPC7110_ROM; + CMemory_Map [0xF00+c] = (uint8 *) CMemory_MAP_SPC7110_ROM; + CMemory_BlockIsROM [0xD00+c] = CMemory_BlockIsROM [0xE00+c] = CMemory_BlockIsROM [0xF00+c] = TRUE; + + } + S9xSpc7110Init(); + +int sum=0; +for(i=0;i<(int)CMemory_CalculatedSize; i++) +{ + sum+=CMemory_ROM[i]; +} + +if(CMemory_CalculatedSize==0x300000) + sum<<=1; +CMemory_CalculatedChecksum=sum&0xFFFF; + + CMemory_MapRAM (); + CMemory_WriteProtectROM (); +} +void CMemory_SPC7110Sram(uint8 newstate) +{ + if(newstate&0x80) + { + CMemory_Map[6]=(uint8 *)CMemory_MAP_HIROM_SRAM; + CMemory_Map[7]=(uint8 *)CMemory_MAP_HIROM_SRAM; + CMemory_Map[0x306]=(uint8 *)CMemory_MAP_HIROM_SRAM; + CMemory_Map[0x307]=(uint8 *)CMemory_MAP_HIROM_SRAM; + + + } + else + { + CMemory_Map[6]=(uint8 *)CMemory_MAP_RONLY_SRAM; + CMemory_Map[7]=(uint8 *)CMemory_MAP_RONLY_SRAM; + CMemory_Map[0x306]=(uint8 *)CMemory_MAP_RONLY_SRAM; + CMemory_Map[0x307]=(uint8 *)CMemory_MAP_RONLY_SRAM; + } +} +const char *CMemory_TVStandard () +{ + return (Settings.PAL ? "PAL" : "NTSC"); +} + +const char *CMemory_Speed () +{ + return (CMemory_ROMSpeed & 0x10 ? "120ns" : "200ns"); +} + +const char *CMemory_MapType () +{ + return (CMemory_HiROM ? "HiROM" : "LoROM"); +} + +const char *CMemory_StaticRAMSize () +{ + static char tmp [20]; + + if (CMemory_SRAMSize > 16) + return ("Corrupt"); + sprintf (tmp, "%dKB", (CMemory_SRAMMask + 1) / 1024); + return (tmp); +} + +const char *CMemory_Size () +{ + static char tmp [20]; + + if (CMemory_ROMSize < 7 || CMemory_ROMSize - 7 > 23) + return ("Corrupt"); + sprintf (tmp, "%dMbits", 1 << (CMemory_ROMSize - 7)); + return (tmp); +} + +const char *CMemory_KartContents () +{ + static char tmp [30]; + static const char *CoPro [16] = { + "DSP", "SuperFX", "OBC1", "SA-1", "S-DD1", "S-RTC", "CoPro#6", + "CoPro#7", "CoPro#8", "CoPro#9", "CoPro#10", "CoPro#11", "CoPro#12", + "CoPro#13", "CoPro#14", "CoPro-Custom" + }; + static const char *Contents [3] = { + "ROM", "ROM+RAM", "ROM+RAM+BAT" + }; + static const char *DSPSel [4] = { + "DSP1", "DSP2", "DSP3", "DSP4" + }; + if (CMemory_ROMType == 0&&!Settings.BS) + return ("ROM only"); + + sprintf (tmp, "%s", Contents [(CMemory_ROMType & 0xf) % 3]); + + if(Settings.BS) + sprintf (tmp, "%s+%s", tmp, "BSX"); + else if(Settings.SPC7110&&Settings.SPC7110RTC) + sprintf (tmp, "%s+%s", tmp, "SPC7110+RTC"); + else if(Settings.SPC7110) + sprintf (tmp, "%s+%s", tmp, "SPC7110"); + else if(Settings.C4) + sprintf (tmp, "%s+%s", tmp, "C4"); + else if(Settings.SETA!=0) + { + switch(Settings.SETA) + { + case ST_010: + sprintf (tmp, "%s+%s", tmp, "ST-010"); + break; + case ST_011: + sprintf (tmp, "%s+%s", tmp, "ST-011"); + break; + + case ST_018: + sprintf (tmp, "%s+%s", tmp, "ST-018"); + break; + + } + } + else if ((CMemory_ROMType & 0xf) >= 3) + { + if (CMemory_ROMType & 0xf0) + sprintf (tmp, "%s+%s", tmp, CoPro [(CMemory_ROMType & 0xf0) >> 4]); + else +#ifndef USE_OLD_DSP1 + sprintf (tmp, "%s+%s", tmp, DSPSel [DSP1.version]); +#else + sprintf (tmp, "%s+%s", tmp, "DSP1"); +#endif + } + + return (tmp); +} + +const char *CMemory_MapMode () +{ + static char tmp [4]; + sprintf (tmp, "%02x", CMemory_ROMSpeed & ~0x10); + return (tmp); +} + +const char *CMemory_ROMID () +{ + return (CMemory_ROMId); +} + +void CMemory_ApplyROMFixes () +{ +#ifdef __W32_HEAP + if(_HEAPOK!=_heapchk()) + MessageBox(GUI.hWnd, "CMemory_ApplyROMFixes", "Heap Corrupt", MB_OK); +#endif + + //don't steal my work! -MK + if(CMemory_ROMCRC32 == 0x1B4A5616 && strncmp(CMemory_ROMName, "RUDORA NO HIHOU", 15)==0) + { + strncpy(CMemory_ROMName, "THIS SCRIPT WAS STOLEN", 22); + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + } + + /* + HACKS NSRT can fix that we hadn't detected before. +[14:25:13] <@Nach> case 0x0c572ef0: //So called Hook (US)(2648) +[14:25:13] <@Nach> case 0x6810aa95: //Bazooka Blitzkreig swapped sizes hack -handled +[14:25:17] <@Nach> case 0x61E29C06: //The Tick region hack +[14:25:19] <@Nach> case 0x1EF90F74: //Jikkyou Keiba Simulation Stable Star PAL hack +[14:25:23] <@Nach> case 0x4ab225b5: //So called Krusty's Super Fun House (E) +[14:25:25] <@Nach> case 0x77fd806a: //Donkey Kong Country 2 (E) v1.1 bad dump -handled +[14:25:27] <@Nach> case 0x340f23e5: //Donkey Kong Country 3 (U) copier hack - handled + */ + + if(CMemory_ROMCRC32==0x6810aa95 || CMemory_ROMCRC32==0x340f23e5 || CMemory_ROMCRC32==0x77fd806a || + strncmp (CMemory_ROMName, "HIGHWAY BATTLE 2", 16)==0 || + (strcmp (CMemory_ROMName, "FX SKIING NINTENDO 96") == 0 && CMemory_ROM[0x7FDA]==0)) + { + Settings.DisplayColor=BUILD_PIXEL(31,0,0); + SET_UI_COLOR(255,0,0); + } + + //Ambiguous chip function pointer assignments +#ifndef USE_OLD_DSP1 + DSP1.version=0; + + //DSP switching: + if(strncmp(CMemory_ROMName, "DUNGEON MASTER", 14)==0) + { + //Set DSP-2 + DSP1.version=1; + SetDSP=&DSP2SetByte; + GetDSP=&DSP2GetByte; + } + + if(strncmp(CMemory_ROMName, "SD\x0b6\x0de\x0dd\x0c0\x0de\x0d1GX", 10)==0) + { + //Set DSP-3 + DSP1.version=2; + strncpy(CMemory_ROMName, "SD Gundam GX", 13); + SetDSP = &DSP3SetByte; + GetDSP = &DSP3GetByte; + DSP3_Reset(); + } + + if(strncmp(CMemory_ROMName, "TOP GEAR 3000", 13)==0 + ||strncmp(CMemory_ROMName, "PLANETS CHAMP TG3000", 20)==0) + { + //Set DSP-4 + DSP1.version=3; + SetDSP=&DSP4SetByte; + GetDSP=&DSP4GetByte; + } +#endif + + //memory map corrections + if(strncmp(CMemory_ROMName, "XBAND",5)==0) + { + int c; + for (c=0xE00;c<0xE10;c++) + { + CMemory_Map [c] = (uint8 *) CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsRAM [c] = TRUE; + CMemory_BlockIsROM [c] = FALSE; + } + CMemory_WriteProtectROM (); + } + + //not MAD-1 compliant + if(strcmp (CMemory_ROMName, "WANDERERS FROM YS") == 0) + { + int c; + for(c=0;c<0xE0;c++) + { + CMemory_Map[c+0x700]=(uint8*)CMemory_MAP_LOROM_SRAM; + CMemory_BlockIsROM[c+0x700]=FALSE; + CMemory_BlockIsRAM[c+0x700]=TRUE; + } + CMemory_WriteProtectROM(); + } + + if (strcmp (CMemory_ROMName, "GOGO ACKMAN3") == 0 || + strcmp (CMemory_ROMName, "HOME ALONE") == 0) + { + // Banks 00->3f and 80->bf + int c; + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 6] = CMemory_Map [c + 0x806] = CMemory_SRAM; + CMemory_Map [c + 7] = CMemory_Map [c + 0x807] = CMemory_SRAM; + CMemory_BlockIsROM [c + 6] = CMemory_BlockIsROM [c + 0x806] = FALSE; + CMemory_BlockIsROM [c + 7] = CMemory_BlockIsROM [c + 0x807] = FALSE; + CMemory_BlockIsRAM [c + 6] = CMemory_BlockIsRAM [c + 0x806] = TRUE; + CMemory_BlockIsRAM [c + 7] = CMemory_BlockIsRAM [c + 0x807] = TRUE; + } + CMemory_WriteProtectROM (); + } + + if (strcmp (CMemory_ROMName, "RADICAL DREAMERS") == 0 || + strcmp (CMemory_ROMName, "TREASURE CONFLIX") == 0) + { + int c; + + for (c = 0; c < 0x80; c++) + { + CMemory_Map [c + 0x700] = CMemory_ROM + 0x200000 + 0x1000 * (c & 0xf0); + CMemory_BlockIsRAM [c + 0x700] = TRUE; + CMemory_BlockIsROM [c + 0x700] = FALSE; + } + for (c = 0; c < 0x400; c += 16) + { + CMemory_Map [c + 5] = CMemory_Map [c + 0x805] = CMemory_ROM + 0x300000; + CMemory_BlockIsRAM [c + 5] = CMemory_BlockIsRAM [c + 0x805] = TRUE; + } + CMemory_WriteProtectROM (); + } + + if(strncmp(CMemory_ROMName, "WAR 2410", 8)==0) + { + CMemory_Map [0x005] = (uint8 *) CMemory_RAM; + CMemory_BlockIsRAM [0x005] = TRUE; + CMemory_BlockIsROM [0x005] = FALSE; + } + + if (strcmp (CMemory_ROMName, "BATMAN--REVENGE JOKER") == 0) + { + CMemory_HiROM = FALSE; + CMemory_LoROM = TRUE; + CMemory_LoROMMap (); + } + + + //NMI hacks + CPU.NMITriggerPoint = 4; + if (strcmp (CMemory_ROMName, "CACOMA KNIGHT") == 0) + CPU.NMITriggerPoint = 25; + + //Disabling a speed-up + // Games which spool sound samples between the SNES and sound CPU using + // H-DMA as the sample is playing. + if (strcmp (CMemory_ROMName, "EARTHWORM JIM 2") == 0 || + strcmp (CMemory_ROMName, "PRIMAL RAGE") == 0 || + strcmp (CMemory_ROMName, "CLAY FIGHTER") == 0 || + strcmp (CMemory_ROMName, "ClayFighter 2") == 0 || + strncasecmp (CMemory_ROMName, "MADDEN", 6) == 0 || + strncmp (CMemory_ROMName, "NHL", 3) == 0 || + strcmp (CMemory_ROMName, "WeaponLord") == 0|| + strncmp(CMemory_ROMName, "WAR 2410", 8)==0) + { + Settings.Shutdown = FALSE; + } + + + //APU timing hacks + + // Stunt Racer FX + if (strcmp (CMemory_ROMId, "CQ ") == 0 || + // Illusion of Gaia + strncmp (CMemory_ROMId, "JG", 2) == 0 || + strcmp (CMemory_ROMName, "GAIA GENSOUKI 1 JPN") == 0) + { + IAPU.OneCycle = 13; + } + + // RENDERING RANGER R2 + if (strcmp (CMemory_ROMId, "AVCJ") == 0 || + //Mark Davis + strncmp(CMemory_ROMName, "THE FISHING MASTER", 18)==0 || //needs >= actual APU timing. (21 is .002 Mhz slower) + // Star Ocean + strncmp (CMemory_ROMId, "ARF", 3) == 0 || + // Tales of Phantasia + strncmp (CMemory_ROMId, "ATV", 3) == 0 || + // Act Raiser 1 & 2 + strncasecmp (CMemory_ROMName, "ActRaiser", 9) == 0 || + // Soulblazer + strcmp (CMemory_ROMName, "SOULBLAZER - 1 USA") == 0 || + strcmp (CMemory_ROMName, "SOULBLADER - 1") == 0 || + + // Terranigma + strncmp (CMemory_ROMId, "AQT", 3) == 0 || + // Robotrek + strncmp (CMemory_ROMId, "E9 ", 3) == 0 || + strcmp (CMemory_ROMName, "SLAP STICK 1 JPN") == 0 || + // ZENNIHON PURORESU2 + strncmp (CMemory_ROMId, "APR", 3) == 0 || + // Bomberman 4 + strncmp (CMemory_ROMId, "A4B", 3) == 0 || + // UFO KAMEN YAKISOBAN + strncmp (CMemory_ROMId, "Y7 ", 3) == 0 || + strncmp (CMemory_ROMId, "Y9 ", 3) == 0 || + // Panic Bomber World + strncmp (CMemory_ROMId, "APB", 3) == 0 || + ((strncmp (CMemory_ROMName, "Parlor", 6) == 0 || + strcmp (CMemory_ROMName, "HEIWA Parlor!Mini8") == 0 || + strncmp (CMemory_ROMName, "SANKYO Fever! \xCC\xA8\xB0\xCA\xDE\xB0!", 21) == 0) && //SANKYO Fever! Fever! + strcmp (CMemory_CompanyId, "A0") == 0) || + strcmp (CMemory_ROMName, "DARK KINGDOM") == 0 || + strcmp (CMemory_ROMName, "ZAN3 SFC") == 0 || + strcmp (CMemory_ROMName, "HIOUDEN") == 0 || + strcmp (CMemory_ROMName, "\xC3\xDD\xBC\xC9\xB3\xC0") == 0 || //Tenshi no Uta + strcmp (CMemory_ROMName, "FORTUNE QUEST") == 0 || + strcmp (CMemory_ROMName, "FISHING TO BASSING") == 0 || + strncmp (CMemory_ROMName, "TokyoDome '95Battle 7", 21) == 0 || + strcmp (CMemory_ROMName, "OHMONO BLACKBASS") == 0 || + strncmp (CMemory_ROMName, "SWORD WORLD SFC", 15) == 0 || + strcmp (CMemory_ROMName, "MASTERS") ==0 || //Augusta 2 J + strcmp (CMemory_ROMName, "SFC \xB6\xD2\xDD\xD7\xB2\xC0\xDE\xB0") == 0 || //Kamen Rider + strncmp (CMemory_ROMName, "LETs PACHINKO(", 14) == 0) //A set of BS games + { + IAPU.OneCycle = 15; + } + + + //Specific game fixes + + Settings.StarfoxHack = strcmp (CMemory_ROMName, "STAR FOX") == 0 || + strcmp (CMemory_ROMName, "STAR WING") == 0; + Settings.WinterGold = strcmp (CMemory_ROMName, "FX SKIING NINTENDO 96") == 0 || + strcmp (CMemory_ROMName, "DIRT RACER") == 0 || + Settings.StarfoxHack; + + + if((strcmp(CMemory_ROMName, "LEGEND")==0&&!Settings.PAL)|| + strcmp(CMemory_ROMName, "King Arthurs World")==0) + { + SNESGameFixes.EchoOnlyOutput=TRUE; + } + + + Settings.DaffyDuck = (strcmp (CMemory_ROMName, "DAFFY DUCK: MARV MISS") == 0) || + (strcmp (CMemory_ROMName, "ROBOCOP VS THE TERMIN") == 0) || + (strcmp (CMemory_ROMName, "ROBOCOP VS TERMINATOR") == 0); //ROBOCOP VS THE TERMIN + Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX; + + //OAM hacks because we don't fully understand the + //behavior of the SNES. + + //Totally wacky display... + //seems to need a disproven behavior, so + //we're definitely overlooking some other bug? + if(strncmp(CMemory_ROMName, "UNIRACERS", 9)==0) + SNESGameFixes.Uniracers=TRUE; + + + //is this even useful now? + if (strcmp (CMemory_ROMName, "ALIENS vs. PREDATOR") == 0) + SNESGameFixes.alienVSpredetorFix = TRUE; + + if (strcmp (CMemory_ROMName, "\xBD\xB0\xCA\xDF\xB0\xCC\xA7\xD0\xBD\xC0") == 0 || //Super Famista + strcmp (CMemory_ROMName, "\xBD\xB0\xCA\xDF\xB0\xCC\xA7\xD0\xBD\xC0 2") == 0 || //Super Famista 2 + strcmp (CMemory_ROMName, "ZENKI TENCHIMEIDOU") == 0 || + strcmp (CMemory_ROMName, "GANBA LEAGUE") == 0) + { + SNESGameFixes.APU_OutPorts_ReturnValueFix = TRUE; + } + + + //CPU timing hacks + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * + Settings.CyclesPercentage) / 100; + + //no need to ifdef for right now... +//#ifdef HDMA_HACKS + + // A Couple of HDMA related hacks - Lantus + if ((strcmp(CMemory_ROMName, "SFX SUPERBUTOUDEN2")==0) || + (strcmp(CMemory_ROMName, "ALIEN vs. PREDATOR")==0) || + (strcmp(CMemory_ROMName, "STONE PROTECTORS")==0) || + (strcmp(CMemory_ROMName, "SUPER BATTLETANK 2")==0)) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 130) / 100; + + if(strcmp(CMemory_ROMName, "HOME IMPROVEMENT")==0) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 200) / 100; + + // End HDMA hacks +//#endif + + + if (strcmp (CMemory_ROMId, "ASRJ") == 0 && Settings.CyclesPercentage == 100) + // Street Racer + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 95) / 100; + + // Power Rangers Fight + if (strncmp (CMemory_ROMId, "A3R", 3) == 0 || + // Clock Tower + strncmp (CMemory_ROMId, "AJE", 3) == 0) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 103) / 100; + + + if (strncmp (CMemory_ROMId, "A3M", 3) == 0 && Settings.CyclesPercentage == 100) + // Mortal Kombat 3. Fixes cut off speech sample + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; + + //Darkness Beyond Twilight + //Crimson beyond blood that flows + //buried in the stream of time + //is where your power grows + //I pledge myself to conquer + //all the foes who stand + //before the might gift betsowed + //in my unworthy hand + if (strcmp (CMemory_ROMName, "\x0bd\x0da\x0b2\x0d4\x0b0\x0bd\x0de") == 0 && + Settings.CyclesPercentage == 100) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 101) / 100; + + +#ifdef DETECT_NASTY_FX_INTERLEAVE +//XXX: Test without these. Win32 port indicates they aren't needed? +//Apparently are needed! + if (strcmp (CMemory_ROMName, "WILD TRAX") == 0 || + strcmp (CMemory_ROMName, "STAR FOX 2") == 0 || + strcmp (CMemory_ROMName, "YOSSY'S ISLAND") == 0 || + strcmp (CMemory_ROMName, "YOSHI'S ISLAND") == 0) + CPU.TriedInterleavedMode2 = TRUE; +#endif + + // Start Trek: Deep Sleep 9 + if (strncmp (CMemory_ROMId, "A9D", 3) == 0 && Settings.CyclesPercentage == 100) + Settings.H_Max = (SNES_CYCLES_PER_SCANLINE * 110) / 100; + + snes4all_apu_hmax=Settings.H_Max*10000L; + + //SA-1 Speedup settings + SA1.WaitAddress = NULL; + SA1.WaitByteAddress1 = NULL; + SA1.WaitByteAddress2 = NULL; + + /* Bass Fishing */ + if (strcmp (CMemory_ROMId, "ZBPJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0093f1 >> MEMMAP_SHIFT] + 0x93f1; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x304a; + } + /* DAISENRYAKU EXPERTWW2 */ + if (strcmp (CMemory_ROMId, "AEVJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0ed18d >> MEMMAP_SHIFT] + 0xd18d; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3000; + } + /* debjk2 */ + if (strcmp (CMemory_ROMId, "A2DJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x008b62 >> MEMMAP_SHIFT] + 0x8b62; + } + /* Dragon Ballz HD */ + if (strcmp (CMemory_ROMId, "AZIJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x008083 >> MEMMAP_SHIFT] + 0x8083; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3020; + } + /* SFC SDGUNDAMGNEXT */ + if (strcmp (CMemory_ROMId, "ZX3J") == 0) + { + SA1.WaitAddress = SA1.Map [0x0087f2 >> MEMMAP_SHIFT] + 0x87f2; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x30c4; + } + /* ShougiNoHanamichi */ + if (strcmp (CMemory_ROMId, "AARJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc1f85a >> MEMMAP_SHIFT] + 0xf85a; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x0c64; + SA1.WaitByteAddress2 = CMemory_SRAM + 0x0c66; + } + /* KATO HIFUMI9DAN SYOGI */ + if (strcmp (CMemory_ROMId, "A23J") == 0) + { + SA1.WaitAddress = SA1.Map [0xc25037 >> MEMMAP_SHIFT] + 0x5037; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x0c06; + SA1.WaitByteAddress2 = CMemory_SRAM + 0x0c08; + } + /* idaten */ + if (strcmp (CMemory_ROMId, "AIIJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc100be >> MEMMAP_SHIFT] + 0x00be; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x1002; + SA1.WaitByteAddress2 = CMemory_SRAM + 0x1004; + } + /* igotais */ + if (strcmp (CMemory_ROMId, "AITJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0080b7 >> MEMMAP_SHIFT] + 0x80b7; + } + /* J96 DREAM STADIUM */ + if (strcmp (CMemory_ROMId, "AJ6J") == 0) + { + SA1.WaitAddress = SA1.Map [0xc0f74a >> MEMMAP_SHIFT] + 0xf74a; + } + /* JumpinDerby */ + if (strcmp (CMemory_ROMId, "AJUJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00d926 >> MEMMAP_SHIFT] + 0xd926; + } + /* JKAKINOKI SHOUGI */ + if (strcmp (CMemory_ROMId, "AKAJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00f070 >> MEMMAP_SHIFT] + 0xf070; + } + /* HOSHI NO KIRBY 3 & KIRBY'S DREAM LAND 3 JAP & US */ + if (strcmp (CMemory_ROMId, "AFJJ") == 0 || strcmp (CMemory_ROMId, "AFJE") == 0) + { + SA1.WaitAddress = SA1.Map [0x0082d4 >> MEMMAP_SHIFT] + 0x82d4; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x72a4; + } + /* KIRBY SUPER DELUXE JAP */ + if (strcmp (CMemory_ROMId, "AKFJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x008c93 >> MEMMAP_SHIFT] + 0x8c93; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x300a; + SA1.WaitByteAddress2 = CMemory_FillRAM + 0x300e; + } + /* KIRBY SUPER DELUXE US */ + if (strcmp (CMemory_ROMId, "AKFE") == 0) + { + SA1.WaitAddress = SA1.Map [0x008cb8 >> MEMMAP_SHIFT] + 0x8cb8; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x300a; + SA1.WaitByteAddress2 = CMemory_FillRAM + 0x300e; + } + /* SUPER MARIO RPG JAP & US */ + if (strcmp (CMemory_ROMId, "ARWJ") == 0 || strcmp (CMemory_ROMId, "ARWE") == 0) + { + SA1.WaitAddress = SA1.Map [0xc0816f >> MEMMAP_SHIFT] + 0x816f; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3000; + } + /* marvelous.zip */ + if (strcmp (CMemory_ROMId, "AVRJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0085f2 >> MEMMAP_SHIFT] + 0x85f2; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3024; + } + /* AUGUSTA3 MASTERS NEW */ + if (strcmp (CMemory_ROMId, "AO3J") == 0) + { + SA1.WaitAddress = SA1.Map [0x00dddb >> MEMMAP_SHIFT] + 0xdddb; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x37b4; + } + /* OSHABERI PARODIUS */ + if (strcmp (CMemory_ROMId, "AJOJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x8084e5 >> MEMMAP_SHIFT] + 0x84e5; + } + /* PANIC BOMBER WORLD */ + if (strcmp (CMemory_ROMId, "APBJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00857a >> MEMMAP_SHIFT] + 0x857a; + } + /* PEBBLE BEACH NEW */ + if (strcmp (CMemory_ROMId, "AONJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00df33 >> MEMMAP_SHIFT] + 0xdf33; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x37b4; + } + /* PGA EUROPEAN TOUR */ + if (strcmp (CMemory_ROMId, "AEPE") == 0) + { + SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3102; + } + /* PGA TOUR 96 */ + if (strcmp (CMemory_ROMId, "A3GE") == 0) + { + SA1.WaitAddress = SA1.Map [0x003700 >> MEMMAP_SHIFT] + 0x3700; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3102; + } + /* POWER RANGERS 4 */ + if (strcmp (CMemory_ROMId, "A4RE") == 0) + { + SA1.WaitAddress = SA1.Map [0x009899 >> MEMMAP_SHIFT] + 0x9899; + SA1.WaitByteAddress1 = CMemory_FillRAM + 0x3000; + } + /* PACHISURO PALUSUPE */ + if (strcmp (CMemory_ROMId, "AGFJ") == 0) + { + // Never seems to turn on the SA-1! + } + /* SD F1 GRAND PRIX */ + if (strcmp (CMemory_ROMId, "AGFJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x0181bc >> MEMMAP_SHIFT] + 0x81bc; + } + /* SHOUGI MARJONG */ + if (strcmp (CMemory_ROMId, "ASYJ") == 0) + { + SA1.WaitAddress = SA1.Map [0x00f2cc >> MEMMAP_SHIFT] + 0xf2cc; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x7ffe; + SA1.WaitByteAddress2 = CMemory_SRAM + 0x7ffc; + } + /* shogisai2 */ + if (strcmp (CMemory_ROMId, "AX2J") == 0) + { + SA1.WaitAddress = SA1.Map [0x00d675 >> MEMMAP_SHIFT] + 0xd675; + } + + /* SHINING SCORPION */ + if (strcmp (CMemory_ROMId, "A4WJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc048be >> MEMMAP_SHIFT] + 0x48be; + } + /* SHIN SHOUGI CLUB */ + if (strcmp (CMemory_ROMId, "AHJJ") == 0) + { + SA1.WaitAddress = SA1.Map [0xc1002a >> MEMMAP_SHIFT] + 0x002a; + SA1.WaitByteAddress1 = CMemory_SRAM + 0x0806; + SA1.WaitByteAddress2 = CMemory_SRAM + 0x0808; + } + + + //Other + + // Additional game fixes by sanmaiwashi ... + if (strcmp (CMemory_ROMName, "SFX \xC5\xB2\xC4\xB6\xDE\xDD\xC0\xDE\xD1\xD3\xC9\xB6\xDE\xC0\xD8 1") == 0) // Gundam Knight Story + { + bytes0x2000 [0xb18] = 0x4c; + bytes0x2000 [0xb19] = 0x4b; + bytes0x2000 [0xb1a] = 0xea; + SNESGameFixes.SRAMInitialValue = 0x6b; + } + + + // HITOMI3 + if (strcmp (CMemory_ROMName, "HITOMI3") == 0) + { + CMemory_SRAMSize = 1; + CMemory_SRAMMask = CMemory_SRAMSize ? + ((1 << (CMemory_SRAMSize + 3)) * 128) - 1 : 0; + } + + //sram value fixes + if (strcmp (CMemory_ROMName, "SUPER DRIFT OUT") == 0 || + strcmp(CMemory_ROMName, "SATAN IS OUR FATHER!") == 0 || + strcmp (CMemory_ROMName, "goemon 4") == 0) + SNESGameFixes.SRAMInitialValue = 0x00; + +#if 0 + if(strcmp (CMemory_ROMName, "XBAND JAPANESE MODEM") == 0) + { + for (c = 0x200; c < 0x400; c += 16) + { + for (int i = c; i < c + 16; i++) + { + CMemory_Map [i + 0x400] = CMemory_Map [i + 0xc00] = &ROM[c * 0x1000]; + CMemory_BlockIsRAM [i + 0x400] = CMemory_BlockIsRAM [i + 0xc00] = TRUE; + CMemory_BlockIsROM [i + 0x400] = CMemory_BlockIsROM [i + 0xc00] = FALSE; + } + } + CMemory_WriteProtectROM (); + } +#endif + +#define RomPatch(adr,ov,nv) \ + if (CMemory_ROM [adr] == ov) \ + CMemory_ROM [adr] = nv + + + // Love Quest + if (strcmp (CMemory_ROMName, "LOVE QUEST") == 0) + { + RomPatch (0x1385ec, 0xd0, 0xea); + RomPatch (0x1385ed, 0xb2, 0xea); + } + //BNE D0 into nops + + //seems like the next instruction is a BRA + //otherwise, this one's too complex for MKendora + // Nangoku Syonen Papuwa Kun + if (strcmp (CMemory_ROMName, "NANGOKUSYONEN PAPUWA") == 0) + RomPatch (0x1f0d1, 0xa0, 0x6b); + //turns an LDY into an RTL? + + //this is a cmp on $00:2140 + // Super Batter Up + if (strcmp (CMemory_ROMName, "Super Batter Up") == 0) + { + RomPatch (0x27ae0, 0xd0, 0xea); + RomPatch (0x27ae1, 0xfa, 0xea); + } + //BNE +} + +// Read variable size MSB int from a file +static long ReadInt (FILE *f, unsigned nbytes) +{ + long v = 0; + while (nbytes--) + { + int c = fgetc(f); + if (c == EOF) + return -1; + v = (v << 8) | (c & 0xFF); + } + return (v); +} + +#define IPS_EOF 0x00454F46l + +void CMemory_CheckForIPSPatch (const char *rom_filename, bool8 header, int32 *rom_size) +{ + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char fname [_MAX_PATH + 1]; + FILE *patch_file = NULL; + long offset = header ? 512 : 0; + + _splitpath (rom_filename, drive, dir, name, ext); + _makepath (fname, drive, dir, name, "ips"); + + if (!(patch_file = fopen (fname, "rb"))) + { + if (!(patch_file = fopen (S9xGetFilename (".ips"), "rb"))) + return; + } + + if (fread (fname, 1, 5, patch_file) != 5 || + strncmp (fname, "PATCH", 5) != 0) + { + fclose (patch_file); + return; + } + + int32 ofs; + + for (;;) + { + long len; + long rlen; + int rchar; + + ofs = ReadInt (patch_file, 3); + if (ofs == -1) + goto err_eof; + + if (ofs == IPS_EOF) + break; + + ofs -= offset; + + len = ReadInt (patch_file, 2); + if (len == -1) + goto err_eof; + + /* Apply patch block */ + if (len) + { + if (ofs + len > CMemory_MAX_ROM_SIZE) + goto err_eof; + + while (len--) + { + rchar = fgetc (patch_file); + if (rchar == EOF) + goto err_eof; + CMemory_ROM [ofs++] = (uint8) rchar; + } + if (ofs > *rom_size) + *rom_size = ofs; + } + else + { + rlen = ReadInt (patch_file, 2); + if (rlen == -1) + goto err_eof; + + rchar = fgetc (patch_file); + if (rchar == EOF) + goto err_eof; + + if (ofs + rlen > CMemory_MAX_ROM_SIZE) + goto err_eof; + + while (rlen--) + CMemory_ROM [ofs++] = (uint8) rchar; + + if (ofs > *rom_size) + *rom_size = ofs; + } + } + + // Check if ROM image needs to be truncated + ofs = ReadInt (patch_file, 3); + if (ofs != -1 && ofs - offset < *rom_size) + { + // Need to truncate ROM image + *rom_size = ofs - offset; + } + fclose (patch_file); + return; + +err_eof: + if (patch_file) + fclose (patch_file); +} + +static int is_bsx(unsigned char *p) +{ + unsigned c; + + if ( p[0x19] & 0x4f ) + goto notbsx; + c = p[0x1a]; + if ( (c != 0x33) && (c != 0xff) ) // 0x33 = Manufacturer: Nintendo + goto notbsx; + c = (p[0x17] << 8) | p[0x16]; + if ( (c != 0x0000) && (c != 0xffff) ) + { + if ( (c & 0x040f) != 0 ) + goto notbsx; + if ( (c & 0xff) > 0xc0 ) + goto notbsx; + } + c = p[0x18]; + if ( (c & 0xce) || ((c & 0x30)==0) ) + goto notbsx; + if ( (p[0x15] & 0x03) != 0 ) + goto notbsx; + c = p[0x13]; + if ( (c != 0x00) && (c != 0xff) ) + goto notbsx; + if ( p[0x14] != 0x00 ) + goto notbsx; + if ( bs_name(p) != 0 ) + goto notbsx; + return 0; // It's a Satellaview ROM! +notbsx: + return -1; +} +static int bs_name(unsigned char *p) +{ + unsigned c; + int lcount; + int numv; // number of valid name characters seen so far + numv = 0; + for ( lcount = 16; lcount > 0; lcount-- ) + { + if ( check_char( c = *p++ ) != 0 ) + { + c = *p++; + if ( c < 0x20 ) + { + if ( (numv != 0x0b) || (c != 0) ) // Dr. Mario Hack + goto notBsName; + } + + numv++; + lcount--; + continue; + } + else + { + if ( c == 0 ) + { + if ( numv == 0 ) + goto notBsName; + continue; + } + + if ( c < 0x20 ) + goto notBsName; + if ( c >= 0x80 ) + { + if ( (c < 0xa0) || ( c >= 0xf0 ) ) + goto notBsName; + } + numv++; + } + } + if ( numv > 0 ) + return 0; +notBsName: + return -1; +} +static int check_char(unsigned c) +{ + if ( ( c & 0x80 ) == 0 ) + return 0; + if ( ( c - 0x20 ) & 0x40 ) + return 1; + else + return 0; +} + +void CMemory_ParseSNESHeader(uint8* RomHeader) +{ + CMemory_SRAMSize = RomHeader [0x28]; + strncpy (CMemory_ROMName, (char *) &RomHeader[0x10], ROM_NAME_LEN - 1); + CMemory_ROMSpeed = RomHeader [0x25]; + CMemory_ROMType = RomHeader [0x26]; + CMemory_ROMSize = RomHeader [0x27]; + CMemory_ROMChecksum = RomHeader [0x2e] + (RomHeader [0x2f] << 8); + CMemory_ROMComplementChecksum = RomHeader [0x2c] + (RomHeader [0x2d] << 8); + CMemory_ROMRegion= RomHeader[0x29]; + memmove (CMemory_ROMId, &RomHeader [0x2], 4); + if(RomHeader[0x2A]==0x33) + memmove (CMemory_CompanyId, &RomHeader [0], 2); + else sprintf(CMemory_CompanyId, "%02X", RomHeader[0x2A]); +} + +#if defined(NO_INLINE_SET_GET) || defined(USE_MMU) +#define INLINE +#include "getset.h" +#endif + diff --git a/src/menu/fade.cpp b/src/menu/fade.cpp new file mode 100644 index 0000000..2e2d2c2 --- /dev/null +++ b/src/menu/fade.cpp @@ -0,0 +1,41 @@ +#include"fade.h" + + +void fade16(SDL_Surface *screen, unsigned short n) +{ + int i,total=screen->w*screen->h; + SDL_LockSurface(screen); + unsigned short rs=screen->format->Rshift; + unsigned short gs=screen->format->Gshift; + unsigned short bs=screen->format->Bshift; + unsigned short rm=screen->format->Rmask; + unsigned short gm=screen->format->Gmask; + unsigned short bm=screen->format->Bmask; + unsigned short rM=rm>>rs; + unsigned short gM=gm>>gs; + unsigned short bM=bm>>bs; + unsigned short * buff=(unsigned short*)screen->pixels; + for(i=0;i>rs; + register unsigned short g=(buff[i]&gm)>>gs; + register unsigned short b=(buff[i]&bm)>>bs; +// if (n>r) + if (n+rg) + if (n+gb) + if (n+b +#include + + +void fade16(SDL_Surface *screen, unsigned short n); diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp new file mode 100644 index 0000000..1574c9b --- /dev/null +++ b/src/menu/menu.cpp @@ -0,0 +1,822 @@ +#include +#include +#include + +#include +#ifdef USE_MENU_MUSIC +#include +#endif + +#ifdef DREAMCAST +#include +#endif + +#include "snes9x.h" +#include "snes4all.h" +#include "menu.h" + +#include "msg.h" +#include "fade.h" + +#include "sdlinterface.h" +#include "videogl.h" + +#define TRANS_COLOR 0xFEEEEE; + +SDL_Surface *text_screen=NULL, *text_image=NULL, *text_image_inv=NULL, *text_background=NULL; //, *text_window_background=NULL; + +static Uint32 menu_inv_color=0, menu_win0_color=0, menu_win1_color=0; +static Uint32 menu_barra0_color=0, menu_barra1_color=0; +static Uint32 menu_win0_color_base=0, menu_win1_color_base=0; + +void write_text_pos(int x, int y, char * str); +void write_num(int x, int y, int v); +int menu_msg_pos=330; +Uint32 menu_msg_time; + +int menu_moving=1; + +static int DelayAndEvents(Uint32 msec) +{ + static int exitnow=0; + int i; + for(i=msec/10;(i)&&(!exitnow);i--) + { + SDL_Event e; + while(SDL_PollEvent(&e)) exitnow=1; + SDL_Delay(10); + } + return exitnow; +} + +void menu_raise(void) +{ + int i; + for(i=64;i>=0;i-=4) + { +#ifdef USE_MENU_MUSIC + Mix_VolumeMusic(96-(i<<1)); +#endif +#ifdef DREAMCAST + vid_waitvbl(); +#else + SDL_Delay(50); +#endif + text_draw_background(); + fade16(text_screen,i); + text_flip(); + } +} + +void menu_unraise(void) +{ + int i; + for(i=0;i<=64;i+=4) + { +#ifdef USE_MENU_MUSIC + Mix_VolumeMusic(96-(i<<1)); +#endif +#ifdef DREAMCAST + vid_waitvbl(); +#else + SDL_Delay(50); +#endif + text_draw_background(); + fade16(text_screen,i); + text_flip(); + } +} + + +static __inline__ void update_window_color(void) +{ + static int cambio=0; + static int spin=0; + + Uint8 r,g,b; + int cambio2=cambio>>3; + SDL_GetRGB(menu_win0_color_base,text_screen->format,&r,&g,&b); + if (((int)r)-cambio2>0) r-=cambio2; + else r=0; + if (((int)g)-cambio2>0) g-=cambio2; + else g=0; + if (((int)b)-cambio2>0) b-=cambio2; + else b=0; + menu_win0_color=SDL_MapRGB(text_screen->format,r,g,b); + SDL_GetRGB(menu_win1_color_base,text_screen->format,&r,&g,&b); + if (((int)r)-cambio>0) r-=cambio; + else r=0; + if (((int)g)-cambio>0) g-=cambio; + else g=0; + if (((int)b)-cambio>0) b-=cambio; + else b=0; + menu_win1_color=SDL_MapRGB(text_screen->format,r,g,b); + if (spin) + { + if (cambio<=0) spin=0; + else cambio-=4; + } + else + { + if (cambio>=32) spin=1; + else cambio+=4; + } +} + +void text_draw_menu_msg() +{ +/* + Uint32 now=SDL_GetTicks(); + menu_msg_pos=330-((now-menu_msg_time)&0x7); +*/ + if (menu_msg_posw+text_background->w-1; + int h=text_screen->h+text_background->h-1; + + if (menu_moving) + { + if (pos_x>=0) pos_x=-screen->w; + else pos_x++; + if (pos_y>=0) pos_y=-screen->h; + else pos_y++; + } + + for(i=pos_x;iw) + for(j=pos_y;jh) + { + r.x=i; + r.y=j; + r.w=text_background->w; + r.h=text_background->h; + SDL_BlitSurface(text_background,NULL,text_screen,&r); + } + if (menu_moving) + text_draw_menu_msg(); +} + +void text_draw_background() +{ + text_draw_real_background(); + if (menu_moving) + update_window_color(); +} + +void text_flip(void) +{ + static Uint32 t=0; + Uint32 now=SDL_GetTicks(); +#ifdef DREAMCAST + if ((now-t)<10) +#else + if ((now-t)<30) +#endif + SDL_Delay(now-t); + t=now; +#ifdef USE_GL +// texture_buffer=text_screen->pixels; +SDL_BlitSurface(text_screen,NULL,screen,NULL); + videogl_flip(SDL_FALSE); +#else + SDL_BlitSurface(text_screen,NULL,screen,NULL); + SDL_Flip(screen); +#endif +} + + +static void obten_colores(void) +{ + FILE *f=fopen(DATA_PREFIX "colors.txt", "rt"); + if (f) + { + Uint32 r,g,b; + fscanf(f,"menu_inv_color=0x%X,0x%X,0x%X\n",&r,&g,&b); + menu_inv_color=SDL_MapRGB(text_screen->format,r,g,b); + fscanf(f,"menu_win0_color=0x%X,0x%X,0x%X\n",&r,&g,&b); + menu_win0_color=SDL_MapRGB(text_screen->format,r,g,b); + fscanf(f,"menu_win1_color=0x%X,0x%X,0x%X\n",&r,&g,&b); + menu_win1_color=SDL_MapRGB(text_screen->format,r,g,b); + fscanf(f,"menu_barra0_color=0x%X,0x%X,0x%X\n",&r,&g,&b); + menu_barra0_color=SDL_MapRGB(text_screen->format,r,g,b); + fscanf(f,"menu_barra1_color=0x%X,0x%X,0x%X\n",&r,&g,&b); + menu_barra1_color=SDL_MapRGB(text_screen->format,r,g,b); + fclose(f); + } + else + { + menu_inv_color=SDL_MapRGB(text_screen->format, 0x20, 0x20, 0x40); + menu_win0_color=SDL_MapRGB(text_screen->format, 0x10, 0x08, 0x08); + menu_win1_color=SDL_MapRGB(text_screen->format, 0x20, 0x10, 0x10); + menu_barra0_color=SDL_MapRGB(text_screen->format, 0x30, 0x20, 0x20); + menu_barra1_color=SDL_MapRGB(text_screen->format, 0x50, 0x40, 0x40); + } + menu_win0_color_base=menu_win0_color; + menu_win1_color_base=menu_win1_color; +} + +void init_text(int splash) +{ + +#ifdef DREAMCAST + SDL_DC_EmulateKeyboard(SDL_TRUE); + SDL_DC_EmulateMouse(SDL_FALSE); +#endif + if (!text_screen) + { +#ifdef USE_GL +// text_screen=SDL_CreateRGBSurface(0,256,256,16,0xf800,0x07e0,0x001f,0); + void *buf_=calloc((256*256*2)+64,1); + void *buf=((void *)(((((unsigned)buf_)/32)+1)*32)); + text_screen=SDL_CreateRGBSurfaceFrom(buf,256,256,16,SNES4ALL_SCREEN_PITCH,0xf800,0x07e0,0x001f,0); +#else + text_screen=SDL_DisplayFormat(screen); +#endif + if (text_screen==NULL) + { + puts("No se pudo crear el SDL_Surface text_screen"); + exit(-1); + } + } + if (!text_image) + { + SDL_Surface *tmp=SDL_LoadBMP(MENU_FILE_TEXT); + if (tmp==NULL) + { + puts("No se pudo cargar " MENU_FILE_TEXT); + exit(-1); + } + text_image=SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + SDL_SetColorKey(text_image,(SDL_SRCCOLORKEY | SDL_RLEACCEL),SDL_MapRGB(text_image -> format, 0, 0, 0)); + } + if (!text_image_inv) + { + SDL_Surface *tmp=SDL_LoadBMP(MENU_FILE_TEXT_INV); + if (tmp==NULL) + { + puts("No se pudo crear el SDL_Surface text_screen o cargar " MENU_FILE_TEXT_INV); + exit(-1); + } + text_image_inv=SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + SDL_SetColorKey(text_image_inv,(SDL_SRCCOLORKEY | SDL_RLEACCEL),SDL_MapRGB(text_image -> format, 0, 0, 0)); + } + if (!text_background) + { + SDL_Surface *tmp=SDL_LoadBMP(MENU_FILE_BACKGROUND); + if (tmp==NULL) + { + puts("No se pudo cargar " MENU_FILE_BACKGROUND); + exit(-3); + } + text_background=SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + } +/* + if (!text_window_background) + { + SDL_Surface *tmp=SDL_LoadBMP(MENU_FILE_WINDOW); + if (tmp==NULL) + { + puts("No se pudo cargar " MENU_FILE_WINDOW); + exit(-4); + } + text_window_background=SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + } +*/ +#if !defined(DEBUG_FRAMESKIP) && !defined(AUTO_EVENTS) && !defined(AUTOLOAD) && !defined(DEBUG_TILECACHE) && !defined(PROFILER_SNES4ALL) + if (splash) + { + SDL_Event ev; + int toexit=0; + SDL_Surface *sur; + SDL_Rect r; + int i,j; + SDL_Surface *tmp=SDL_LoadBMP(MENU_FILE_SPLASH); + if (tmp==NULL) + { + puts("No se pudo cargar " MENU_FILE_SPLASH); + exit(-6); + } + sur = SDL_DisplayFormat(tmp); + SDL_FreeSurface(tmp); + sound_play_menu_music(); + r.x=(text_screen->w - sur->w)/2; + r.y=(text_screen->h - sur->h)/2; + r.h=sur->w; + r.w=sur->h; + SDL_FillRect(text_screen,NULL,0xFFFFFFFF); + while(SDL_PollEvent(&ev)) SDL_Delay(50); + for (i=128;(i>-8)&&(!toexit);i-=8) + { +#ifdef DREAMCAST + vid_waitvbl(); + while(SDL_PollEvent(&ev)) toexit=1; +#else + toexit=DelayAndEvents(50); +#endif + SDL_BlitSurface(sur,NULL,text_screen,&r); + fade16(text_screen,i); + text_flip(); + } + if (!toexit) { +#ifdef DREAMCAST + toexit=DelayAndEvents(4100); +#else + toexit=DelayAndEvents(2300); +#endif + } + for(i=0;(i<128)&&(!toexit);i+=16) + { +#ifdef DREAMCAST + vid_waitvbl(); + while(SDL_PollEvent(&ev)) toexit=1; +#else + toexit=DelayAndEvents(50); +#endif + SDL_BlitSurface(sur,NULL,text_screen,&r); + fade16(text_screen,i); + text_flip(); + } + SDL_FreeSurface(sur); + for(i=128;(i>-8)&&(!toexit);i-=8) + { +#ifdef DREAMCAST + vid_waitvbl(); + while(SDL_PollEvent(&ev)) toexit=1; +#else + toexit=DelayAndEvents(50); +#endif + text_draw_background(); + fade16(text_screen,i); + text_flip(); + } + + } + else +#endif + { + text_draw_background(); + text_flip(); + } + if (splash) + { + obten_colores(); + menu_msg_time=SDL_GetTicks(); + } +} + + +void quit_text(void) +{ +/* + SDL_FreeSurface(text_image); + SDL_FreeSurface(text_background); +// SDL_FreeSurface(text_window_background); + SDL_FreeSurface(text_screen); +*/ +} + +static void write_text_pos_common(int x, int y, char * str, SDL_Surface *txt_scr) +{ + int i, c; + SDL_Rect src, dest; + +#ifndef NORES256 + x-=4; +#endif + + for (i = 0; i < strlen(str); i++) + { + c = -1; + + if (str[i] >= '0' && str[i] <= '9') + c = str[i] - '0'; + else if (str[i] >= 'A' && str[i] <= 'Z') + c = str[i] - 'A' + 10; + else if (str[i] >= 'a' && str[i] <= 'z') + c = str[i] - 'a' + 36; + else if (str[i] == '#') + c = 62; + else if (str[i] == '=') + c = 63; + else if (str[i] == '.') + c = 64; + else if (str[i] == '_') + c = 68; + else if (str[i] == '-') + c = 68; + else if (str[i] == '/') + c = 65; + else if (str[i] == ',') + c = 66; + else if (str[i] == ':') + c = 67; + + if (c >= 0) + { + src.x = c * 8; + src.y = 0; + src.w = 8; + src.h = 8; + + dest.x = x + (i * 8); + dest.y = y; + dest.w = 8; + dest.h = 8; + + SDL_BlitSurface(txt_scr, &src, + text_screen, &dest); + } + } +} + +void write_text_pos(int x, int y, char * str) +{ + write_text_pos_common(x,y,str,text_image); +} + +void write_text_pos_inv(int x, int y, char * str) +{ + write_text_pos_common(x,y,str,text_image_inv); +} + +static void write_text_common(int x, int y, int offs, char * str, SDL_Surface *txt_scr) +{ + int i, c; + SDL_Rect src, dest; + +#ifndef NORES256 + x-=4; +#endif + for (i = 0; i < strlen(str); i++) + { + c = -1; + + if (str[i] >= '0' && str[i] <= '9') + c = str[i] - '0'; + else if (str[i] >= 'A' && str[i] <= 'Z') + c = str[i] - 'A' + 10; + else if (str[i] >= 'a' && str[i] <= 'z') + c = str[i] - 'a' + 36; + else if (str[i] == '#') + c = 62; + else if (str[i] == '=') + c = 63; + else if (str[i] == '.') + c = 64; + else if (str[i] == '_') + c = 68; + else if (str[i] == '-') + c = 68; + else if (str[i] == '/') + c = 65; + else if (str[i] == ',') + c = 66; + else if (str[i] == ':') + c = 67; + else if (str[i] == '(') + c = 69; + else if (str[i] == ')') + c = 70; + + if (c >= 0) + { + src.x = c * 8; + src.y = 0; + src.w = 8; + src.h = 8; + + dest.x = offs +((x + i) * 8); + dest.y = offs + (y * 8); //10; + dest.w = 8; + dest.h = 8; + + SDL_BlitSurface(txt_scr, &src, + text_screen, &dest); + } + } +} + +void write_text(int x, int y, char * str) +{ + write_text_common(x,y,0,str,text_image); +} + +/* Write text, inverted: */ + +void write_text_inv(int x, int y, char *str) +{ + write_text_common(x, y, 0, str,text_image_inv); +} + +void write_text_offs(int offs,int x, int y, char *str) +{ + write_text_common(x, y, offs, str,text_image_inv); +} + +static void draw_box(SDL_Rect *src) { + SDL_Rect dest; + dest.x = src->x; + dest.y = src->y; + dest.w = src->w; + dest.h = 1; + SDL_FillRect(text_screen, &dest, menu_inv_color); + dest.x = src->x; + dest.y = src->y+src->h-1; + dest.w = src->w; + dest.h = 1; + SDL_FillRect(text_screen, &dest, menu_inv_color); + dest.x = src->x; + dest.y = src->y; + dest.w = 1; + dest.h = src->h; + SDL_FillRect(text_screen, &dest, menu_inv_color); + dest.x = src->x+src->w-1; + dest.y = src->y; + dest.w = 1; + dest.h = src->h; + SDL_FillRect(text_screen, &dest, menu_inv_color); +} + +void write_text_sel(int x, int y, char * str) +{ + SDL_Rect dest; + +#ifndef NORES256 + x-=4; +#endif + dest.x = (x * 8) -2 ; + dest.y = (y * 8) /*10*/ - 2; + dest.w = (strlen(str) * 8) + 4; + dest.h = 12; + +#if 0 + SDL_FillRect(text_screen, &dest, menu_inv_color); +#else + draw_box(&dest); +#endif + +#ifndef NORES256 + x+=4; +#endif + write_text_common(x, y, 0, str,text_image_inv); +} + +void write_text_sel3(int x, int y, char * str) +{ + SDL_Rect dest; + +#ifndef NORES256 + x-=4; +#endif + dest.x = (x * 8) -2 ; + dest.y = (y * 8) /*10*/ - 2; + dest.w = (strlen(str) * 8) + 4; + dest.h = 12; + +#if 0 + SDL_FillRect(text_screen, &dest, menu_inv_color); +#else + draw_box(&dest); +#endif + +#ifndef NORES256 + x+=4; +#endif +#if 0 + write_text_common(x, y, 0, str,text_image_inv); +#else + write_text_common(x, y, 0, str,text_image); +#endif +} + + +void write_text_sel2(int x, int y, char * str) +{ + SDL_Rect dest; + +#ifndef NORES256 + x-=4; +#endif + dest.x = (x * 8) -2 ; + dest.y = (y * 8) /*10*/ - 2; + dest.w = (strlen(str) * 8); + dest.h = 12; + +#if 0 + SDL_FillRect(text_screen, &dest, menu_inv_color); +#else + draw_box(&dest); +#endif + +#ifndef NORES256 + x+=4; +#endif +#if 0 + write_text_common(x, y, str,text_image_inv); +#else + write_text_common(x, y, 0, str,text_image); +#endif +} + + +/* Write text, horizontally centered... */ + +void write_centered_text(int y, char * str) +{ + write_text(20 - (strlen(str) / 2), y/2, str); +} + +void write_centered_text_inv(int y, char * str) +{ + write_text_inv(20 - (strlen(str) / 2), y/2, str); +} + + +/* Write numbers on the option screen: */ + +void write_num(int x, int y, int v) +{ + char str[24]; + + sprintf(str, "%d", v); + write_text(x, y, str); +} + +void write_num_inv(int x, int y, int v) +{ + char str[24]; + + sprintf(str, "%d", v); + write_text_inv(x, y, str); +} + +void text_draw_barra(int x, int y, int w, int h, int per, int max) +{ + SDL_Rect dest; + dest.x=x-1; + dest.y=y-1; + dest.w=w+2; + dest.h=h+2; + SDL_FillRect(text_screen, &dest, menu_barra0_color); + dest.x=x; + dest.y=y; + dest.h=h; + dest.w=(w*per)/max; + SDL_FillRect(text_screen, &dest, menu_barra1_color); +} + +void text_draw_window(int x, int y, int w, int h, char *title) +{ +#ifndef NORES256 + x-=4*8; +#endif + if (x>=SNES4ALL_SCREEN_WIDTH || y>=SNES4ALL_SCREEN_HEIGHT) + return; + if (w+x>SNES4ALL_SCREEN_WIDTH) + w=SNES4ALL_SCREEN_WIDTH-x; + if (h+y>SNES4ALL_SCREEN_HEIGHT) + h=SNES4ALL_SCREEN_HEIGHT-h; + + int i,j; + int r8x = x / 8; + int r8y = y / 8; + int rx = r8x * 8; + int ry = r8y * 8; +#ifdef NORES256 + int r32w = w / 32; + int rw = r32w * 32; + int r8w = rw / 8; +#else + int r32w = w / 24; + int rw = r32w * 24; + int r8w = (rw / 8)+4; + rw+=4; +#endif + int r24h = h / 24; + int rh = r24h * 24; + + + SDL_Rect dest; +/* + dest.x = rx + 6; + dest.y = ry - 4; + dest.w = rw + 6; + dest.h = rh + 18; + SDL_FillRect(text_screen, &dest, menu_win0_color); +*/ + + dest.x = rx - 2; + dest.y = ry - 10; //12; + dest.w = rw + 4; + dest.h = 12; //rh + 14; //16; + SDL_FillRect(text_screen, &dest, menu_win1_color); + + + dest.x = rx - 2; + dest.y = ry - 10; + dest.w = 2; + dest.h = rh + 14 + 8; + SDL_FillRect(text_screen, &dest, menu_win1_color); + + dest.x = rx + rw; + dest.y = ry - 10; + dest.w = 2; + dest.h = rh + 14 + 8; + SDL_FillRect(text_screen, &dest, menu_win1_color); + + dest.x = rx - 2; + dest.y = ry + rh + 2 + 8; + dest.w = rw + 4; + dest.h = 2; + SDL_FillRect(text_screen, &dest, menu_win1_color); + + +/* + for(i=0;iSNES4ALL_SCREEN_HEIGHT) + rh=SNES4ALL_SCREEN_HEIGHT-ry; + if (rypixels; + buf=(Uint16 *)&buf[rx+(ry*SNES4ALL_SCREEN_WIDTH)]; + register unsigned dx=SNES4ALL_SCREEN_WIDTH-rw; + for(j=0;j +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define MENU_FILE_SPLASH DATA_PREFIX "splash.bmp" +#define MENU_FILE_BACKGROUND DATA_PREFIX "background.bmp" +#define MENU_FILE_WINDOW DATA_PREFIX "window.bmp" +#define MENU_FILE_TEXT DATA_PREFIX "text.bmp" +#define MENU_FILE_TEXT_INV DATA_PREFIX "text2.bmp" +#ifdef DREAMCAST +//#define MENU_DIR_DEFAULT "/cd" +#define MENU_DIR_DEFAULT "/" +#else +#define MENU_DIR_DEFAULT "." +#endif + +void text_draw_background(); +void init_text(int splash); +void quit_text(void); +void write_text(int x, int y, char * str); +void write_text_inv(int x, int y, char * str); +void write_text_sel(int x, int y, char * str); +void write_text_sel2(int x, int y, char * str); +void write_text_sel3(int x, int y, char * str); +void write_centered_text(int y, char * str); +void write_centered_text_inv(int y, char * str); +void write_num(int x, int y, int v); +void write_num_inv(int x, int y, int v); +void write_text_pos(int x, int y, char * str); +void write_text_pos_inv(int x, int y, char * str); +void text_draw_barra(int x, int y, int w, int h, int per, int max); +void text_draw_window(int x, int y, int w, int h, char *title); +void text_draw_loading(int per, int max); +void text_draw_saving(int per, int max); +void text_draw_menu_msg(); +void text_flip(void); +void menu_raise(void); +void menu_unraise(void); + + +int run_mainMenu(); +int run_menuLoad(); +int run_menuGame(); +int run_menuControl(); +int run_menuSave(); + +#ifdef __cplusplus +} +#endif diff --git a/src/menu/menu_load.cpp b/src/menu/menu_load.cpp new file mode 100644 index 0000000..49d9d0c --- /dev/null +++ b/src/menu/menu_load.cpp @@ -0,0 +1,466 @@ +#include +#include +#include + +#include "menu.h" +#include "sdlinterface.h" + +#include +#include +#include + +#ifdef WIN32 +#define bzero(A,B) memset(A,0,B) +#endif + +#define MAX_FILELEN 29 + +typedef struct{ + char d_name[MAX_FILELEN+2]; + char d_type; +}fichero; + +#ifdef DREAMCAST +#define chdir(A) fs_chdir(A) +#endif + +extern char snes4all_image_file[]; + +#ifdef NORES256 +char *text_str_load_separator="----------------------------------"; +#else +char *text_str_load_separator=" -----------------------------"; +#endif +char *text_str_load_dir="#DIR#"; +char *text_str_load_title=" Filemanager "; +fichero *text_dir_files=NULL; +int text_dir_num_files=0, text_dir_num_files_index=0; + +char *text_load=NULL; + +#define MAX_FILES_PER_DIR 1024 +#define SHOW_MAX_FILES 13 + +#ifdef DREAMCAST +#define chdir(A) fs_chdir(A) +static char actual_dir[128]; +#endif + + +static int min_in_dir=0, max_in_dir=SHOW_MAX_FILES; + +static int compare_names(fichero *a, fichero *b) +{ + return strcmp(a->d_name,b->d_name); +} + +static void copyCompleteName(char *dest, int n) +{ + char *src=text_dir_files[n].d_name; + if (strlen(src)d_name,MAX_FILELEN)) + { + if (indice==buscado) + { + strcpy(dest,actual->d_name); + break; + } + indice++; + } + } + closedir(d); + } + else + dest[0]=0; + } + +} + +static int checkFiles(void) +{ + char *buf=(char *)calloc(1,2046); + int i,max=text_dir_num_files; + int ret=(text_dir_num_files<1); + if (max>16) + max=16; + for(i=0;(i0;ind--) + if (actual_dir[ind]=='/') + { + actual_dir[ind]=0; + break; + } + d=opendir(actual_dir); + } + else +#endif + d=opendir(dir); + if (d==NULL) + return -1; + for(i=0;id_name,"."))||(!strcmp(actual->d_name,"kick.rom"))|| + (!strcmp(actual->d_name,"ip.bin"))||(!strcmp(actual->d_name,"1st_read.bin"))) + { + i--; + continue; + } + if (strlen(actual->d_name)>3) + { + char *final=(char *)&actual->d_name[strlen(actual->d_name)-3]; + if ((!strcmp(final,"ssn"))||(!strcmp(final,"SSN"))||(!strcmp(final,"srm"))||(!strcmp(final,"SRM"))||(!strcmp(final,"rtc"))||(!strcmp(final,"RTC"))) + { + i--; + continue; + } + } + bzero(text_dir_files[i].d_name,MAX_FILELEN+1); + strncpy(text_dir_files[i].d_name,actual->d_name,MAX_FILELEN); + if (strlen(text_dir_files[i].d_name)==MAX_FILELEN) + { + int jjg,indice=0; + for(jjg=0;jjgd_type & 4; +#endif + } + closedir(d); + text_dir_num_files=i; + +#ifndef DREAMCAST + chdir(dir); +#else + if (strcmp(dir,MENU_DIR_DEFAULT)) + { + if (strcmp(dir,"..")) + { + strcat(actual_dir,"/"); + strcat(actual_dir,dir); + } + } + chdir(actual_dir); + if (strcmp(actual_dir,MENU_DIR_DEFAULT)) + { + strcpy(text_dir_files[i].d_name,".."); + text_dir_files[i].d_type=4; + if (text_dir_num_files>0) + { + char *pptmp=(char *)calloc(1,256); + int tmptype=text_dir_files[0].d_type; + strcpy(pptmp,text_dir_files[0].d_name); + text_dir_files[0].d_type=text_dir_files[text_dir_num_files].d_type; + text_dir_files[text_dir_num_files].d_type=tmptype; + strcpy(text_dir_files[0].d_name,text_dir_files[text_dir_num_files].d_name); + strcpy(text_dir_files[text_dir_num_files].d_name,pptmp); + free(pptmp); + } + text_dir_num_files++; + } +#endif + + for(i=0;i=max_in_dir) + { + max_in_dir=text_dir_num_files_index+1; + min_in_dir=max_in_dir-SHOW_MAX_FILES; + } + if (max_in_dir>text_dir_num_files) + max_in_dir=text_dir_num_files-min_in_dir; + + + for (i=min_in_dir,j=1;i 0) + { + if (event.type == SDL_QUIT) + end=-1; + else + if (event.type == SDL_KEYDOWN) + { + sound_play_beep(); + switch(event.key.keysym.sym) + { + case SDLK_RIGHT: right=1; break; + case SDLK_LEFT: left=1; break; + case SDLK_UP: up=1; break; + case SDLK_DOWN: down=1; break; + case SDLK_RETURN: + case SDLK_LCTRL: hit0=1; break; + case SDLK_LALT: hit1=1; break; + case SDLK_TAB: + if (text_dir_num_files) + text_dir_num_files_index=text_dir_num_files-1; + break; + case SDLK_BACKSPACE: + text_dir_num_files_index=0; + break; + + } + if (hit0) + { + if ((text_dir_files[text_dir_num_files_index].d_type==4)||(!strcmp((char *)&text_dir_files[text_dir_num_files_index].d_name,"."))||(!strcmp((char *)&text_dir_files[text_dir_num_files_index].d_name,".."))) + { + char *tmp=(char *)calloc(1,512); + strcpy(tmp,text_dir_files[text_dir_num_files_index].d_name); + if (getFiles(tmp)) + end=-1; + free(tmp); + } + else + { + copyCompleteName(snes4all_image_file,text_dir_num_files_index); + end=1; + } + } + else if (hit1) + end=-1; + else if ((up)&&(text_dir_num_files_index>0)) + text_dir_num_files_index--; + else if ((down)&&(text_dir_num_files_index+1!=text_dir_num_files)) + text_dir_num_files_index++; + else if (left) + { + text_dir_num_files_index-=SHOW_MAX_FILES; + if (text_dir_num_files_index<0) + text_dir_num_files_index=0; + } + else if (right) + { + text_dir_num_files_index+=SHOW_MAX_FILES; + if (text_dir_num_files_index+1>=text_dir_num_files) + text_dir_num_files_index=text_dir_num_files-1; + } + } + } + + return end; +} + +static void raise_loadMenu() +{ + int i; + + text_draw_background(); + text_flip(); + for(i=0;i<10;i++) + { + text_draw_background(); + text_draw_window(80-64,(10-i)*24,160+64+64,220,text_str_load_title); + text_flip(); + } +} + +static void unraise_loadMenu() +{ + int i; + + for(i=9;i>=0;i--) + { + text_draw_background(); + text_draw_window(80-64,(10-i)*24,160+64+64,220,text_str_load_title); + text_flip(); + } + text_draw_background(); + text_flip(); +} + + +int getDefaultFiles(void) +{ +#ifdef DREAMCAST + strcpy(actual_dir,MENU_DIR_DEFAULT); +#endif + return(getFiles(MENU_DIR_DEFAULT)); +} + +int run_menuLoad() +{ + int end=0; + + if (text_dir_files==NULL) + end=getDefaultFiles(); + else + if (checkFiles()) + end=getDefaultFiles(); + +// text_dir_num_files_index=0; + + raise_loadMenu(); + while(!end) + { + draw_loadMenu(); + end=key_loadMenu(); + } + unraise_loadMenu(); + + return end; +} diff --git a/src/menu/menu_main.cpp b/src/menu/menu_main.cpp new file mode 100644 index 0000000..67f2586 --- /dev/null +++ b/src/menu/menu_main.cpp @@ -0,0 +1,592 @@ +#include +#include +#include + +#include "menu.h" +#include "sdlinterface.h" + +#ifdef DREAMCAST +extern int __sdl_dc_wait_vblank; +#endif + +static char *text_str_title=" SNES4ALL Beta2 "; +static char *text_str_load="Select ROM (X)"; +static char *text_str_save="SaveStates (Y)"; +static char *text_str_autosave="Save SRAM"; +static char *text_str_hw_render="HW Render"; +static char *text_str_throttle="Throttle "; +static char *text_str_frameskip="Frameskip"; +static char *text_str_transparency="Transparency"; +static char *text_str_raster="Raster"; +static char *text_str_25="25"; +static char *text_str_50="50"; +static char *text_str_75="75"; +static char *text_str_100="100"; +static char *text_str_0="0"; +static char *text_str_1="1"; +static char *text_str_2="2"; +static char *text_str_3="3"; +static char *text_str_4="4"; +static char *text_str_5="5"; +static char *text_str_auto="Auto"; +static char *text_str_sound="Sound"; +static char *text_str_on="On"; +static char *text_str_off="Off"; +static char *text_str_fast="Fast"; +static char *text_str_normal="Reg"; +static char *text_str_sync="Sync"; +static char *text_str_no="No"; +static char *text_str_0p="0/"; +static char *text_str_25p="25/"; +static char *text_str_50p="50/"; +static char *text_str_75p="75/"; +static char *text_str_100p="100/"; +#ifdef NORES256 +static char *text_str_separator="------------------------------"; +#else +static char *text_str_separator="-----------------------------"; +#endif +static char *text_str_reset="Reset (R)"; +static char *text_str_run="Run (L)"; +static char *text_str_exit="Exit - Reboot"; + +int mainMenu_case=-1; +extern int snes4all_raster; +extern int snes4all_throttle; +extern int snes4all_frameskip; +extern int snes4all_transparency; +extern int snes4all_sound_enable; +extern int snes4all_autosave; +extern int snes4all_hw_render; +extern int menu_moving; +extern char *rom_filename; +extern int snes4all_emulating; + +enum { MAIN_MENU_CASE_REBOOT, MAIN_MENU_CASE_LOAD, MAIN_MENU_CASE_RUN, MAIN_MENU_CASE_RESET, MAIN_MENU_CASE_CANCEL, MAIN_MENU_CASE_SAVE }; + +#include +static int list_files(void) +{ + int found=0; + DIR *d=opendir("/cd"); + unsigned i; + while(d!=NULL && !found) + { + struct dirent *actual=readdir(d); + if (actual==NULL) + break; + found++; + } + closedir(d); + return found; +} + +static void draw_mainMenu(int c) +{ + static int b=0; + int bb=(b&3); //(b%6)/3; + + text_draw_background(); + text_draw_window(40,24,260,200+8,text_str_title); + write_text(6,4,text_str_separator); + if ((c==0)&&(bb)) + write_text_sel(6,5,text_str_load); + else + write_text(6,5,text_str_load); + + write_text(6,6,text_str_separator); + if ((c==1)&&(bb)) + write_text_sel(6,7,text_str_save); + else + write_text(6,7,text_str_save); + write_text(6,8,text_str_separator); + + write_text(6,9,text_str_throttle); + if ((snes4all_throttle==0)&&((c!=2)||(bb))) + write_text_sel3(19,9,text_str_0); + else + write_text(19,9,text_str_0); + if ((snes4all_throttle==1)&&((c!=2)||(bb))) + write_text_sel3(21,9,text_str_25); + else + write_text(21,9,text_str_25); + if ((snes4all_throttle==2)&&((c!=2)||(bb))) + write_text_sel3(24,9,text_str_50); + else + write_text(24,9,text_str_50); + if ((snes4all_throttle==3)&&((c!=2)||(bb))) + write_text_sel3(27,9,text_str_75); + else + write_text(27,9,text_str_75); + if ((snes4all_throttle==4)&&((c!=2)||(bb))) + write_text_sel3(30,9,text_str_100); + else + write_text(30,9,text_str_100); + + write_text(6,11,text_str_frameskip); + if ((snes4all_frameskip==0)&&((c!=3)||(bb))) + write_text_sel3(19,11,text_str_0); + else + write_text(19,11,text_str_0); + if ((snes4all_frameskip==1)&&((c!=3)||(bb))) + write_text_sel3(21,11,text_str_1); + else + write_text(21,11,text_str_1); + if ((snes4all_frameskip==2)&&((c!=3)||(bb))) + write_text_sel3(23,11,text_str_2); + else + write_text(23,11,text_str_2); + if ((snes4all_frameskip==3)&&((c!=3)||(bb))) + write_text_sel3(25,11,text_str_3); + else + write_text(25,11,text_str_3); + if ((snes4all_frameskip==4)&&((c!=3)||(bb))) + write_text_sel3(27,11,text_str_4); + else + write_text(27,11,text_str_4); + if ((snes4all_frameskip==5)&&((c!=3)||(bb))) + write_text_sel3(29,11,text_str_5); + else + write_text(29,11,text_str_5); + if ((snes4all_frameskip==-1)&&((c!=3)||(bb))) + write_text_sel3(31,11,text_str_auto); + else + write_text(31,11,text_str_auto); + + write_text(6,13,text_str_transparency); + if ((snes4all_transparency==0)&&((c!=4)||(bb))) + write_text_sel3(19,13,text_str_off); + else + write_text(19,13,text_str_off); + if ((snes4all_transparency!=0)&&((c!=4)||(bb))) + write_text_sel3(25,13,text_str_on); + else + write_text(25,13,text_str_on); + + write_text(6,15,text_str_raster); + if ((snes4all_raster==0)&&((c!=5)||(bb))) + write_text_sel2(19,15,text_str_0p); + else + write_text(19,15,text_str_0p); + if ((snes4all_raster==1)&&((c!=5)||(bb))) + write_text_sel2(21,15,text_str_25p); + else + write_text(21,15,text_str_25p); + if ((snes4all_raster==2)&&((c!=5)||(bb))) + write_text_sel2(24,15,text_str_50p); + else + write_text(24,15,text_str_50p); + if ((snes4all_raster==3)&&((c!=5)||(bb))) + write_text_sel2(27,15,text_str_75p); + else + write_text(27,15,text_str_75p); + if ((snes4all_raster==4)&&((c!=5)||(bb))) + write_text_sel2(30,15,text_str_100p); + else + write_text(30,15,text_str_100p); + + write_text(6,17,text_str_sound); + if ((snes4all_sound_enable==0)&&((c!=6)||(bb))) + write_text_sel3(19,17,text_str_no); + else + write_text(19,17,text_str_no); + if ((snes4all_sound_enable==1)&&((c!=6)||(bb))) + write_text_sel3(22,17,text_str_fast); + else + write_text(22,17,text_str_fast); + if ((snes4all_sound_enable==2)&&((c!=6)||(bb))) + write_text_sel3(27,17,text_str_normal); + else + write_text(27,17,text_str_normal); + if ((snes4all_sound_enable==3)&&((c!=6)||(bb))) + write_text_sel3(31,17,text_str_sync); + else + write_text(31,17,text_str_sync); + + write_text(6,19,text_str_autosave); + if ((!snes4all_autosave)&&((c!=7)||(bb))) + write_text_sel3(19,19,text_str_off); + else + write_text(19,19,text_str_off); + if ((snes4all_autosave)&&((c!=7)||(bb))) + write_text_sel3(25,19,text_str_on); + else + write_text(25,19,text_str_on); + + +#ifdef USE_GL + write_text(6,21,text_str_hw_render); + if ((!snes4all_hw_render)&&((c!=8)||(bb))) + write_text_sel3(19,21,text_str_off); + else + write_text(19,21,text_str_off); + if ((snes4all_hw_render)&&((c!=8)||(bb))) + write_text_sel3(25,21,text_str_on); + else + write_text(25,21,text_str_on); + + write_text(6,22,text_str_separator); + if ((c==9)&&(bb)) + write_text_sel(6,23,text_str_reset); + else + write_text(6,23,text_str_reset); + + write_text(6,24,text_str_separator); + if ((c==10)&&(bb)) + write_text_sel(6,25,text_str_run); + else + write_text(6,25,text_str_run); + + write_text(6,26,text_str_separator); + if ((c==11)&&(bb)) + write_text_sel(6,27,text_str_exit); + else + write_text(6,27,text_str_exit); +#else + write_text(6,20,text_str_separator); + if ((c==8)&&(bb)) + write_text_sel(6,21,text_str_reset); + else + write_text(6,21,text_str_reset); + + write_text(6,22,text_str_separator); + if ((c==9)&&(bb)) + write_text_sel(6,23,text_str_run); + else + write_text(6,23,text_str_run); + write_text(6,24,text_str_separator); + + write_text(6,25,text_str_separator); + if ((c==10)&&(bb)) + write_text_sel(6,26,text_str_exit); + else + write_text(6,26,text_str_exit); + write_text(6,27,text_str_separator); +#endif + + text_flip(); + b++; +} + +static int key_mainMenu(int *cp) +{ + int back_c=-1; + int c=(*cp); + int end=0; + int left=0, right=0, up=0, down=0, hit0=0, hit1=0, hit2=0, hit3=0, hit4=0, hit5=0; + SDL_Event event; + + while (SDL_PollEvent(&event) > 0) + { + if (event.type == SDL_QUIT) + { + mainMenu_case=MAIN_MENU_CASE_REBOOT; + end=-1; + } + else + if (event.type == SDL_KEYDOWN) + { + sound_play_beep(); + switch(event.key.keysym.sym) + { + case SDLK_RIGHT: right=1; break; + case SDLK_LEFT: left=1; break; + case SDLK_UP: up=1; break; + case SDLK_DOWN: down=1; break; + case SDLK_RETURN: + case SDLK_LCTRL: hit0=1; break; + case SDLK_LALT: hit1=1; break; + case SDLK_TAB: hit2=1; break; + case SDLK_LSHIFT: hit3=1; break; + case SDLK_SPACE: hit4=1; break; + case SDLK_BACKSPACE: hit5=1; break; + } + if (hit1) + { + mainMenu_case=MAIN_MENU_CASE_CANCEL; + end=1; + } + else if (hit2) + { + back_c=c; + hit0=1; +#ifdef USE_GL + c=9; +#else + c=8; +#endif + } + else if (hit3) + { + mainMenu_case=MAIN_MENU_CASE_LOAD; + end=1; + } + else if (hit4) + { + mainMenu_case=MAIN_MENU_CASE_SAVE; + end=1; + } + else if (hit5) + { + back_c=c; + hit0=1; +#ifdef USE_GL + c=10; +#else + c=9; +#endif + } + if (up) + { +#ifdef USE_GL + if (c>0) c=(c-1)%12; + else c=11; +#else + if (c>0) c=(c-1)%11; + else c=10; +#endif + } + else if (down) +#ifdef USE_GL + c=(c+1)%12; +#else + c=(c+1)%11; +#endif + else + switch(c) + { + case 0: // LOAD ROM + if (hit0) + { + mainMenu_case=MAIN_MENU_CASE_LOAD; + end=1; + } + break; + case 1: // SAVESTATE + if (hit0) + { + mainMenu_case=MAIN_MENU_CASE_SAVE; + end=1; + } + break; + case 2: // THROTTLE + if (left) + { + if (snes4all_throttle>0) + snes4all_throttle--; + else + snes4all_throttle=4; + } + else if (right) + { + if (snes4all_throttle<4) + snes4all_throttle++; + else + snes4all_throttle=0; + } + break; + case 3: // FRAMESKIP + if (left) + { + if (snes4all_frameskip>-1) + snes4all_frameskip--; + else + snes4all_frameskip=5; + } + else if (right) + { + if (snes4all_frameskip<5) + snes4all_frameskip++; + else + snes4all_frameskip=-1; + } + break; + case 4: // TRANSPARENCY + if ((left)||(right)) + snes4all_transparency=~snes4all_transparency; + break; + case 5: // RASTER + if (left) { + if (!snes4all_raster) snes4all_raster=4; + else snes4all_raster--; + } else if (right) { + if (snes4all_raster==4) snes4all_raster=0; + else snes4all_raster++; + } + break; + case 6: // SOUND + if (left) { + if (!snes4all_sound_enable) snes4all_sound_enable=3; + else snes4all_sound_enable--; + } else if (right) { + if (snes4all_sound_enable==3) snes4all_sound_enable=0; + else snes4all_sound_enable++; + } + break; + case 7: // SRAM + if ((left)||(right)) + snes4all_autosave=~snes4all_autosave; + break; + case 8: // RESET / HW_RENDER +#ifdef USE_GL + if ((left)||(right)) + snes4all_hw_render=~snes4all_hw_render; + + break; + case 9: +#endif + if (hit0) + { + mainMenu_case=MAIN_MENU_CASE_RESET; + end=1; + } + break; +#ifdef USE_GL + case 10:// RUN +#else + case 9: // RUN +#endif + if (hit0) + { + mainMenu_case=MAIN_MENU_CASE_RUN; + end=1; + } + break; +#ifdef USE_GL + case 11:// EXIT +#else + case 10:// EXIT +#endif + if (hit0) + { + mainMenu_case=MAIN_MENU_CASE_REBOOT; + end=1; + } + break; + } + if (back_c>=0) + { + c=back_c; + back_c=-1; + } + } + } + + + (*cp)=c; + return end; +} + +static void raise_mainMenu() +{ + int i; + + text_draw_background(); + text_flip(); + for(i=0;i<10;i++) + { + text_draw_background(); + text_draw_window(40,(10-i)*24,260,200,text_str_title); + text_flip(); + } +} + +static void unraise_mainMenu() +{ + int i; + + for(i=9;i>=0;i--) + { + text_draw_background(); + text_draw_window(40,(10-i)*24,260,200,text_str_title); + text_flip(); + } + text_draw_background(); + text_flip(); +} + +void drawNoROM(void) +{ + int i; + for(i=0;i<200;i++) + { + text_draw_background(); + text_draw_window(64,60,160,32,"ERROR"); + write_text(10,8,"No ROM selected"); + text_flip(); + } +} + +int run_mainMenu() +{ + static int c=0; + int end; + mainMenu_case=-1; + + menu_moving=1; + while(mainMenu_case<0) + { + raise_mainMenu(); + end=0; + while(!end) + { + draw_mainMenu(c); + end=key_mainMenu(&c); + } + unraise_mainMenu(); + switch(mainMenu_case) + { + case MAIN_MENU_CASE_SAVE: +#ifndef NO_SAVE_MENU + run_menuSave(); + extern int savestate_state; + if (savestate_state) + mainMenu_case=1; + else + mainMenu_case=-1; +#else + mainMenu_case=-1; +#endif + break; + case MAIN_MENU_CASE_LOAD: + run_menuLoad(); + mainMenu_case=-1; + break; + case MAIN_MENU_CASE_RESET: + if (snes4all_emulating) + { + mainMenu_case=2; + break; + } + case MAIN_MENU_CASE_RUN: + if (!rom_filename[0] && !snes4all_emulating) + { + mainMenu_case=-1; + drawNoROM(); + break; + } + mainMenu_case=1; + break; + case MAIN_MENU_CASE_REBOOT: + menu_unraise(); + SDL_Delay(333); + SDL_Quit(); +#if defined(DREAMCAST) && defined(REBOOT_DREAMCAST) + arch_reboot(); +#else + exit(0); +#endif + break; + default: + mainMenu_case=-1; + } + } + + menu_moving=0; + text_draw_background(); + text_draw_window(96,64,140,32,"-------"); + write_text(14,9,"Please wait"); + text_flip(); + + return mainMenu_case; +} diff --git a/src/menu/menu_save.cpp b/src/menu/menu_save.cpp new file mode 100644 index 0000000..c423a32 --- /dev/null +++ b/src/menu/menu_save.cpp @@ -0,0 +1,449 @@ + +#ifndef NO_MENU +#ifndef NO_SAVE_MENU + +#include +#include +#include + +#include "menu.h" +#include "sdlinterface.h" + +static char *text_str_title="SaveStates"; +static char *text_str_savestate="SaveState"; +static char *text_str_0="0"; +static char *text_str_1="1"; +static char *text_str_2="2"; +static char *text_str_3="3"; +#ifdef DREAMCAST_SAVE_VMU +static char *text_str_loadmem="Load From Memory (Y)"; +static char *text_str_savemem="Save To Memory (X)"; +static char *text_str_loadvmu="Load From VMU (L)"; +static char *text_str_savevmu="Save To VMU (R)"; +#else +static char *text_str_loadmem="Load State (Y)"; +static char *text_str_savemem="Save State (X)"; +#endif +static char *text_str_separator="----------------------"; +static char *text_str_exit="Main Menu (B)"; + +extern int snes4all_emulating; + +int saveMenu_n_savestate=0; +int saveMenu_case=-1; + +enum { SAVE_MENU_CASE_EXIT, SAVE_MENU_CASE_LOAD_MEM, SAVE_MENU_CASE_SAVE_MEM, SAVE_MENU_CASE_LOAD_VMU, SAVE_MENU_CASE_SAVE_VMU, SAVE_MENU_CASE_CANCEL }; + +static inline void draw_saveMenu(int c) +{ + static int b=0; + int bb=(b&3); //(b%6)/3; + + text_draw_background(); +#ifdef DREAMCAST_SAVE_VMU + text_draw_window(64,40,208,172,text_str_title); +#else + text_draw_window(64,40,208,128,text_str_title); +#endif + write_text(9,6,text_str_separator); + + write_text(9,7,text_str_savestate); + if ((saveMenu_n_savestate==0)&&((c!=0)||(bb))) + write_text_sel3(22,7,text_str_0); + else + write_text(22,7,text_str_0); + if ((saveMenu_n_savestate==1)&&((c!=0)||(bb))) + write_text_sel3(24,7,text_str_1); + else + write_text(24,7,text_str_1); + if ((saveMenu_n_savestate==2)&&((c!=0)||(bb))) + write_text_sel3(26,7,text_str_2); + else + write_text(26,7,text_str_2); + if ((saveMenu_n_savestate==3)&&((c!=0)||(bb))) + write_text_sel3(28,7,text_str_3); + else + write_text(28,7,text_str_3); + write_text(9,8,text_str_separator); + + write_text(9,10,text_str_separator); + + if ((c==1)&&(bb)) + write_text_sel(9,11,text_str_loadmem); + else + write_text(9,11,text_str_loadmem); + + write_text(9,12,text_str_separator); + + if ((c==2)&&(bb)) + write_text_sel(9,13,text_str_savemem); + else + write_text(9,13,text_str_savemem); + + write_text(9,14,text_str_separator); + +#ifdef DREAMCAST_SAVE_VMU + write_text(9,16,text_str_separator); + + if ((c==3)&&(bb)) + write_text_sel(9,17,text_str_loadvmu); + else + write_text(9,17,text_str_loadvmu); + + write_text(9,18,text_str_separator); + + if ((c==4)&&(bb)) + write_text_sel(9,19,text_str_savevmu); + else + write_text(9,19,text_str_savevmu); + + write_text(9,20,text_str_separator); + + write_text(9,22,text_str_separator); + + if ((c==5)&&(bb)) + write_text_sel(9,23,text_str_exit); + else + write_text(9,23,text_str_exit); + write_text(9,24,text_str_separator); +#else + write_text(9,16,text_str_separator); + + if ((c==5)&&(bb)) + write_text_sel(9,17,text_str_exit); + else + write_text(9,17,text_str_exit); + write_text(9,18,text_str_separator); +#endif + + text_flip(); + b++; +} + +static inline int key_saveMenu(int *cp) +{ + int c=(*cp); + int back_c=-1; + int end=0; + int left=0, right=0, up=0, down=0; + int hit0=0, hit1=0, hit2=0, hit3=0, hit4=0, hit5=0; + SDL_Event event; + + while (SDL_PollEvent(&event) > 0) + { + if (event.type == SDL_QUIT) + { + saveMenu_case=SAVE_MENU_CASE_EXIT; + end=-1; + } + else + if (event.type == SDL_KEYDOWN) + { + sound_play_beep(); + switch(event.key.keysym.sym) + { + case SDLK_d: + case SDLK_RIGHT: right=1; break; + case SDLK_a: + case SDLK_LEFT: left=1; break; + case SDLK_w: + case SDLK_UP: up=1; break; + case SDLK_s: + case SDLK_DOWN: down=1; break; + case SDLK_z: + case SDLK_RETURN: + case SDLK_e: + case SDLK_LCTRL: hit0=1; break; +#ifdef DREAMCAST_SAVE_VMU + case SDLK_2: + case SDLK_BACKSPACE: hit2=1; break; + case SDLK_1: + case SDLK_TAB: hit3=1; break; + case SDLK_x: + case SDLK_SPACE: hit4=1; break; + case SDLK_c: + case SDLK_LSHIFT: hit5=1; break; +#else + case SDLK_2: + case SDLK_BACKSPACE: hit3=1; break; + case SDLK_1: + case SDLK_TAB: hit2=1; break; + case SDLK_x: + case SDLK_SPACE: hit5=1; break; + case SDLK_c: + case SDLK_LSHIFT: hit4=1; break; +#endif + case SDLK_q: + case SDLK_LALT: hit1=1; break; + } + if (hit1) + { + saveMenu_case=SAVE_MENU_CASE_CANCEL; + end=1; + } + else if (hit2) + { + back_c=c; + c=3; + hit0=1; + } + else if (hit3) + { + back_c=c; + c=4; + hit0=1; + } + else if (hit4) + { + back_c=c; + c=1; + hit0=1; + } + else if (hit5) + { + back_c=c; + c=2; + hit0=1; + } + else if (up) + { + if (c>0) c=(c-1)%6; + else c=5; +#ifndef DREAMCAST_SAVE_VMU + if (c==4) c=2; +#endif + } + else if (down) + { + c=(c+1)%6; +#ifndef DREAMCAST_SAVE_VMU + if (c==3) c=5; +#endif + } + else + if (left) + { + if (saveMenu_n_savestate>0) + saveMenu_n_savestate--; + else + saveMenu_n_savestate=3; + } + else if (right) + { + if (saveMenu_n_savestate<3) + saveMenu_n_savestate++; + else + saveMenu_n_savestate=0; + } + switch(c) + { + case 0: + break; + case 1: + if (hit0) + { + saveMenu_case=SAVE_MENU_CASE_LOAD_MEM; + end=1; + } + break; + case 2: + if (hit0) + { + saveMenu_case=SAVE_MENU_CASE_SAVE_MEM; + end=1; + } + break; +#ifdef DREAMCAST_SAVE_VMU + case 3: + if (hit0) + { + saveMenu_case=SAVE_MENU_CASE_LOAD_VMU; + end=1; + } + break; + case 4: + if (hit0) + { + saveMenu_case=SAVE_MENU_CASE_SAVE_VMU; + end=1; + } + break; +#endif + case 5: + if (hit0) + { + saveMenu_case=SAVE_MENU_CASE_EXIT; + end=1; + } + break; + } + } + if (back_c>=0) + { + c=back_c; + back_c=-1; + } + } + + + (*cp)=c; + return end; +} + +static inline void raise_saveMenu() +{ + int i; + +// sound_play_beep(); + text_draw_background(); + text_flip(); + for(i=0;i<8;i++) + { + text_draw_background(); + text_draw_window(128-(8*i),(8-i)*24,144+(8*i),172,""); + text_flip(); + SDL_Delay(15); + } +} + +static inline void unraise_saveMenu() +{ + int i; + + for(i=7;i>=0;i--) + { + text_draw_background(); + text_draw_window(128-(8*i),(8-i)*24,144+(8*i),160,""); + text_flip(); + SDL_Delay(15); + } + text_draw_background(); + text_flip(); +} + +static void show_error(char *str) +{ + int i; + +// sound_play_beep(); + for(i=0;i<40;i++) + { +// menu_moving=0; + text_draw_background(); + text_draw_window(64,64,160,40,"ERROR !"); + write_text(9,9,str); + text_flip(); + } + SDL_Delay(2500); +} + + +void show_please_wait(char *title, SDL_Surface *scr) +{ + extern SDL_Surface *text_screen; + SDL_Surface *back=text_screen; +// menu_moving=0; +#ifndef USE_GL + if (scr) { + text_screen=scr; + } else +#endif + text_draw_background(); +// sound_play_beep(); +#ifndef USE_GL + if (scr) { + text_draw_window(64-8,64,172+24,32+16,title); + write_text_sel(12,10," Please wait "); + SDL_Flip(scr); + text_screen=back; + } else +#endif + { + text_draw_window(64,64,172,32,title); + write_text(12,9,"Please wait"); + text_flip(); + SDL_Delay(444); + } +} + +int run_menuSave() +{ + static int c=0; + int end; + saveMenu_case=-1; + +#if 0 + if (!snes4all_emulating) + { + show_error("No running"); + return 0; + } +#endif + + while(saveMenu_case<0) + { + raise_saveMenu(); + end=0; + while(!end) + { + draw_saveMenu(c); + end=key_saveMenu(&c); + } + unraise_saveMenu(); + switch(saveMenu_case) + { + case SAVE_MENU_CASE_LOAD_MEM: +// show_please_wait("Loading",NULL); + extern int savestate_state; +#ifndef USE_GL + savestate_state = -302; +#else + savestate_state = -102; +#endif + saveMenu_case=1; + break; + case SAVE_MENU_CASE_SAVE_MEM: +// show_please_wait("Saving",NULL); + extern int savestate_state; +#ifndef USE_GL + savestate_state = -301; +#else + savestate_state = -101; +#endif + saveMenu_case=1; + break; +#ifdef DREAMCAST_SAVE_VMU + case SAVE_MENU_CASE_LOAD_VMU: + show_please_wait("VMU Load",NULL); + if (loadstate_vmu(saveMenu_n_savestate)) + { + show_error("No VMU Saved"); + saveMenu_case=-1; + } + else + saveMenu_case=1; + break; + case SAVE_MENU_CASE_SAVE_VMU: + show_please_wait("VMU Save",NULL); + if (savestate_vmu(saveMenu_n_savestate)) + { + show_error("VMU Overflow"); + saveMenu_case=-1; + } + else + saveMenu_case=1; + break; +#endif + case SAVE_MENU_CASE_EXIT: + case SAVE_MENU_CASE_CANCEL: + saveMenu_case=1; + break; + default: + saveMenu_case=-1; + } + } + + return saveMenu_case; +} +#endif +#endif diff --git a/src/menu/msg.h b/src/menu/msg.h new file mode 100644 index 0000000..b4cc29b --- /dev/null +++ b/src/menu/msg.h @@ -0,0 +1,4 @@ + +static char *menu_msg=" SuperNintendo emulator for Dreamcast by Chui. GPL License "; + +#define MAX_SCROLL_MSG (-2500) diff --git a/src/mmu_handle/Makefile b/src/mmu_handle/Makefile new file mode 100644 index 0000000..67a56f4 --- /dev/null +++ b/src/mmu_handle/Makefile @@ -0,0 +1,33 @@ +TARGET = mmu_handle + +OPTFLAGS=-O2 -fomit-frame-pointer -g0 + +#KOS_CFLAGS+= -Ikos-patch/kernel/arch/dreamcast/include -I. -I$(KOS_BASE)/../kos-ports/include/SDL -I$(KOS_BASE)/../kos-ports/zlib-1.2.1 -I$(KOS_BASE)/../kos-ports/libpng-1.2.5 $(OPTFLAGS) +KOS_CFLAGS+= -Ikos-patch/kernel/arch/dreamcast/include -I. $(OPTFLAGS) -DDREAMCAST -DMMU_HANDLE_BEGINMEM=0 -DMMU_HANDLE_MAX=0x10000 + +#KOS_CFLAGS+= -DMMU_HANDLE_DEBUG + +KOS_CPPFLAGS+=${KOS_CFLAGS} + +all: $(TARGET).bin + +include $(KOS_BASE)/Makefile.rules + +.SRCS = main.cpp mmu_handle.cpp \ + +OBJS = $(.SRCS:.cpp=.o) damedato.o + +clean: + rm -f $(OBJS) $(TARGET).bin $(TARGET).elf + +$(TARGET).elf: $(OBJS) + $(KOS_CC) $(KOS_CFLAGS) $(KOS_LDFLAGS) -o $(TARGET).elf $(KOS_START) \ + $(OBJS) -lm $(OBJEXTRA) $(KOS_LIBS) + +$(TARGET).bin: $(TARGET).elf + $(KOS_OBJCOPY) -R .stack -O binary $(TARGET).elf $(TARGET).bin + + +run: $(TARGET).bin + $(KOS_LOADER) $(TARGET).bin + diff --git a/src/mmu_handle/kos-patch/addons/lib/dreamcast/libkglx.a b/src/mmu_handle/kos-patch/addons/lib/dreamcast/libkglx.a new file mode 100644 index 0000000000000000000000000000000000000000..8980810eb1accbd1344e62dc2f9332925a1cde80 GIT binary patch literal 399076 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

Fj&cj(m)1U2aa-HW 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 K@6}i$fp0&k+U*4waP%JNqT2LK_E4t-* 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 +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +static int init_percd(); +static int percd_done; + +/********************************************************************************/ +/* Low-level Joliet utils */ + +/* Joliet UCS is big endian */ +static void utf2ucs(uint8 * ucs, const uint8 * utf) { + int c; + + do { + c = *utf++; + if (c <= 0x7f) { + } else if (c < 0xc0) { + c = (c & 0x1f) << 6; + c |= (*utf++) & 0x3f; + } else { + c = (c & 0x0f) << 12; + c |= ((*utf++) & 0x3f) << 6; + c |= (*utf++) & 0x3f; + } + *ucs++ = c >> 8; + *ucs++ = c & 0xff; + } while (c); +} + +static void ucs2utfn(uint8 * utf, const uint8 * ucs, size_t len) { + int c; + + len = len / 2; + while (len) { + len--; + c = (*ucs++) << 8; + c |= *ucs++; + if (c == ';') break; + if (c <= 0x7f) { + *utf++ = c; + } else if (c <= 0x7ff) { + *utf++ = 0xc0 | (c >> 6); + *utf++ = 0x80 | (c & 0x3f); + } else { + *utf++ = 0xe0 | (c >> 12); + *utf++ = 0x80 | ((c >> 6) & 0x3f); + *utf++ = 0x80 | (c & 0x3f); + } + } + *utf = 0; +} + +static int ucscompare(const uint8 * isofn, const uint8 * normalfn, int isosize) { + int i, c0, c1 = 0; + + /* Compare ISO name */ + for (i=0; isector = -1; + mutex_unlock(cache_mutex); +} + +/* Graduate a block from its current position to the MRU end of the cache */ +static void bgrad_cache(cache_block_t **cache, int block) { + int i; + cache_block_t *tmp; + + /* Don't try it with the end block */ + if (block < 0 || block >= (NUM_CACHE_BLOCKS-1)) return; + + /* Make a copy and scoot everything down */ + tmp = cache[block]; + for (i=block; i<(NUM_CACHE_BLOCKS - 1); i++) + cache[i] = cache[i+1]; + cache[NUM_CACHE_BLOCKS-1] = tmp; +} + +/* Pulls the requested sector into a cache block and returns the cache + block index. Note that the sector in question may already be in the + cache, in which case it just returns the containing block. */ +static void iso_break_all(); +static int bread_cache(cache_block_t **cache, uint32 sector) { + int i, j, rv; + + rv = -1; + mutex_lock(cache_mutex); + + /* Look for a pre-existing cache block */ + for (i=NUM_CACHE_BLOCKS-1; i>=0; i--) { + if (cache[i]->sector == sector) { + bgrad_cache(cache, i); + rv = NUM_CACHE_BLOCKS - 1; + goto bread_exit; + } + } + + /* If not, look for an open cache slot; if we find one, use it */ + for (i=0; isector == -1) break; + } + + /* If we didn't find one, kick an LRU block out of cache */ + if (i >= NUM_CACHE_BLOCKS) { i = 0; } + + /* Load the requested block */ + j = cdrom_read_sectors(cache[i]->data, sector + 150, 1); + if (j < 0) { + //dbglog(DBG_ERROR, "fs_iso9660: can't read_sectors for %d: %d\n", + // sector+150, j); + if (j == ERR_DISC_CHG || j == ERR_NO_DISC) { + init_percd(); + } + rv = -1; + goto bread_exit; + } + cache[i]->sector = sector; + + /* Move it to the most-recently-used position */ + bgrad_cache(cache, i); + rv = NUM_CACHE_BLOCKS - 1; + + /* Return the new cache block index */ +bread_exit: + mutex_unlock(cache_mutex); + return rv; +} + +/* read data block */ +static int bdread(uint32 sector) { + return bread_cache(dcache, sector); +} + +/* read inode block */ +static int biread(uint32 sector) { + return bread_cache(icache, sector); +} + +/* Clear both caches */ +static void bclear() { + bclear_cache(dcache); + bclear_cache(icache); +} + +/********************************************************************************/ +/* Higher-level ISO9660 primitives */ + +/* Root FS session location (in sectors) */ +static uint32 session_base = 0; + +/* Root directory extent and size in bytes */ +static uint32 root_extent = 0, root_size = 0; + +/* Root dirent */ +static iso_dirent_t root_dirent; + + +/* Per-disc initialization; this is done every time it's discovered that + a new CD has been inserted. */ +static int init_percd() { + int i, blk; + CDROM_TOC toc; + + dbglog(DBG_NOTICE, "fs_iso9660: disc change detected\n"); + + /* Start off with no cached blocks and no open files*/ + iso_reset(); + + /* Locate the root session */ + if ((i = cdrom_reinit()) != 0) { + dbglog(DBG_ERROR, "fs_iso9660:init_percd: cdrom_reinit returned %d\n", i); + return -1; + } + if ((i = cdrom_read_toc(&toc, 0)) != 0) + return i; + if (!(session_base = cdrom_locate_data_track(&toc))) + return -1; + + /* Check for joliet extensions */ + joliet = 0; + for (i=1; i<=3; i++) { + blk = biread(session_base + i + 16 - 150); + if (blk < 0) return blk; + if (memcmp((char *)icache[blk]->data, "\02CD001", 6) == 0) { + joliet = isjoliet((char *)icache[blk]->data+88); + dbglog(DBG_NOTICE, " (joliet level %d extensions detected)\n", joliet); + if (joliet) break; + } + } + + /* If that failed, go after standard/RockRidge ISO */ + if (!joliet) { + /* Grab and check the volume descriptor */ + blk = biread(session_base + 16 - 150); + if (blk < 0) return i; + if (memcmp((char*)icache[blk]->data, "\01CD001", 6)) { + dbglog(DBG_ERROR, "fs_iso9660: disc is not iso9660\r\n"); + return -1; + } + } + + /* Locate the root directory */ + memcpy(&root_dirent, icache[blk]->data+156, sizeof(iso_dirent_t)); + root_extent = iso_733(root_dirent.extent); + root_size = iso_733(root_dirent.size); + + return 0; +} + +/* Compare an ISO9660 filename against a normal filename. This takes into + account the version code on the end and is not case sensitive. Also + takes into account the trailing period that some CD burning software + adds. */ +static int fncompare(const char *isofn, int isosize, const char *normalfn) { + int i; + + /* Compare ISO name */ + for (i=0; i 0) { + c = biread(dir_extent); + if (c < 0) return NULL; + + for (i=0; i<2048 && idata + i); + if (!de->length) break; + + /* Try the Joliet filename if the CD is a Joliet disc */ + if (joliet) { + if (!ucscompare((uint8 *)de->name, ucsname, de->name_len)) { + if (!((dir << 1) ^ de->flags)) + return de; + } + } else { + /* Assume no Rock Ridge name */ + rrnamelen = 0; + + /* Check for Rock Ridge NM extension */ + len = de->length - sizeof(iso_dirent_t) + + sizeof(de->name) - de->name_len; + pnt = (uint8*)de + sizeof(iso_dirent_t) + - sizeof(de->name) + de->name_len; + if ((de->name_len & 1) == 0) { + pnt++; len--; + } + while ((len >= 4) && ((pnt[3] == 1) || (pnt[3] == 2))) { + if (strncmp((char *)pnt, "NM", 2) == 0) { + rrnamelen = pnt[2] - 5; + strncpy(rrname, (char *)(pnt+5), rrnamelen); + rrname[rrnamelen] = 0; + } + len -= pnt[2]; + pnt += pnt[2]; + } + + /* Check the filename against the requested one */ + if (rrnamelen > 0) { + char *p = strchr(fn, '/'); + int fnlen; + + if (p) + fnlen = p - fn; + else + fnlen = strlen(fn); + + if (!strnicmp(rrname, fn, fnlen) && ! *(rrname + fnlen)) { + if (!((dir << 1) ^ de->flags)) + return de; + } + } else { + if (!fncompare(de->name, de->name_len, fn)) { + if (!((dir << 1) ^ de->flags)) + return de; + } + } + } + + i += de->length; + } + + dir_extent++; + size_left -= 2048; + } + + return NULL; +} + +/* Locate an ISO9660 object anywhere on the disc, starting at the root, + and expecting a fully qualified path name. This is analogous to find_object + but it searches with the path in mind. + + fn: object filename (relative to the passed directory) + dir: 0 if looking for a file, 1 if looking for a dir + dir_extent: directory extent to start with + dir_size: directory size (in bytes) + + It will return a pointer to a transient dirent buffer (i.e., don't + expect this buffer to stay around much longer than the call itself). + */ +static iso_dirent_t *find_object_path(const char *fn, int dir, iso_dirent_t *start) { + char *cur; + + /* If the object is in a sub-tree, traverse the trees looking + for the right directory */ + while ((cur = strchr(fn, '/'))) { + if (cur != fn) { + /* Note: trailing path parts don't matter since find_object + only compares based on the FN length on the disc. */ + start = find_object(fn, 1, iso_733(start->extent), iso_733(start->size)); + if (start == NULL) return NULL; + } + fn = cur + 1; + } + + /* Locate the file in the resulting directory */ + if (*fn) { + start = find_object(fn, dir, iso_733(start->extent), iso_733(start->size)); + return start; + } + else { + if (!dir) + return NULL; + else + return start; + } +} + +/********************************************************************************/ +/* File primitives */ + +/* File handles.. I could probably do this with a linked list, but I'm just + too lazy right now. =) */ +static struct { + uint32 first_extent; /* First sector */ + int dir; /* >0 if a directory */ + uint32 ptr; /* Current read position in bytes */ + uint32 size; /* Length of file in bytes */ + dirent_t dirent; /* A static dirent to pass back to clients */ + int broken; /* >0 if the CD has been swapped out since open */ +} fh[MAX_ISO_FILES]; + +/* Mutex for file handles */ +static mutex_t * fh_mutex; + +/* Break all of our open file descriptor. This is necessary when the disc + is changed so that we don't accidentally try to keep on doing stuff + with the old info. As files are closed and re-opened, the broken flag + will be cleared. */ +static void iso_break_all() { + int i; + + mutex_lock(fh_mutex); + for (i=0; i= MAX_ISO_FILES) + return 0; + + /* Fill in the file handle and return the fd */ + fh[fd].first_extent = iso_733(de->extent); + fh[fd].dir = (mode & O_DIR)?1:0; + fh[fd].ptr = 0; + fh[fd].size = iso_733(de->size); + fh[fd].broken = 0; + + return (void *)fd; +} + +/* Close a file or directory */ +void __kos__iso_close(void * h) { + file_t fd = (file_t)h; + + /* Check that the fd is valid */ + if (fd < MAX_ISO_FILES) { + /* No need to lock the mutex: this is an atomic op */ + fh[fd].first_extent = 0; + } +} + +ssize_t __kos__iso_get_first_sector(void *h){ + file_t fd = (file_t)h; + if (fd >= MAX_ISO_FILES || fh[fd].first_extent == 0 || fh[fd].broken) + return -1; + return fh[fd].first_extent+150; +} + +/* Read from a file */ +ssize_t __kos__iso_read(void * h, void *buf, size_t bytes) { + int rv, toread, thissect, c; + uint8 * outbuf; + file_t fd = (file_t)h; + + /* Check that the fd is valid */ + if (fd >= MAX_ISO_FILES || fh[fd].first_extent == 0 || fh[fd].broken) + return -1; + + rv = 0; + outbuf = (uint8 *)buf; + + /* Read zero or more sectors into the buffer from the current pos */ + while (bytes > 0) { + /* Figure out how much we still need to read */ + toread = (bytes > (fh[fd].size - fh[fd].ptr)) ? + fh[fd].size - fh[fd].ptr : bytes; + if (toread == 0) break; + + /* How much more can we read in the current sector? */ + thissect = 2048 - (fh[fd].ptr % 2048); + + /* If we're on a sector boundary and we have more than one + full sector to read, then short-circuit the cache here + and use the multi-sector reads from the CD unit (this + should theoretically be a lot faster) */ + /* XXX This code isn't actually faster, but I'm leaving it + here commented out in case we could find a better use + for it later than speed (i.e., preventing thread context + switches). */ + /* if (thissect == 2048 && toread >= 2048) { + // Round it off to an even sector count + thissect = toread / 2048; + toread = thissect * 2048; + + printf("cdrom: short-circuit read for %d sectors\n", + thissect); + + // Do the read + if (cdrom_read_sectors(outbuf, + fh[fd].first_extent + fh[fd].ptr/2048 + 150, + thissect) < 0) + { + // Something went wrong... + return -1; + } + } else { */ + toread = (toread > thissect) ? thissect : toread; + + /* Do the read */ + c = bdread(fh[fd].first_extent + fh[fd].ptr/2048); + if (c < 0) return -1; + memcpy(outbuf, dcache[c]->data + (fh[fd].ptr%2048), toread); + /* } */ + + /* Adjust pointers */ + outbuf += toread; + fh[fd].ptr += toread; + bytes -= toread; + rv += toread; + } + + return rv; +} + +/* Seek elsewhere in a file */ +off_t __kos__iso_seek(void * h, off_t offset, int whence) { + file_t fd = (file_t)h; + + /* Check that the fd is valid */ + if (fd>=MAX_ISO_FILES || fh[fd].first_extent==0 || fh[fd].broken) + return -1; + + /* Update current position according to arguments */ + switch (whence) { + case SEEK_SET: + fh[fd].ptr = offset; + break; + case SEEK_CUR: + fh[fd].ptr += offset; + break; + case SEEK_END: + fh[fd].ptr = fh[fd].size + offset; + break; + default: + return -1; + } + + /* Check bounds */ + if (fh[fd].ptr < 0) fh[fd].ptr = 0; + if (fh[fd].ptr > fh[fd].size) fh[fd].ptr = fh[fd].size; + + return fh[fd].ptr; +} + +/* Tell where in the file we are */ +off_t __kos__iso_tell(void * h) { + file_t fd = (file_t)h; + + if (fd>=MAX_ISO_FILES || fh[fd].first_extent==0 || fh[fd].broken) + return -1; + + return fh[fd].ptr; +} + +/* Tell how big the file is */ +static size_t iso_total(void * h) { + file_t fd = (file_t)h; + + if (fd>=MAX_ISO_FILES || fh[fd].first_extent==0 || fh[fd].broken) + return -1; + + return fh[fd].size; +} + +/* Helper function for readdir: post-processes an ISO filename to make + it a bit prettier. */ +static void fn_postprocess(char *fnin) { + char * fn = fnin; + + while (*fn && *fn != ';') { + *fn = tolower(*fn); + fn++; + } + *fn = 0; + + /* Strip trailing dots */ + if (fn > fnin && fn[-1] == '.') { + fn[-1] = 0; + } +} + +/* Read a directory entry */ +dirent_t *__kos__iso_readdir(void * h) { + int c; + iso_dirent_t *de; + + /* RockRidge */ + int len; + uint8 *pnt; + + file_t fd = (file_t)h; + + if (fd>=MAX_ISO_FILES || fh[fd].first_extent==0 || !fh[fd].dir || fh[fd].broken) + return NULL; + + /* Scan forwards until we find the next valid entry, an + end-of-entry mark, or run out of dir size. */ + c = -1; de = NULL; + while(fh[fd].ptr < fh[fd].size) { + /* Get the current dirent block */ + c = biread(fh[fd].first_extent + fh[fd].ptr/2048); + if (c < 0) return NULL; + + de = (iso_dirent_t *)(icache[c]->data + (fh[fd].ptr%2048)); + if (de->length) break; + + /* Skip to the next sector */ + fh[fd].ptr += 2048 - (fh[fd].ptr%2048); + } + if (fh[fd].ptr >= fh[fd].size) return NULL; + + /* If we're at the first, skip the two blank entries */ + if (!de->name[0] && de->name_len == 1) { + fh[fd].ptr += de->length; + de = (iso_dirent_t *)(icache[c]->data + (fh[fd].ptr%2048)); + fh[fd].ptr += de->length; + de = (iso_dirent_t *)(icache[c]->data + (fh[fd].ptr%2048)); + if (!de->length) return NULL; + } + + if (joliet) { + ucs2utfn((uint8 *)fh[fd].dirent.name, (uint8 *)de->name, de->name_len); + } else { + /* Fill out the VFS dirent */ + strncpy(fh[fd].dirent.name, de->name, de->name_len); + fh[fd].dirent.name[de->name_len] = 0; + fn_postprocess(fh[fd].dirent.name); + + /* Check for Rock Ridge NM extension */ + len = de->length - sizeof(iso_dirent_t) + sizeof(de->name) - de->name_len; + pnt = (uint8*)de + sizeof(iso_dirent_t) - sizeof(de->name) + de->name_len; + if ((de->name_len & 1) == 0) { + pnt++; len--; + } + while ((len >= 4) && ((pnt[3] == 1) || (pnt[3] == 2))) { + if (strncmp((char *)pnt, "NM", 2) == 0) { + strncpy(fh[fd].dirent.name, (char *)(pnt+5), pnt[2] - 5); + fh[fd].dirent.name[pnt[2] - 5] = 0; + } + len -= pnt[2]; + pnt += pnt[2]; + } + } + + if (de->flags & 2) { + fh[fd].dirent.size = -1; + fh[fd].dirent.attr = O_DIR; + } else { + fh[fd].dirent.size = iso_733(de->size); + fh[fd].dirent.attr = 0; + } + + fh[fd].ptr += de->length; + + return &fh[fd].dirent; +} + +int iso_reset() { + iso_break_all(); + bclear(); + percd_done = 0; + return 0; +} + +/* This handler will be called during every vblank. We have to + be careful about modifying variables that are in use in the + foreground, so instead we'll just set a "dead" flag and next + time someone calls in it'll get reset. */ +static int iso_last_status; +static int iso_vblank_hnd; +static void iso_vblank(uint32 evt) { + int status, disc_type; + + /* Get the status. This may fail if a CD operation is in + progress in the foreground. */ + if (cdrom_get_status(&status, &disc_type) < 0) + return; + + if (iso_last_status != status) { + if (status == CD_STATUS_OPEN || status == CD_STATUS_NO_DISC) + percd_done = 0; + iso_last_status = status; + } +} + +/* There's only one ioctl at the moment (re-initialize caches) but you should + always clear data and size. */ +static int iso_ioctl(void * hnd, void *data, size_t size) { + iso_reset(); + + return 0; +} + +/* Put everything together */ +static vfs_handler_t vh = { + /* Name handler */ + { + "/cd", /* name */ + 0, /* tbfi */ + 0x00010000, /* Version 1.0 */ + 0, /* flags */ + NMMGR_TYPE_VFS, /* VFS handler */ + NMMGR_LIST_INIT + }, + + 0, NULL, /* no cacheing, privdata */ + + __kos__iso_open, + __kos__iso_close, + __kos__iso_read, + NULL, + __kos__iso_seek, + __kos__iso_tell, + iso_total, + __kos__iso_readdir, + iso_ioctl, + NULL, + NULL, + NULL +}; + +/* Initialize the file system */ +int fs_iso9660_init() { + int i; + + /* Reset fd's */ + memset(fh, 0, sizeof(fh)); + + /* Mark the first as active so we can have an error FD of zero */ + fh[0].first_extent = -1; + + /* Init thread mutexes */ + cache_mutex = mutex_create(); + fh_mutex = mutex_create(); + + /* Allocate cache block space */ + for (i=0; isector = -1; + dcache[i] = malloc(sizeof(cache_block_t)); + dcache[i]->sector = -1; + } + + percd_done = 0; + iso_last_status = -1; + + /* Register with the vblank */ + iso_vblank_hnd = vblank_handler_add(iso_vblank); + + /* Register with VFS */ + return nmmgr_handler_add(&vh.nmmgr); +} + +/* De-init the file system */ +int fs_iso9660_shutdown() { + int i; + + /* De-register with vblank */ + vblank_handler_remove(iso_vblank_hnd); + + /* Dealloc cache block space */ + for (i=0; i + +/* + Functions to clear, copy, and set memory using the sh4 store queues + + Based on code by Marcus Comstedt (store_q_clear from tatest) +*/ + +/* clears n bytes at dest, dest must be 32-byte aligned */ +void sq_clr(void *dest, int n) { + unsigned int *d = (unsigned int *)(void *) +#ifdef USE_SQ_MMU + ((0xe0000000 | (((unsigned)dest) & 0x03ffffe0))|((((unsigned)dest)>>3)&0x3800000)); +#else + (0xe0000000 | (((unsigned long)dest) & 0x03ffffe0)); +#endif + + /* Set store queue memory area as desired */ +#ifndef USE_SQ_MMU + QACR0 = ((((unsigned int)dest)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)dest)>>26)<<2)&0x1c; +#endif + + /* Fill both store queues with zeroes */ + d[0] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = + d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = 0; + + /* Write them as many times necessary */ + n>>=5; + while(n--) { + asm("pref @%0" : : "r" (d)); + d += 8; + } + + /* Wait for both store queues to complete */ + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; +} + +/* copies n bytes from src to dest, dest must be 32-byte aligned */ +void * sq_cpy(void *dest, void *src, int n) { + unsigned int *d = (unsigned int *)(void *) +#ifdef USE_SQ_MMU + ((0xe0000000 | (((unsigned)dest) & 0x03ffffe0))|((((unsigned)dest)>>3)&0x3800000)); +#else + (0xe0000000 | (((unsigned long)dest) & 0x03ffffe0)); +#endif + unsigned int *s = src; + + /* Set store queue memory area as desired */ +#ifndef USE_SQ_MMU + QACR0 = ((((unsigned int)dest)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)dest)>>26)<<2)&0x1c; +#endif + + /* fill/write queues as many times necessary */ + n>>=5; + while(n--) { + asm("pref @%0" : : "r" (s + 8)); /* prefetch 32 bytes for next loop */ + d[0] = *(s++); + d[1] = *(s++); + d[2] = *(s++); + d[3] = *(s++); + d[4] = *(s++); + d[5] = *(s++); + d[6] = *(s++); + d[7] = *(s++); + asm("pref @%0" : : "r" (d)); + d += 8; + } + /* Wait for both store queues to complete */ + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + + return dest; +} + +/* fills n bytes at s with byte c, s must be 32-byte aligned */ +void * sq_set(void *s, uint32 c, int n) { + unsigned int *d = (unsigned int *)(void *) +#ifdef USE_SQ_MMU + ((0xe0000000 | (((unsigned)s) & 0x03ffffe0))|((((unsigned)s)>>3)&0x3800000)); +#else + (0xe0000000 | (((unsigned long)s) & 0x03ffffe0)); +#endif + + /* Set store queue memory area as desired */ +#ifndef USE_SQ_MMU + QACR0 = ((((unsigned int)s)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)s)>>26)<<2)&0x1c; +#endif + + /* duplicate low 8-bits of c into high 24-bits */ + c = c & 0xff; + c = (c << 24) | (c << 16) | (c << 8) | c; + + /* Fill both store queues with c */ + d[0] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = + d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = c; + + /* Write them as many times necessary */ + n>>=5; + while(n--) { + asm("pref @%0" : : "r" (d)); + d += 8; + } + + /* Wait for both store queues to complete */ + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + + return s; +} + +/* fills n bytes at s with short c, s must be 32-byte aligned */ +void * sq_set16(void *s, uint32 c, int n) { + unsigned int *d = (unsigned int *)(void *) +#ifdef USE_SQ_MMU + ((0xe0000000 | (((unsigned)s) & 0x03ffffe0))|((((unsigned)s)>>3)&0x3800000)); +#else + (0xe0000000 | (((unsigned long)s) & 0x03ffffe0)); +#endif + + /* Set store queue memory area as desired */ +#ifndef USE_SQ_MMU + QACR0 = ((((unsigned int)s)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)s)>>26)<<2)&0x1c; +#endif + + /* duplicate low 16-bits of c into high 16-bits */ + c = c & 0xffff; + c = (c << 16) | c; + + /* Fill both store queues with c */ + d[0] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = + d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = c; + + /* Write them as many times necessary */ + n>>=5; + while(n--) { + asm("pref @%0" : : "r" (d)); + d += 8; + } + + /* Wait for both store queues to complete */ + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + + return s; +} + +/* fills n bytes at s with int c, s must be 32-byte aligned */ +void * sq_set32(void *s, uint32 c, int n) { + unsigned int *d = (unsigned int *)(void *) +#ifdef USE_SQ_MMU + ((0xe0000000 | (((unsigned)s) & 0x03ffffe0))|((((unsigned)s)>>3)&0x3800000)); +#else + (0xe0000000 | (((unsigned long)s) & 0x03ffffe0)); +#endif + + /* Set store queue memory area as desired */ +#ifndef USE_SQ_MMU + QACR0 = ((((unsigned int)s)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)s)>>26)<<2)&0x1c; +#endif + + /* Fill both store queues with c */ + d[0] = d[1] = d[2] = d[3] = d[4] = d[5] = d[6] = d[7] = + d[8] = d[9] = d[10] = d[11] = d[12] = d[13] = d[14] = d[15] = c; + + /* Write them as many times necessary */ + n>>=5; + while(n--) { + asm("pref @%0" : : "r" (d)); + d += 8; + } + + /* Wait for both store queues to complete */ + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + + return s; +} + + diff --git a/src/mmu_handle/kos-patch/kernel/arch/dreamcast/include/dc/pvr.h b/src/mmu_handle/kos-patch/kernel/arch/dreamcast/include/dc/pvr.h new file mode 100644 index 0000000..4ef413a --- /dev/null +++ b/src/mmu_handle/kos-patch/kernel/arch/dreamcast/include/dc/pvr.h @@ -0,0 +1,1064 @@ +/* KallistiOS ##version## + + kernel/arch/dreamcast/include/dc/pvr.h + (C)2002 Dan Potter + + Low-level PVR 3D interface for the DC + Note: this API does _not_ handle any sort of transformations + (including perspective!) so for that, you should look to KGL. +*/ + + +#ifndef __DC_PVR_H +#define __DC_PVR_H + +#define USE_SQ_MMU + +#include +__BEGIN_DECLS + +#include +#include +#include + +/* Data types ********************************************************/ + +/* PVR texture memory pointer; unlike the old "TA" system, PVR pointers + in the new system are actually SH-4 compatible pointers and can + be used directly in place of ta_txr_map(). */ +typedef void * pvr_ptr_t; + +/* PVR list specification */ +typedef uint32 pvr_list_t; + +/* Polygon context; you should use this more human readable format for + specifying your polygon contexts, and then compile them into polygon + headers (below) when you are ready to start using them. + + This has embedded structures in it for two reasons; the first reason + is to make it easier for me to add new stuff later without breaking + existing code. The second reason is to make it more readable and + usable. +*/ +typedef struct { + int list_type; + struct { + int alpha; + int shading; + int fog_type; + int culling; + int color_clamp; + int clip_mode; + int modifier_mode; + int alpha2; + int fog_type2; + int color_clamp2; + } gen; + struct { + int src, dst; + int src_enable, dst_enable; + int src2, dst2; + int src_enable2, dst_enable2; + } blend; + struct { + int color; + int uv; + int modifier; + } fmt; + struct { + int comparison; + int write; + } depth; + struct { + int enable; + int filter; /* none, bi-linear, tri-linear, etc */ + int mipmap; + int mipmap_bias; + int uv_flip; + int uv_clamp; + int alpha; + int env; + int width; + int height; + int format; /* bit format, vq, twiddle, stride */ + pvr_ptr_t base; /* texture location */ + } txr; + struct { + int enable; + int filter; /* none, bi-linear, tri-linear, etc */ + int mipmap; + int mipmap_bias; + int uv_flip; + int uv_clamp; + int alpha; + int env; + int width; + int height; + int format; /* bit format, vq, twiddle, stride */ + pvr_ptr_t base; /* texture location */ + } txr2; +} pvr_poly_cxt_t; + +/* Sprite context; use this somewhat readable format to specify your + sprites before compiling them into polygon headers. +*/ +typedef struct { + int list_type; + struct { + int alpha; + int fog_type; + int culling; + int color_clamp; + int clip_mode; + } gen; + struct { + int src, dst; + int src_enable, dst_enable; + } blend; + struct { + int comparison; + int write; + } depth; + struct { + int enable; + int filter; + int mipmap; + int mipmap_bias; + int uv_flip; + int uv_clamp; + int alpha; + int width; + int height; + int format; + pvr_ptr_t base; + } txr; +} pvr_sprite_cxt_t; + +/* Constants for the above structure; thanks to Benoit Miller for these */ +/* list_type */ +#define PVR_LIST_OP_POLY 0 /* opaque poly */ +#define PVR_LIST_OP_MOD 1 /* opaque modifier */ +#define PVR_LIST_TR_POLY 2 /* translucent poly */ +#define PVR_LIST_TR_MOD 3 /* translucent modifier */ +#define PVR_LIST_PT_POLY 4 /* punch-thru poly */ + +#define PVR_SHADE_FLAT 0 /* shading */ +#define PVR_SHADE_GOURAUD 1 + +#define PVR_DEPTHCMP_NEVER 0 /* depth_comparison */ +#define PVR_DEPTHCMP_LESS 1 +#define PVR_DEPTHCMP_EQUAL 2 +#define PVR_DEPTHCMP_LEQUAL 3 +#define PVR_DEPTHCMP_GREATER 4 +#define PVR_DEPTHCMP_NOTEQUAL 5 +#define PVR_DEPTHCMP_GEQUAL 6 +#define PVR_DEPTHCMP_ALWAYS 7 + +#define PVR_CULLING_NONE 0 /* culling */ +#define PVR_CULLING_SMALL 1 +#define PVR_CULLING_CCW 2 +#define PVR_CULLING_CW 3 + +#define PVR_DEPTHWRITE_ENABLE 0 /* depth_write */ +#define PVR_DEPTHWRITE_DISABLE 1 + +#define PVR_TEXTURE_DISABLE 0 /* txr_enable */ +#define PVR_TEXTURE_ENABLE 1 + +#define PVR_BLEND_ZERO 0 /* src_blend / dst_blend */ +#define PVR_BLEND_ONE 1 +#define PVR_BLEND_DESTCOLOR 2 +#define PVR_BLEND_INVDESTCOLOR 3 +#define PVR_BLEND_SRCALPHA 4 +#define PVR_BLEND_INVSRCALPHA 5 +#define PVR_BLEND_DESTALPHA 6 +#define PVR_BLEND_INVDESTALPHA 7 + +#define PVR_BLEND_DISABLE 0 /* src_blend_enable / dst_blend_enable */ +#define PVR_BLEND_ENABLE 1 + +#define PVR_FOG_TABLE 0 /* fog_type */ +#define PVR_FOG_VERTEX 1 +#define PVR_FOG_DISABLE 2 +#define PVR_FOG_TABLE2 3 + +#define PVR_USERCLIP_DISABLE 0 /* clip_mode */ +#define PVR_USERCLIP_INSIDE 2 +#define PVR_USERCLIP_OUTSIDE 3 + +#define PVR_CLRCLAMP_DISABLE 0 /* color_clamp */ +#define PVR_CLRCLAMP_ENABLE 1 + +#define PVR_ALPHA_DISABLE 0 /* alpha */ +#define PVR_ALPHA_ENABLE 1 + +#define PVR_TXRALPHA_ENABLE 0 /* txr_alpha */ +#define PVR_TXRALPHA_DISABLE 1 + +#define PVR_UVFLIP_NONE 0 /* txr_uvflip */ +#define PVR_UVFLIP_V 1 +#define PVR_UVFLIP_U 2 +#define PVR_UVFLIP_UV 3 + +#define PVR_UVCLAMP_NONE 0 /* txr_uvclamp */ +#define PVR_UVCLAMP_V 1 +#define PVR_UVCLAMP_U 2 +#define PVR_UVCLAMP_UV 3 + +#define PVR_FILTER_NONE 0 /* txr_filter */ +#define PVR_FILTER_NEAREST 0 +#define PVR_FILTER_BILINEAR 2 +#define PVR_FILTER_TRILINEAR1 4 +#define PVR_FILTER_TRILINEAR2 6 + +#define PVR_MIPBIAS_NORMAL PVR_MIPBIAS_1_00 /* txr_mipmap_bias */ +#define PVR_MIPBIAS_0_25 1 +#define PVR_MIPBIAS_0_50 2 +#define PVR_MIPBIAS_0_75 3 +#define PVR_MIPBIAS_1_00 4 +#define PVR_MIPBIAS_1_25 5 +#define PVR_MIPBIAS_1_50 6 +#define PVR_MIPBIAS_1_75 7 +#define PVR_MIPBIAS_2_00 8 +#define PVR_MIPBIAS_2_25 9 +#define PVR_MIPBIAS_2_50 10 +#define PVR_MIPBIAS_2_75 11 +#define PVR_MIPBIAS_3_00 12 +#define PVR_MIPBIAS_3_25 13 +#define PVR_MIPBIAS_3_50 14 +#define PVR_MIPBIAS_3_75 15 + +/* txr_env */ +#define PVR_TXRENV_REPLACE 0 /* C = Ct, A = At */ +#define PVR_TXRENV_MODULATE 1 /* C = Cs * Ct, A = At */ +#define PVR_TXRENV_DECAL 2 /* C = (Cs * At) + (Cs * (1-At)), A = As */ +#define PVR_TXRENV_MODULATEALPHA 3 /* C = Cs * Ct, A = As * At */ + +#define PVR_MIPMAP_DISABLE 0 /* txr_mipmap */ +#define PVR_MIPMAP_ENABLE 1 + +#define PVR_TXRFMT_NONE 0 /* txr_format */ +#define PVR_TXRFMT_VQ_DISABLE (0 << 30) +#define PVR_TXRFMT_VQ_ENABLE (1 << 30) +#define PVR_TXRFMT_ARGB1555 (0 << 27) +#define PVR_TXRFMT_RGB565 (1 << 27) +#define PVR_TXRFMT_ARGB4444 (2 << 27) +#define PVR_TXRFMT_YUV422 (3 << 27) +#define PVR_TXRFMT_BUMP (4 << 27) +#define PVR_TXRFMT_PAL4BPP (5 << 27) +#define PVR_TXRFMT_PAL8BPP (6 << 27) +#define PVR_TXRFMT_TWIDDLED (0 << 26) +#define PVR_TXRFMT_NONTWIDDLED (1 << 26) +#define PVR_TXRFMT_NOSTRIDE (0 << 21) +#define PVR_TXRFMT_STRIDE (1 << 21) + +/* OR one of these into your texture format if you need it. Note that + these coincide with the twiddled/stride bits, so you can't have a + non-twiddled/strided texture that's paletted! */ +#define PVR_TXRFMT_8BPP_PAL(x) ((x) << 25) +#define PVR_TXRFMT_4BPP_PAL(x) ((x) << 21) + +#define PVR_CLRFMT_ARGBPACKED 0 /* color_format */ +#define PVR_CLRFMT_4FLOATS 1 +#define PVR_CLRFMT_INTENSITY 2 +#define PVR_CLRFMT_INTENSITY_PREV 3 + +#define PVR_UVFMT_32BIT 0 /* txr_uv_format */ +#define PVR_UVFMT_16BIT 1 + +#define PVR_MODIFIER_DISABLE 0 /* modifier_format */ +#define PVR_MODIFIER_ENABLE 1 + +#define PVR_MODIFIER_CHEAP_SHADOW 0 +#define PVR_MODIFIER_NORMAL 1 + +#define PVR_MODIFIER_OTHER_POLY 0 /* PM1 modifer instruction */ +#define PVR_MODIFIER_INCLUDE_LAST_POLY 1 /* ...in inclusion vol */ +#define PVR_MODIFIER_EXCLUDE_LAST_POLY 2 /* ...in exclusion vol */ + + +/* "Polygon header" -- this is the hardware equivalent of a rendering + context; you'll create one of these from your pvr_poly_context_t and + use it for submission to the hardware. */ +typedef struct { + uint32 cmd; /* TA command */ + uint32 mode1, mode2, mode3; /* mode parameters */ + uint32 d1, d2, d3, d4; /* dummies */ +} pvr_poly_hdr_t; + +/* Polygon header with intensity color. This is the equivalent of + pvr_poly_hdr_t, but for use with intensity color. */ +typedef struct { + uint32 cmd; /* TA command */ + uint32 mode1, mode2, mode3; /* mode parameters */ + float a, r, g, b; /* color */ +} pvr_poly_ic_hdr_t; + +/* Polygon header to be used with modifier volumes. This is the + equivalent of a pvr_poly_hdr_t for use when a polygon is to + be used with modifier volumes. */ +typedef struct { + uint32 cmd; /* TA command */ + uint32 mode1; /* mode parameters */ + uint32 mode2_0, mode3_0; + uint32 mode2_1, mode3_1; + uint32 d1, d2; /* dummies */ +} pvr_poly_mod_hdr_t; + +/* Polygon header specifically for sprites. */ +typedef struct { + uint32 cmd; /* TA command */ + uint32 mode1, mode2, mode3; /* mode parameters */ + uint32 argb; /* sprite color */ + uint32 oargb; /* offset color */ + uint32 d1, d2; /* dummies */ +} pvr_sprite_hdr_t; + +/* Modifier volume header. */ +typedef struct { + uint32 cmd; /* TA command */ + uint32 mode1; /* mode parameter */ + uint32 d1, d2, d3, d4, d5, d6; /* dummies */ +} pvr_mod_hdr_t; + +/* Generic vertex type; the PVR chip itself supports many more vertex + types, but this is the main one that can be used with both textured + and non-textured polygons, and is fairly fast. You can find other + variants below. */ +typedef struct { + uint32 flags; /* vertex flags */ + float x, y, z; /* the coodinates */ + float u, v; /* texture coords */ + uint32 argb; /* vertex color */ + uint32 oargb; /* offset color */ +} pvr_vertex_t; + +/* Non-textured, packed color, affected by modifier volume. This + vertex type has two copies of colors. The second color is used when + enclosed within a modifier volume. */ +typedef struct { + uint32 flags; + float x, y, z; + uint32 argb0; + uint32 argb1; + uint32 d1, d2; +} pvr_vertex_pcm_t; + +/* Textured, packed color, affected by modifer volume. Note that this + vertex type has two copies of colors, offset colors and texture + coords. The second set of texture coords, colors, and offset colors + are used when enclosed within a modifer volume */ +typedef struct { + uint32 flags; /* vertex flags */ + float x, y, z; /* the coordinates */ + float u0, v0; /* texture coords 0 */ + uint32 argb0; /* vertex color 0 */ + uint32 oargb0; /* offset color 0 */ + float u1, v1; /* texture coords 1 */ + uint32 argb1; /* vertex color 1 */ + uint32 oargb1; /* offset color 1 */ + uint32 d1, d2, d3, d4; /* dummies */ +} pvr_vertex_tpcm_t; + +/* Textured sprite. This vertex type is to be used with the sprite + polygon header and the sprite related commands to draw textured + sprites. */ +typedef struct { + uint32 flags; + float ax, ay, az; + float bx, by, bz; + float cx, cy, cz; + float dx, dy; + uint32 dummy; + uint32 auv; + uint32 buv; + uint32 cuv; +} pvr_sprite_txr_t; + +/* Untextured sprite. This vertex type is to be used with the sprite + polygon header and the sprite related commands to draw untextured + sprites (aka, quads). */ +typedef struct { + uint32 flags; + float ax, ay, az; + float bx, by, bz; + float cx, cy, cz; + float dx, dy; + uint32 d1, d2, d3, d4; +} pvr_sprite_col_t; + +/* This vertex is only for modifer volumes */ +typedef struct { + uint32 flags; /* vertex flags */ + float ax, ay, az; /* 3 sets of coordinates */ + float bx, by, bz; + float cx, cy, cz; + uint32 d1, d2, d3, d4, d5, d6; /* dummies */ +} pvr_modifier_vol_t; + +/* Small macro for packing float color values */ +#define PVR_PACK_COLOR(a, r, g, b) ( \ + ( ((uint8)( a * 255 ) ) << 24 ) | \ + ( ((uint8)( r * 255 ) ) << 16 ) | \ + ( ((uint8)( g * 255 ) ) << 8 ) | \ + ( ((uint8)( b * 255 ) ) << 0 ) ) + +/* Small function for packing two 32-bit u/v values into + two 16-bit u/v values. */ +static inline uint32 PVR_PACK_16BIT_UV(float u, float v) { + return ( ((*((uint32 *) &u)) >> 0 ) & 0xFFFF0000 ) | + ( ((*((uint32 *) &v)) >> 16 ) & 0x0000FFFF ); +} + +/* ... other vertex structs omitted for now ... */ + +/* Constants that apply to all primitives */ +#define PVR_CMD_POLYHDR 0x80840000 /* sublist, striplength=2 */ +#ifdef USE_SQ_MMU +#define PVR_CMD_VERTEX 0xe2000000 +#else +#define PVR_CMD_VERTEX 0xe0000000 +#endif +#define PVR_CMD_VERTEX_EOL 0xf0000000 +#define PVR_CMD_USERCLIP 0x20000000 +#define PVR_CMD_MODIFIER 0x80000000 +#define PVR_CMD_SPRITE 0xA0000000 + +/* Constants and bitmasks for handling polygon headers; note that thanks + to the arrangement of constants above, this is mainly a matter of bit + shifting to compile it... */ +#define PVR_TA_CMD_TYPE_SHIFT 24 +#define PVR_TA_CMD_TYPE_MASK (7 << PVR_TA_CMD_TYPE_SHIFT) + +#define PVR_TA_CMD_USERCLIP_SHIFT 16 +#define PVR_TA_CMD_USERCLIP_MASK (3 << PVR_TA_CMD_USERCLIP_SHIFT) + +#define PVR_TA_CMD_CLRFMT_SHIFT 4 +#define PVR_TA_CMD_CLRFMT_MASK (7 << PVR_TA_CMD_CLRFMT_SHIFT) + +#define PVR_TA_CMD_SHADE_SHIFT 1 +#define PVR_TA_CMD_SHADE_MASK (1 << PVR_TA_CMD_SHADE_SHIFT) + +#define PVR_TA_CMD_UVFMT_SHIFT 0 +#define PVR_TA_CMD_UVFMT_MASK (1 << PVR_TA_CMD_UVFMT_SHIFT) + +#define PVR_TA_CMD_MODIFIER_SHIFT 7 +#define PVR_TA_CMD_MODIFIER_MASK (1 << PVR_TA_CMD_MODIFIER_SHIFT) + +#define PVR_TA_CMD_MODIFIERMODE_SHIFT 6 +#define PVR_TA_CMD_MODIFIERMODE_MASK (1 << PVR_TA_CMD_MODIFIERMODE_SHIFT) + +#define PVR_TA_PM1_DEPTHCMP_SHIFT 29 +#define PVR_TA_PM1_DEPTHCMP_MASK (7 << PVR_TA_PM1_DEPTHCMP_SHIFT) + +#define PVR_TA_PM1_CULLING_SHIFT 27 +#define PVR_TA_PM1_CULLING_MASK (3 << PVR_TA_PM1_CULLING_SHIFT) + +#define PVR_TA_PM1_DEPTHWRITE_SHIFT 26 +#define PVR_TA_PM1_DEPTHWRITE_MASK (1 << PVR_TA_PM1_DEPTHWRITE_SHIFT) + +#define PVR_TA_PM1_TXRENABLE_SHIFT 25 +#define PVR_TA_PM1_TXRENABLE_MASK (1 << PVR_TA_PM1_TXRENABLE_SHIFT) + +#define PVR_TA_PM1_MODIFIERINST_SHIFT 29 +#define PVR_TA_PM1_MODIFIERINST_MASK (3 << PVR_TA_PM1_MODIFIERINST_SHIFT) + +#define PVR_TA_PM2_SRCBLEND_SHIFT 29 +#define PVR_TA_PM2_SRCBLEND_MASK (7 << PVR_TA_PM2_SRCBLEND_SHIFT) + +#define PVR_TA_PM2_DSTBLEND_SHIFT 26 +#define PVR_TA_PM2_DSTBLEND_MASK (7 << PVR_TA_PM2_DSTBLEND_SHIFT) + +#define PVR_TA_PM2_SRCENABLE_SHIFT 25 +#define PVR_TA_PM2_SRCENABLE_MASK (1 << PVR_TA_PM2_SRCENABLE_SHIFT) + +#define PVR_TA_PM2_DSTENABLE_SHIFT 24 +#define PVR_TA_PM2_DSTENABLE_MASK (1 << PVR_TA_PM2_DSTENABLE_SHIFT) + +#define PVR_TA_PM2_FOG_SHIFT 22 +#define PVR_TA_PM2_FOG_MASK (3 << PVR_TA_PM2_FOG_SHIFT) + +#define PVR_TA_PM2_CLAMP_SHIFT 21 +#define PVR_TA_PM2_CLAMP_MASK (1 << PVR_TA_PM2_CLAMP_SHIFT) + +#define PVR_TA_PM2_ALPHA_SHIFT 20 +#define PVR_TA_PM2_ALPHA_MASK (1 << PVR_TA_PM2_ALPHA_SHIFT) + +#define PVR_TA_PM2_TXRALPHA_SHIFT 19 +#define PVR_TA_PM2_TXRALPHA_MASK (1 << PVR_TA_PM2_TXRALPHA_SHIFT) + +#define PVR_TA_PM2_UVFLIP_SHIFT 17 +#define PVR_TA_PM2_UVFLIP_MASK (3 << PVR_TA_PM2_UVFLIP_SHIFT) + +#define PVR_TA_PM2_UVCLAMP_SHIFT 15 +#define PVR_TA_PM2_UVCLAMP_MASK (3 << PVR_TA_PM2_UVCLAMP_SHIFT) + +#define PVR_TA_PM2_FILTER_SHIFT 12 +#define PVR_TA_PM2_FILTER_MASK (7 << PVR_TA_PM2_FILTER_SHIFT) + +#define PVR_TA_PM2_MIPBIAS_SHIFT 8 +#define PVR_TA_PM2_MIPBIAS_MASK (15 << PVR_TA_PM2_MIPBIAS_SHIFT) + +#define PVR_TA_PM2_TXRENV_SHIFT 6 +#define PVR_TA_PM2_TXRENV_MASK (3 << PVR_TA_PM2_TXRENV_SHIFT) + +#define PVR_TA_PM2_USIZE_SHIFT 3 +#define PVR_TA_PM2_USIZE_MASK (7 << PVR_TA_PM2_USIZE_SHIFT) + +#define PVR_TA_PM2_VSIZE_SHIFT 0 +#define PVR_TA_PM2_VSIZE_MASK (7 << PVR_TA_PM2_VSIZE_SHIFT) + +#define PVR_TA_PM3_MIPMAP_SHIFT 31 +#define PVR_TA_PM3_MIPMAP_MASK (1 << PVR_TA_PM3_MIPMAP_SHIFT) + +#define PVR_TA_PM3_TXRFMT_SHIFT 0 +#define PVR_TA_PM3_TXRFMT_MASK 0xffffffff + + + +/**** Register macros ***************************************************/ + +/* We use these macros to do all PVR register access, so that it's + simple later on to hook them for debugging or whatnot. */ + +#define PVR_GET(REG) (* ( (uint32*)( 0xa05f8000 + (REG) ) ) ) +#define PVR_SET(REG, VALUE) PVR_GET(REG) = (VALUE) + +/* The registers themselves; these are from Maiwe's powervr-reg.txt */ +/* Note that 2D specific registers have been excluded for now (like + vsync, hsync, v/h size, etc) */ + +#define PVR_ID 0x0000 /* Chip ID */ +#define PVR_REVISION 0x0004 /* Chip revision */ +#define PVR_RESET 0x0008 /* Reset pins */ +#define PVR_ISP_START 0x0014 /* Start the ISP/TSP */ +#define PVR_UNK_0018 0x0018 /* ?? */ +#define PVR_ISP_VERTBUF_ADDR 0x0020 /* Vertex buffer address for scene rendering */ +#define PVR_ISP_TILEMAT_ADDR 0x002c /* Tile matrix address for scene rendering */ +#define PVR_SPANSORT_CFG 0x0030 /* ?? -- write 0x101 for now */ +#define PVR_FB_CFG_1 0x0044 /* Framebuffer config 1 */ +#define PVR_FB_CFG_2 0x0048 /* Framebuffer config 2 */ +#define PVR_RENDER_MODULO 0x004c /* Render modulo */ +#define PVR_RENDER_ADDR 0x0060 /* Render output address */ +#define PVR_RENDER_ADDR_2 0x0064 /* Output for strip-buffering */ +#define PVR_PCLIP_X 0x0068 /* Horizontal clipping area */ +#define PVR_PCLIP_Y 0x006c /* Vertical clipping area */ +#define PVR_CHEAP_SHADOW 0x0074 /* Cheap shadow control */ +#define PVR_OBJECT_CLIP 0x0078 /* Distance for polygon culling */ +#define PVR_UNK_007C 0x007c /* ?? -- write 0x0027df77 for now */ +#define PVR_UNK_0080 0x0080 /* ?? -- write 7 for now */ +#define PVR_TEXTURE_CLIP 0x0084 /* Distance for texture clipping */ +#define PVR_BGPLANE_Z 0x0088 /* Distance for background plane */ +#define PVR_BGPLANE_CFG 0x008c /* Background plane config */ +#define PVR_UNK_0098 0x0098 /* ?? -- write 0x00800408 for now */ +#define PVR_UNK_00A0 0x00a0 /* ?? -- write 0x20 for now */ +#define PVR_UNK_00A8 0x00a8 /* ?? -- write 0x15d1c951 for now */ +#define PVR_FOG_TABLE_COLOR 0x00b0 /* Table fog color */ +#define PVR_FOG_VERTEX_COLOR 0x00b4 /* Vertex fog color */ +#define PVR_FOG_DENSITY 0x00b8 /* Fog density coefficient */ +#define PVR_COLOR_CLAMP_MAX 0x00bc /* RGB Color clamp max */ +#define PVR_COLOR_CLAMP_MIN 0x00c0 /* RGB Color clamp min */ +#define PVR_GUN_POS 0x00c4 /* Light gun position */ +#define PVR_UNK_00C8 0x00c8 /* ?? -- write same as border H in 00d4 << 16 */ +#define PVR_VPOS_IRQ 0x00cc /* Vertical position IRQ */ +#define PVR_TEXTURE_MODULO 0x00e4 /* Output texture width modulo */ +#define PVR_VIDEO_CFG 0x00e8 /* Misc video config */ +#define PVR_SCALER_CFG 0x00f4 /* Smoothing scaler */ +#define PVR_PALETTE_CFG 0x0108 /* Palette format */ +#define PVR_SYNC_STATUS 0x010c /* V/H blank status */ +#define PVR_UNK_0110 0x0110 /* ?? -- write 0x93f39 for now */ +#define PVR_UNK_0114 0x0114 /* ?? -- write 0x200000 for now */ +#define PVR_UNK_0118 0x0118 /* ?? -- write 0x8040 for now */ +#define PVR_TA_OPB_START 0x0124 /* Object Pointer Buffer start for TA usage */ +#define PVR_TA_VERTBUF_START 0x0128 /* Vertex buffer start for TA usage */ +#define PVR_TA_OPB_END 0x012c /* OPB end for TA usage */ +#define PVR_TA_VERTBUF_END 0x0130 /* Vertex buffer end for TA usage */ +#define PVR_TA_OPB_POS 0x0134 /* Top used memory location in OPB for TA usage */ +#define PVR_TA_VERTBUF_POS 0x0138 /* Top used memory location in vertbuf for TA usage */ +#define PVR_TILEMAT_CFG 0x013c /* Tile matrix size config */ +#define PVR_OPB_CFG 0x0140 /* Active lists / list size */ +#define PVR_TA_INIT 0x0144 /* Initialize vertex reg. params */ +#define PVR_YUV_ADDR 0x0148 /* YUV conversion destination */ +#define PVR_YUV_CFG_1 0x014c /* YUV configuration */ +#define PVR_UNK_0160 0x0160 /* ?? */ +#define PVR_TA_OPB_INIT 0x0164 /* Object pointer buffer position init */ +#define PVR_FOG_TABLE_BASE 0x0200 /* Base of the fog table */ +#define PVR_PALETTE_TABLE_BASE 0x1000 /* Base of the palette table */ + +/* Useful memory locations */ +#define PVR_TA_INPUT 0x10000000 /* TA command input */ +#define PVR_RAM_BASE 0xa5000000 /* PVR RAM (raw) */ +#define PVR_RAM_INT_BASE 0xa4000000 /* PVR RAM (interleaved) */ +#define PVR_RAM_SIZE (8*1024*1024) /* RAM size in bytes */ +#define PVR_RAM_TOP (PVR_RAM_BASE + PVR_RAM_SIZE) /* Top of raw PVR RAM */ +#define PVR_RAM_INT_TOP (PVR_RAM_INT_BASE + PVR_RAM_SIZE) /* Top of int PVR RAM */ + +/* Register content defines, as needed; these will be filled in over time + as the implementation requires them. There's too many to do otherwise. */ + +#define PVR_RESET_ALL 0xffffffff /* PVR_RESET */ +#define PVR_RESET_NONE 0x00000000 +#define PVR_RESET_TA 0x00000001 +#define PVR_RESET_ISPTSP 0x00000002 + +#define PVR_ISP_START_GO 0xffffffff /* PVR_ISP_START */ + +#define PVR_TA_INIT_GO 0x80000000 /* PVR_TA_INIT */ + + +/* Initialization ****************************************************/ + +/* Initialization and shutdown: stuff you should only ever have to do + once in your program. */ + +/* Bin sizes */ +#define PVR_BINSIZE_0 0 +#define PVR_BINSIZE_8 8 +#define PVR_BINSIZE_16 16 +#define PVR_BINSIZE_32 32 + +/* You'll fill in this structure before calling init */ +typedef struct { + /* Bin sizes: opaque polygons, opaque modifiers, translucent + polygons, translucent modifiers, punch-thrus */ + int opb_sizes[5]; + + /* Vertex buffer size (should be a nice round number) */ + int vertex_buf_size; + + /* Non-zero if we want to enable vertex DMA mode. Note that + if this is set, then _all_ enabled lists need to have a + vertex buffer assigned. */ + int dma_enabled; + + /* Non-zero if horizontal scaling is to be enabled. By enabling + this setting and stretching your image to double the native + screen width, you can get horizontal full-screen anti-aliasing. */ + int fsaa_enabled; +} pvr_init_params_t; + +/* Initialize the PVR chip to ready status, enabling the specified lists + and using the specified parameters; note that bins and vertex buffers + come from the texture memory pool! Expects that a 2D mode was + initialized already using the vid_* API. */ +int pvr_init(pvr_init_params_t *params); + +/* Simpler function which initializes the PVR using 16/16 for the opaque + and translucent lists, and 0's for everything else; 512k of vertex + buffer. This is equivalent to the old ta_init_defaults() for now. */ +int pvr_init_defaults(); + +/* Shut down the PVR chip from ready status, leaving it in 2D mode as it + was before the init. */ +int pvr_shutdown(); + + +/* Misc parameters ***************************************************/ + +/* These are miscellaneous parameters you can set which affect the + rendering process. */ + +/* Set the background plane color (the area of the screen not covered by + any other polygons) */ +void pvr_set_bg_color(float r, float g, float b); + +/* Return the current VBlank count */ +int pvr_get_vbl_count(); + +/* Statistics structure */ +typedef struct pvr_stats { + uint32 enabled_list_mask; /* Which lists are enabled? */ + uint32 vbl_count; /* VBlank count */ + int frame_last_time; /* Ready-to-Ready length for the last frame in milliseconds */ + float frame_rate; /* Current frame rate (per second) */ + int reg_last_time; /* Registration time for the last frame in milliseconds */ + int rnd_last_time; /* Rendering time for the last frame in milliseconds */ + int vtx_buffer_used; /* Number of bytes used in the vertex buffer for the last frame */ + int vtx_buffer_used_max; /* Number of bytes used in the vertex buffer for the largest frame */ + int buf_last_time; /* DMA buffer file time for the last frame in milliseconds */ + uint32 frame_count; /* Total number of rendered/viewed frames */ + /* ... more later as it's implemented ... */ +} pvr_stats_t; + +/* Fill in a statistics structure (above) from current data. This + is a super-set of frame count. */ +int pvr_get_stats(pvr_stats_t *stat); + + +/* Palette management ************************************************/ + +/* In addition to its 16-bit truecolor modes, the PVR also supports some + nice paletted modes. These aren't useful for super high quality images + most of the time, but they can be useful for doing some interesting + special effects, like the old cheap "worm hole". */ + +/* Palette formats */ +#define PVR_PAL_ARGB1555 0 +#define PVR_PAL_RGB565 1 +#define PVR_PAL_ARGB4444 2 +#define PVR_PAL_ARGB8888 3 + +/* Set the palette format */ +void pvr_set_pal_format(int fmt); + +/* Set a palette value; note that the format of the table is variable, + so for maximum speed we simply let the user decide what to do here. */ +static inline void pvr_set_pal_entry(uint32 idx, uint32 value) { + PVR_SET(PVR_PALETTE_TABLE_BASE + 4*idx, value); +} + + +/* Hardware Fog parameters *******************************************/ + +/* Thanks to Paul Boese for figuring this stuff out */ + +/* Set the fog table color */ +void pvr_fog_table_color(float a, float r, float g, float b); + +/* Set the fog vertex color */ +void pvr_fog_vertex_color(float a, float r, float g, float b); + +/* Set the fog far depth */ +void pvr_fog_far_depth(float d); + +/* Initialize the fog table using an exp2 algorithm (like GL_EXP2) */ +void pvr_fog_table_exp2(float density); + +/* Initialize the fog table using an exp algorithm (like GL_EXP) */ +void pvr_fog_table_exp(float density); + +/* Initialize the fog table using a linear algorithm (like GL_LINEAR) */ +void pvr_fog_table_linear(float start, float end); + +/* Set a custom fog table from float values */ +void pvr_fog_table_custom(float tbl1[]); + + +/* Memory management *************************************************/ + +/* PVR memory management in KOS uses a modified dlmalloc; see the + source file pvr_mem_core.c for more info. */ + +/* Allocate a chunk of memory from texture space; the returned value + will be relative to the base of texture memory (zero-based) */ +pvr_ptr_t pvr_mem_malloc(size_t size); + +/* Free a previously allocated chunk of memory */ +void pvr_mem_free(pvr_ptr_t chunk); + +/* Return the number of bytes available still in the memory pool */ +uint32 pvr_mem_available(); + +/* Reset the memory pool, equivalent to freeing all textures currently + residing in RAM. */ +void pvr_mem_reset(); + +/* Check the memory block list to see what's allocated */ +/* Only available if you've enabled KM_DBG in pvr_mem.c */ +void pvr_mem_print_list(); + +/* Print some statistics (like mallocstats) */ +void pvr_mem_stats(); + +/* Scene rendering ***************************************************/ + +/* This API is used to submit triangle strips to the PVR via the TA + interace in the chip. + + An important side note about the PVR is that all primitive types + must be submitted grouped together. If you have 10 polygons for each + list type, then the PVR must receive them via the TA by list type, + with a list delimiter in between. + + So there are two modes you can use here. The first mode allows you to + submit data directly to the TA. Your data will be forwarded to the + chip for processing as it is fed to the PVR module. If your data + is easily sorted into the primitive types, then this is the fastest + mode for submitting data. + + The second mode allows you to submit data via main-RAM vertex buffers, + which will be queued until the proper primitive type is active. In this + case, each piece of data is copied into the vertex buffer while the + wrong list is activated, and when the proper list becomes activated, + the data is all sent at once. Ideally this would be via DMA, right + now it is by store queues. This has the advantage of allowing you to + send data in any order and have the PVR functions resolve how it should + get sent to the hardware, but it is slower. + + The nice thing is that any combination of these modes can be used. You + can assign a vertex buffer for any list, and it will be used to hold the + incoming vertex data until the proper list has come up. Or if the proper + list is already up, the data will be submitted directly. So if most of + your polygons are opaque, and you only have a couple of translucents, + you can set a small buffer to gather translucent data and then it will + get sent when you do a pvr_end_scene(). + + Thanks to Mikael Kalms for the idea for this API. + + Another somewhat subtle point that bears mentioning is that in the normal + case (interrupts enabled) an interrupt handler will automatically take + care of starting a frame rendering (after scene_finish()) and also + flipping pages when appropriate. */ + +/* Returns non-zero if vertex DMA was enabled at init time. */ +int pvr_vertex_dma_enabled(); + +/* Setup a vertex buffer for one of the list types. If the specified list type + already has a vertex buffer, it will be replaced by the new one; if NULL + is specified as a buffer location, the list type will be switched to direct + mode. The old buffer location will be returned (if any). Note that each + buffer should actually be twice as long (to hold two frames' worth of + data). The 'len' should be a multiple of 64, and the pointer should be + aligned to a 32-byte boundary. 'len' also may not be smaller than 128 + bytes, even if you have no intention of using the given list. Also you + should generally not try to do this at any time besides before a frame + is begin, or Bad Things May Happen. */ +void * pvr_set_vertbuf(pvr_list_t list, void * buffer, int len); + +/* Return a pointer to the current output location in the DMA buffer for + the requested list. DMA must globally be enabled for this to work. Data + may be added to this buffer by the user program directly. */ +void * pvr_vertbuf_tail(pvr_list_t list); + +/* Notify the PVR system that data have been written into the output buffer + for the given list. This should always be done after writing data directly + to these buffers or it will get overwritten by other data. 'amt' is in + bytes and should _always_ be a multiple of 32. */ +void pvr_vertbuf_written(pvr_list_t list, uint32 amt); + +/* Begin collecting data for a frame of 3D output to the off-screen + frame buffer */ +void pvr_scene_begin(); + +/* Begin collecting data for a frame of 3D output to the specified texture; + pass in the size of the buffer in rx and ry, and the return values in + rx and ry will be the size actually used (if changed). Note that + currently this only supports screen-sized output! */ +void pvr_scene_begin_txr(pvr_ptr_t txr, uint32 *rx, uint32 *ry); + +/* Begin collecting data for the given list type. Lists do not have to be + submitted in any particular order, but all types of a list must be + submitted at once (unless vertex DMA mode is enabled). If the given list + has already been closed, then an error (-1) is returned. Note that there + is no need to call this function in DMA mode unless you want to make use + of pvr_prim for compatibility. */ +int pvr_list_begin(pvr_list_t list); + +/* End collecting data for the current list type. Lists can never be opened + again within a single frame once they have been closed. Thus submitting + a primitive that belongs in a closed list is considered an error. Closing + a list that is already closed is also an error (-1). Note that if you open + a list but do not submit any primitives, a blank one will be submitted to + satisfy the hardware. If vertex DMA mode is enabled, then this simply + sets the current list pointer to no list, and none of the above restrictions + apply. */ +int pvr_list_finish(); + +/* Submit a primitive of the _current_ list type; note that any values + submitted in this fashion will go directly to the hardware without any + sort of buffering, and submitting a primitive of the wrong type will + quite likely ruin your scene. Note that this also will not work if you + haven't begun any list types (i.e., all data is queued). If DMA is enabled, + the primitive will be appended to the end of the currently selected list's + buffer. Returns -1 for failure. */ +int pvr_prim(void * data, int size); + +/* Initialize a state variable for Direct Rendering; variable should be + of the type pvr_dr_state_t */ +#ifdef USE_SQ_MMU +#define pvr_dr_init(vtx_buf_ptr) do { \ + (vtx_buf_ptr) = 0; \ +} while (0) +#else +#define pvr_dr_init(vtx_buf_ptr) do { \ + (vtx_buf_ptr) = 0; \ + QACR0 = ((((uint32)PVR_TA_INPUT) >> 26) << 2) & 0x1c; \ + QACR1 = ((((uint32)PVR_TA_INPUT) >> 26) << 2) & 0x1c; \ +} while (0) +#endif +#define pvr_dr_state_t uint32 + +/* Obtain the target address for Direct Rendering; this will return a + write-only destination address where a primitive should be written to get + ready to submit it to the TA in DR mode. You must pass in a variable + which was initialized with pvr_dr_init(). */ +#ifdef USE_SQ_MMU +#define pvr_dr_target(vtx_buf_ptr) \ + ({ (vtx_buf_ptr) ^= 32; \ + (pvr_vertex_t *)(0xe2000000 | (vtx_buf_ptr)); \ + }) +#else +#define pvr_dr_target(vtx_buf_ptr) \ + ({ (vtx_buf_ptr) ^= 32; \ + (pvr_vertex_t *)(0xe0000000 | (vtx_buf_ptr)); \ + }) +#endif + +/* Commit a primitive written into the Direct Rendering target address; pass + the address returned by pvr_dr_target(). */ +#define pvr_dr_commit(addr) __asm__ __volatile__("pref @%0" : : "r" (addr)) + +/* Submit a primitive of the given list type; if the requested list is not + the current list, then the data will be queued in a vertex buffer if + available, otherwise it will be submitted directly. If a vertex buffer + doesn't exist when one is needed, an error (-1) is returned. */ +int pvr_list_prim(pvr_list_t list, void * data, int size); + +/* Called to flush buffered data of the given list type to the hardware + processor. If there is no vertex buffer for the given type, then an error + (-1) is returned. The list must have been started with pvr_begin_list(). + This is intended to be used later in a "hybrid" mode where both direct + and DMA TA submission is possible. */ +int pvr_list_flush(pvr_list_t list); + +/* Call this after you have finished submitting all data for a frame; once + this has been called, you can not submit any more data until one of the + pvr_scene_begin() functions is called again. An error (-1) is returned if + you have not started a scene already. */ +int pvr_scene_finish(); + +/* Block the caller until the PVR system is ready for another frame to be + submitted. The PVR system allocates enough space for two frames: one in + data collection mode, and another in rendering mode. If a frame is + currently rendering, and another frame has already been closed, then the + caller cannot do anything else until the rendering frame completes. Note + also that the new frame cannot be activated except during a vertical + blanking period, so this essentially waits until a rendered frame is + complete _AND_ a vertical blank happens. Returns -1 if the wait times + out. Note that once this returns, the PVR system is ready for another + frame's data to be collected. */ +int pvr_wait_ready(); + +/* Same thing as above, but in non-blocking form; returns -1 if the PVR isn't + ready; returns 0 when the PVR has accepted your frame and is ready for + more. If this returns 0 then you _must_ call pvr_wait_ready afterwards + to clear the condition. */ +int pvr_check_ready(); + + +/* Primitive handling ************************************************/ + +/* These functions help you prepare primitives for loading into the + PVR for scene processing. */ + +/* Compile a polygon context into a polygon header */ +void pvr_poly_compile(pvr_poly_hdr_t *dst, pvr_poly_cxt_t *src); + +/* Create a colored polygon context with parameters similar to + the old "ta" function `ta_poly_hdr_col' */ +void pvr_poly_cxt_col(pvr_poly_cxt_t *dst, pvr_list_t list); + +/* Create a textured polygon context with parameters similar to + the old "ta" function `ta_poly_hdr_txr' */ +void pvr_poly_cxt_txr(pvr_poly_cxt_t *dst, pvr_list_t list, + int textureformat, int tw, int th, pvr_ptr_t textureaddr, + int filtering); + +/* Compile a sprite context into a colored polygon header */ +void pvr_sprite_compile(pvr_sprite_hdr_t *dst, + pvr_sprite_cxt_t *src); + +/* Create an untextured sprite context */ +void pvr_sprite_cxt_col(pvr_sprite_cxt_t *dst, pvr_list_t list); + +/* Create a textured sprite context */ +void pvr_sprite_cxt_txr(pvr_sprite_cxt_t *dst, pvr_list_t list, + int textureformat, int tw, int th, pvr_ptr_t textureaddr, + int filtering); + +/* Create a modifier volume context */ +void pvr_mod_compile(pvr_mod_hdr_t *dst, pvr_list_t list, uint32 mode, + uint32 cull); + +/* Compile a polygon context into a polygon header that is affected by + modifier volumes */ +void pvr_poly_mod_compile(pvr_poly_mod_hdr_t *dst, pvr_poly_cxt_t *src); + +/* Create a colored polygon context for polygons affected by + modifier volumes */ +void pvr_poly_cxt_col_mod(pvr_poly_cxt_t *dst, pvr_list_t list); + +/* Create a textured polygon context for polygons affected by + modifier volumes */ +void pvr_poly_cxt_txr_mod(pvr_poly_cxt_t *dst, pvr_list_t list, + int textureformat, int tw, int th, + pvr_ptr_t textureaddr, int filtering, + int textureformat2, int tw2, int th2, + pvr_ptr_t textureaddr2, int filtering2); + +/* Texture handling **************************************************/ + +/* Helper functions for handling texture tasks of various kinds. */ + +/* Load raw texture data from an SH-4 buffer into PVR RAM */ +void pvr_txr_load(void * src, pvr_ptr_t dst, uint32 count); + +/* Constants for texture loading */ +#define PVR_TXRLOAD_4BPP 0x01 /* Basic pixel formats */ +#define PVR_TXRLOAD_8BPP 0x02 +#define PVR_TXRLOAD_16BPP 0x03 +#define PVR_TXRLOAD_FMT_MASK 0x0f + +#define PVR_TXRLOAD_VQ_LOAD 0x10 /* Do VQ encoding (not supported yet, if ever) */ +#define PVR_TXRLOAD_INVERT_Y 0x20 /* Invert the Y axis while loading */ +#define PVR_TXRLOAD_FMT_VQ 0x40 /* Texture is already VQ encoded */ +#define PVR_TXRLOAD_FMT_TWIDDLED 0x80 /* Texture is already twiddled */ +#define PVR_TXRLOAD_FMT_NOTWIDDLE 0x80 /* Same sorta thing -- don't twiddle it */ +#define PVR_TXRLOAD_DMA 0x8000 /* Use DMA to load the texture */ +#define PVR_TXRLOAD_NONBLOCK 0x4000 /* Use non-blocking loads (only for DMA) */ +#define PVR_TXRLOAD_SQ 0x2000 /* Use store queues to load */ + +/* Load texture data from an SH-4 buffer into PVR RAM, twiddling it + in the process, among other things (see pvr_texture.c for more + details) */ +void pvr_txr_load_ex(void * src, pvr_ptr_t dst, uint32 w, uint32 h, uint32 flags); + +/* Load a KOS Platform Independent Image (subject to restraint checking) */ +void pvr_txr_load_kimg(kos_img_t *img, pvr_ptr_t dst, uint32 flags); + + +/* PVR DMA ***********************************************************/ + +/** Interrupt callback type */ +typedef void (*pvr_dma_callback_t)(ptr_t data); + +/** Perform a DMA transfer to the PVR. The source pointer must be 32-byte + aligned, and the count should be a multiple of 32 bytes. Type should + be one of the constants below. If block is non-zero, then the function + will only return when the DMA operation has completed. If callback is + non-NULL, then the function will be called on completion (in an interrupt + context!). Returns <0 for failure. */ +int pvr_dma_transfer(void * src, uint32 dest, uint32 count, int type, + int block, pvr_dma_callback_t callback, ptr_t cbdata); + +#define PVR_DMA_VRAM64 0 /*< Transfer to VRAM in interleaved mode */ +#define PVR_DMA_VRAM32 1 /*< Transfer to VRAM in linear mode */ +#define PVR_DMA_TA 2 /*< Transfer to the tile accelerator */ + +/** Load a texture using PVR DMA. If block is non-zero, then the function + will not return until the texture DMA is complete. Otherwise, check + the value of pvr_dma_ready() to see if things are ready. */ +int pvr_txr_load_dma(void * src, pvr_ptr_t dest, uint32 count, int block, + pvr_dma_callback_t callback, ptr_t cbdata); + +/** Loads a block of vertex data to the tile accelerator. Same semantics as + the above stuff. */ +int pvr_dma_load_ta(void * src, uint32 count, int block, + pvr_dma_callback_t callback, ptr_t cbdata); + +/** Returns non-zero if PVR DMA is inactive. */ +int pvr_dma_ready(); + +/** Initialize PVR DMA */ +void pvr_dma_init(); + +/** Shut down PVR DMA */ +void pvr_dma_shutdown(); + +/*********************************************************************/ + + +__END_DECLS + +#endif + diff --git a/src/mmu_handle/kos-patch/lib/dreamcast/libkallisti.a b/src/mmu_handle/kos-patch/lib/dreamcast/libkallisti.a new file mode 100644 index 0000000000000000000000000000000000000000..0fa0faa1588693b81caeb7f5d718da63e1da3dd5 GIT binary patch literal 1800440 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 e0{eM9 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%0DQZ3~=-IGKew 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�I_v4PZD!ow#{D}R_FJ6wO~gC>!fd} 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 +#include + +/* +#define MMU_HANDLE_EXTRA_DEBUG +#define MMU_HANDLE_DEBUG +*/ + + +#define MMU_HANDLE_SLOT (1<>PAGESIZE_BITS) + +typedef struct { + void *callback; + void *ptr; + unsigned char reg_addr, reg_dat, rw, add_pc; +}mmu_handle_callback_t; + +static int mmu_handle_started=0; +static mmucontext_t * mmu_handle_ctx; +static mmu_mapfunc_t mmu_handle_handler_back; +static void *mmu_handle_realmem[MMU_HANDLE_MAX]; +static void *mmu_handle_membuf[MMU_HANDLE_MAX]; +static unsigned char mmu_handle_tofree[MMU_HANDLE_MAX]; +static int mmu_handle_callbacks=0; +static mmu_handle_callback_t mmu_handle_callback[MMU_HANDLE_MAX_CALLBACK]; + +static unsigned *mmu_handle_memaccess=NULL; +static unsigned mmu_handle_memaccess_size=0; +static unsigned mmu_handle_frame=1; +static unsigned mmu_handle_nbufs=0; +static unsigned mmu_handle_npags=0; +static unsigned mmu_handle_nvirtualpags=0; +static unsigned mmu_handle_memsize[MMU_HANDLE_MAX]; +static unsigned mmu_handle_virtualmemsize[MMU_HANDLE_MAX]; +static void *mmu_handle_virtualbuf[MMU_HANDLE_MAX]; +static mmu_handle_func_t mmu_handle_func[MMU_HANDLE_MAX]; +static mmu_handle_func_t mmu_handle_prefetch_func[MMU_HANDLE_MAX]; +static void *mmu_handle_prefetch_mem[MMU_HANDLE_MAX]; +int mmu_handle_prefetching=0; +static int mmu_handle_prefetch_func_enable=1; + +static volatile unsigned * const mmu_handle_pteh = (unsigned *)(0xff000000); +static volatile unsigned * const mmu_handle_ptel = (unsigned *)(0xff000004); +static volatile unsigned * const mmu_handle_tea = (unsigned *)(0xff00000c); +static volatile unsigned * const mmu_handle_mmucr = (unsigned *)(0xff000010); + + +#ifdef MMU_HANDLE_CACHEABLE +#define MMU_HANDLE_MMU_CACHE MMU_CACHE_WT +#else +#define MMU_HANDLE_MMU_CACHE MMU_NO_CACHE +#endif + +#if defined(MMU_HANDLE_EXTRA_DEBUG) && !defined(MMU_HANDLE_DEBUG) +#define MMU_HANDLE_DEBUG +#endif + +#if defined(MMU_HANDLE_DEBUG) && defined(MMU_HANDLE_USE_REAL_HANDLER) +#undef MMU_HANDLE_USE_REAL_HANDLER +#endif + +#ifdef MMU_HANDLE_USE_REAL_HANDLER +#ifdef __cplusplus +extern "C" { +static void mmu_handle_real_handler(irq_t source, irq_context_t *context); +} +#endif +#endif + +#define MMU_HANDLER_PTEL(PA, V, SZ, PR, C, D, SH, WT) \ + ( ((PA) & 0xfffffc00) | ((V) << 8) \ + | ( ((SZ) & 2) << 6 ) | ( ((SZ) & 1) << 4 ) \ + | ( (PR) << 5 ) \ + | ( (C) << 3 ) \ + | ( (D) << 2 ) \ + | ( (SH) << 1 ) \ + | ( (WT) << 0 ) ) + +#define MMU_HANDLER_LDTBL(PTEHV, PTELV) \ + *mmu_handle_pteh = PTEHV; \ + *mmu_handle_ptel = PTELV; \ + asm("ldtlb"); + + +static int mmu_handle_exec(unsigned sel, unsigned virtual_ptr, unsigned real_buf) +{ +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: exec -> sel=%i, virtual_ptr=0x%X, real_buf=%p\n",sel,virtual_ptr,real_buf); +#endif +#ifdef MMU_HANDLE_DEBUG + if ((mmu_handle_func[sel])==NULL) + { + puts("\nmmu_handle.c: exec -> ERROR CRITICO: SIN MANEJADOR !!!\n"); + return -1; + } +#endif + unsigned size=MMU_HANDLE_SLOT_SIZE; + unsigned start=virtual_ptr-((unsigned)mmu_handle_virtualbuf[sel]); +#ifdef MMU_HANDLE_DEBUG + if (start>mmu_handle_virtualmemsize[sel]) + { + puts("\nmmu_handle.c: exec -> ERROR CRITICO: START MAYOR QUE TOTAL !!!\n"); + return -2; + } +#endif + if ((start+MMU_HANDLE_SLOT_SIZE)>mmu_handle_virtualmemsize[sel]) + size=MMU_HANDLE_SLOT_SIZE-((start+MMU_HANDLE_SLOT_SIZE)%mmu_handle_virtualmemsize[sel]); + + (mmu_handle_func[sel])((void *)real_buf,start,size); + return 0; +} + +static int mmu_handle_read(unsigned virtualpage, unsigned real_buf) +{ + unsigned i,sel=0; + unsigned maximo=0; + unsigned virtual_ptr=virtualpage< virtual_ptr=%p, real_buf=%p\n",virtual_ptr,real_buf); +#endif + for(i=0;imaximo)&&(actual<=virtual_ptr)) + { + maximo=actual; + sel=i; + } + } + return mmu_handle_exec(sel,virtual_ptr,real_buf); +} + +static void mmu_handle_fill(unsigned addr, unsigned size) +{ + unsigned orig_vp=addr>>PAGESIZE_BITS; + unsigned poff=orig_vp&MMU_HANDLE_SLOT_PAGMASK; + unsigned pmask=orig_vp-poff; + mmusubcontext_t *sc=mmu_handle_ctx->sub[pmask>>9]; + if (sc) + for(unsigned i=0;i<(size/PAGESIZE);i++) { + sc->page[i+(pmask&0x1ff)].blank=1; + sc->page[i+(pmask&0x1ff)].physical=0; + sc->page[i+(pmask&0x1ff)].valid=0; + } + mmu_handle_flush(); +} + +static unsigned mmu_handle_find(unsigned orig_vp) +{ + unsigned poff=orig_vp&MMU_HANDLE_SLOT_PAGMASK; + unsigned pmask=orig_vp-poff; + unsigned minimo=0xFFFFFFFF; + unsigned vp=MMU_HANDLE_BEGINMEM_PAG; + unsigned save_vp=0; + mmupage_t *save_p=NULL; +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: find -> orig_vp=0x%X\n",orig_vp); +#endif + { + mmusubcontext_t *sc=mmu_handle_ctx->sub[pmask>>9]; + if (!sc) return 0; + mmupage_t *p=&sc->page[pmask&0x1ff]; + if (!p) return 0; + if (p->prkey==MMU_ALL_RDWR) + { + save_vp=pmask; + save_p=p; + } + } + if (!save_vp) + for(vp=MMU_HANDLE_BEGINMEM_PAG;vp<(MMU_HANDLE_BEGINMEM_PAG+mmu_handle_nvirtualpags);vp+=MMU_HANDLE_SLOT) + { + mmusubcontext_t *sc=mmu_handle_ctx->sub[vp>>9]; + if (!sc) break; + mmupage_t *p=&sc->page[vp&0x1ff]; + if (!p) break; + if (p->prkey==MMU_ALL_RDWR) + { + unsigned actual=mmu_handle_memaccess[(vp-MMU_HANDLE_BEGINMEM_PAG)>>MMU_HANDLE_SLOT_SHIFT]; +#ifdef MMU_HANDLE_EXTRA_DEBUG + printf("mmu_handle.c: find -> vp=0x%X, actual=%i, minimo=%i\n",vp,actual,minimo); +#endif + if ((actualvalid))) + { + minimo=actual; + save_p=p; + save_vp=vp; + } + } + } +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: find -> save_vp=0x%X\n",save_vp); +#endif + if (save_p) + { + int i; + unsigned ret=save_p->physical; + if (mmu_handle_read(pmask,(ret << PAGESIZE_BITS)|0x80000000)) + return 0; + for(i=0,vp=pmask;isub[vp>>9]; + if (!sc) break; + mmupage_t *p=&sc->page[vp&0x1ff]; + if (!p) break; + p->valid=1; + p->prkey=MMU_ALL_RDWR; + p->physical=ret+i; +#ifdef MMU_HANDLE_CACHEABLE + p->cache=1; + p->wthru=1; +#endif +#ifdef MMU_HANDLE_READONLY + p->dirty=0; +#endif + p->ptel = MMU_HANDLER_PTEL(p->physical << PAGESIZE_BITS, 1, 1, p->prkey, p->cache, p->dirty, p->shared, p->wthru); + vp++; + } + if (save_vp!=pmask) + for(i=0,vp=save_vp;isub[vp>>9]; + if (!sc) break; + mmupage_t *p=&sc->page[vp&0x1ff]; + if (!p) break; + p->valid=0; + p->prkey=MMU_KERNEL_RDWR; + p->physical=0; + vp++; + } + dcache_flush_range((ret << PAGESIZE_BITS)|0x80000000, MMU_HANDLE_SLOT_SIZE ); + mmu_handle_flush(); + return ret+poff; + } + return 0; +} + +void *mmu_handle_get_membuf(unsigned id) +{ + unsigned i; + for(i=0;i=mmu_handle_nbufs) + return; + + if (func) (*func)(100,100); + + msize=mmu_handle_memsize[vp]; + + vp=MMU_HANDLE_BEGINMEM_PAG; + { + mmusubcontext_t *sc=mmu_handle_ctx->sub[vp>>9]; + mmupage_t *p=&sc->page[vp&0x1ff]; + phy=p->physical; + msize>>=PAGESIZE_BITS; + msize+=phy; + } + for(i=0;vp<(MMU_HANDLE_BEGINMEM_PAG+mmu_handle_nvirtualpags);vp+=MMU_HANDLE_SLOT) + { + mmusubcontext_t *sc=mmu_handle_ctx->sub[vp>>9]; + mmupage_t *p=&sc->page[vp&0x1ff]; + switch (the_array[i]) + { + case 0: + mmu_handle_memaccess[i]=0; + p->valid=0; + p->physical=0; + p->prkey=MMU_KERNEL_RDWR; + i++; + break; + case 0xFFFFFFFF: + p->valid=0; + if (phyphysical=phy; + phy++; + } + else + { + p->physical=0; + p->prkey=MMU_KERNEL_RDWR; + } + mmu_handle_memaccess[i]=0; + break; + default: + p->valid=1; + p->prkey=MMU_ALL_RDWR; + p->physical=phy; +#ifdef MMU_HANDLE_CACHEABLE + p->cache=1; + p->wthru=1; +#endif +#ifdef MMU_HANDLE_READONLY + p->dirty=0; +#endif + mmu_handle_memaccess[i]=the_array[i]; + phy++; + i++; + } + p->ptel = MMU_HANDLER_PTEL(p->physical << PAGESIZE_BITS, 1, 1, p->prkey, p->cache, p->dirty, p->shared, p->wthru); + } +} + +#if MMU_HANDLE_SLICE > 0 +void mmu_handle_find_slice(unsigned orig_vp) +{ + unsigned i, nvp=orig_vp+1; + for(i=1;(i<(1<sub[nvp>>9])->page[nvp&0x1ff]); + if (!np->valid) + mmu_handle_find(nvp); + mmu_handle_memaccess[(nvp-MMU_HANDLE_BEGINMEM_PAG)>>MMU_HANDLE_SLOT_SHIFT]=mmu_handle_frame; + } +} +#endif + +static void mmu_handle_jmp_callback(irq_context_t *context) +{ +//puts("JMP CALLBACK"); + for(int i=0;ipc==(unsigned)mmu_handle_callback[i].ptr){ +//printf("ENCONTRADO CALLBACK %i en %p (reg_addr=%.8X) (reg_dat=%.8X)\n",i,context->pc,context->r[mmu_handle_callback[i].reg_addr],context->r[mmu_handle_callback[i].reg_dat]); + if (mmu_handle_callback[i].callback) { + if (mmu_handle_callback[i].rw) + ((void (*)(unsigned,unsigned))mmu_handle_callback[i].callback)(context->r[mmu_handle_callback[i].reg_addr], context->r[mmu_handle_callback[i].reg_dat]); + else + context->r[mmu_handle_callback[i].reg_dat]=((unsigned (*)(unsigned))mmu_handle_callback[i].callback)(context->r[mmu_handle_callback[i].reg_addr]); +//puts("---"); + } + context->pc+=mmu_handle_callback[i].add_pc; + return; + } +// printf("NO ENCONTRADO CALLBACK PARA %p en PC=%p\n",(*mmu_handle_tea),context->pc); + context->pc+=4; +} + +#ifdef MMU_HANDLE_USE_REAL_HANDLER +static mmupage_t * mmu_handle_handler(mmucontext_t * c, int _vp) { + return NULL; +} +static void mmu_handle_real_handler(irq_t source, irq_context_t *context) { + register unsigned _vp= (*mmu_handle_tea)>>PAGESIZE_BITS; +#else +static mmupage_t * mmu_handle_handler(mmucontext_t * c, int _vp) { +#endif + register unsigned vp=_vp&0x7FFFF; +//printf("MMU HANDLER %i (%p)\n",vp,*mmu_handle_tea); +#ifdef MMU_HANDLE_DEBUG + if (c!=mmu_handle_ctx) + { + puts("\nmmu_handle.c: ERROR CRITICO -> CONTEXTO NO IDENTIFICADO !!!"); + printf("\t\tvp=0x%X\n\n",vp); + return (mmupage_t *)NULL; + } + + unsigned hvp=vp>>9; + mmusubcontext_t *sc=c->sub[hvp]; + + if (sc==NULL) + { + puts("\nmmu_handle.c: ERROR CRITICO -> SUBCONTEXTO NO ENCONTRADO !!!"); + printf("\t\tvp=0x%X, hvp=0x%X\n\n",vp,hvp); + return (mmupage_t *)NULL; + } + + unsigned lvp=vp&0x1ff; + mmupage_t *p=&sc->page[lvp]; + + if (p==NULL) + { + puts("\nmmu_handle.c: ERROR CRITICO -> PAGINA NO ENCONTRADA !!!"); + printf("\t\tvp=0x%X, hvp=0x%X, lvp=0x%X\n\n",vp,hvp,lvp); + return (mmupage_t *)NULL; + } +#else +//printf("VP>>9 = %i, Pag=%i\n",vp>>9,vp&0x1ff); + if (!mmu_handle_ctx->sub[vp>>9]){ + mmu_handle_jmp_callback(context); + return; + } + register mmupage_t *p=&(((mmusubcontext_t *)mmu_handle_ctx->sub[vp>>9])->page[vp&0x1ff]); +#endif + +#ifdef MMU_HANDLE_EXTRA_DEBUG + printf("mmu_handle.c: handler -> VP=0x%X -> HVP=0x%X, LVP=0x%X -> physical=0x%X, prkey=0x%X\n", vp,hvp,lvp,p->physical,p->prkey); +#endif + + if (!p->valid) + { +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: handler -> FALLO EN LA PAGINA 0x%X\n",vp); +#endif + if (((unsigned)vp=(MMU_HANDLE_BEGINMEM_PAG+mmu_handle_nvirtualpags)) || p->blank) + { +#ifdef MMU_HANDLE_DEBUG + puts("\nmmu_handle.c: ERROR CRITICO -> PAGINA FUERA DE RANGO !!!\n"); + return NULL; +#else + mmu_handle_jmp_callback(context); + return; +#endif + } + p->physical=mmu_handle_find(vp); +#if MMU_HANDLE_SLICE > 0 + if (!mmu_handle_prefetching) + mmu_handle_find_slice(vp); +#endif + if (!p->physical) { + mmu_handle_jmp_callback(context); +#ifdef MMU_HANDLE_USE_REAL_HANDLER + return; +#else + return NULL; +#endif + } +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: handler -> NUEVA PAGINA physical=0x%X\n",p->physical); +#endif + mmu_handle_frame++; + } +#ifdef MMU_HANDLE_EXTRA_DEBUG + printf("mmu_handle.c: handler -> mmu_handle_memaccess[0x%X]=%i\n",(vp-MMU_HANDLE_BEGINMEM_PAG)>>MMU_HANDLE_SLOT_SHIFT,mmu_handle_frame); +#endif + if (vp==(unsigned)_vp) + mmu_handle_memaccess[(vp-MMU_HANDLE_BEGINMEM_PAG)>>MMU_HANDLE_SLOT_SHIFT]=mmu_handle_frame; +#ifdef MMU_HANDLE_USE_REAL_HANDLER + MMU_HANDLER_LDTBL(p->pteh,p->ptel); +#else + return p; +#endif +} + +static void *mmu_handle_get_pages(unsigned npages) +{ + unsigned i; + unsigned ptr=0; + void *dummy=NULL; + for(i=0;i<(PAGESIZE*2);i+=4) + { + ptr=(unsigned)malloc(npages<>PAGESIZE_BITS,real_pags,MMU_ALL_RDWR,MMU_HANDLE_MMU_CACHE,MMU_NOT_SHARED,MMU_DIRTY); + for(i=0;i>9; + if (i>=real_pags) + mmu_page_map(mmu_handle_ctx,vp,0,1,MMU_KERNEL_RDWR,MMU_HANDLE_MMU_CACHE,MMU_NOT_SHARED,MMU_DIRTY); + mmusubcontext_t *sc=mmu_handle_ctx->sub[hvp]; + if (!sc) + { + free(mmu_handle_realmem[mmu_handle_nbufs]); + mmu_handle_realmem[mmu_handle_nbufs]=NULL; + mmu_handle_membuf[mmu_handle_nbufs]=NULL; + return -2; + } + unsigned lvp=vp&0x1ff; + mmupage_t *p=&sc->page[lvp]; + if (!p) + { + free(mmu_handle_realmem[mmu_handle_nbufs]); + mmu_handle_realmem[mmu_handle_nbufs]=NULL; + mmu_handle_membuf[mmu_handle_nbufs]=NULL; + return -3; + } + p->valid=0; + } + mmu_handle_virtualbuf[mmu_handle_nbufs]=(void *)((MMU_HANDLE_BEGINMEM_PAG+mmu_handle_nvirtualpags)<>MMU_HANDLE_SLOT_SHIFT))*sizeof(unsigned); + mmu_handle_memaccess=(unsigned *)realloc(mmu_handle_memaccess,mmu_handle_memaccess_size); + if (mmu_handle_memaccess==NULL) + { + mmu_handle_npags-=real_pags; + mmu_handle_nvirtualpags-=virtual_pags; + free(mmu_handle_realmem[mmu_handle_nbufs]); + mmu_handle_realmem[mmu_handle_nbufs]=NULL; + mmu_handle_membuf[mmu_handle_nbufs]=NULL; + return -4; + } + bzero(mmu_handle_memaccess,mmu_handle_memaccess_size); + return 0; + } + return -1; +} + +#ifdef MMU_HANDLE_USE_SQ_PATCH +static void mmu_handle_set_sq(void *sq, unsigned pages, void *dest) +{ + unsigned i; + unsigned addr=(unsigned)sq; + unsigned vp=(0xe0000000 | ( addr & 0x03ffffe0))>>PAGESIZE_BITS; + unsigned vp_dest=((unsigned)dest)>>PAGESIZE_BITS; + mmu_page_map(mmu_handle_ctx,vp,vp_dest,pages,MMU_ALL_RDWR,MMU_HANDLE_MMU_CACHE,MMU_NOT_SHARED,MMU_DIRTY); + mmu_handle_flush(); + vp&=0x7FFFF; + for(i=0;i>9; + unsigned lvp=vp&0x1ff; + mmusubcontext_t *sc=mmu_handle_ctx->sub[hvp]; + if (!sc) + break; + mmupage_t *p=&sc->page[lvp]; + if (!p) + break; + p->physical=vp_dest; + p->ptel = MMU_HANDLER_PTEL(vp_dest << (PAGESIZE_BITS), 1, 1, 3, 1, 1, 1, 1); + vp++; + vp_dest++; + } +} + +static void mmu_handle_sq_patch(void) +{ + mmu_handle_set_sq((void *)0x00000000,2048,(void *)0x00000000); + mmu_handle_set_sq((void *)0xE0800000,2048,(void *)0x04000000); + mmu_handle_set_sq((void *)0xE1800000,2048,(void *)0x05000000); + mmu_handle_set_sq((void *)0xE2000000,2048,(void *)0x10000000); +} +#endif + +static void mmu_handle_init_helper(void) +{ + int i; + for(i=0;i=MMU_HANDLE_MAX)||(!virtual_size)||(!real_size)) + return NULL; + if (virtual_size&MMU_HANDLE_SLOT_MASK) + virtual_pags+=MMU_HANDLE_SLOT; + virtual_pags+=(virtual_size>>MMU_HANDLE_SLOT_BITS)<>MMU_HANDLE_SLOT_BITS)< virtual_pags=%i, real_pags=%i\n",virtual_pags,real_pags); +#endif + mmu_handle_func[mmu_handle_nbufs]=func; + if (virtual_pags<=real_pags && !mem) + { +// NOT USE MMU FOR THIS CASE +// ONLY FOR CALLBACKS +// if (!mmu_handle_allocbuf(real_pags,mem)) +// return NULL; + mmu_handle_memsize[mmu_handle_nbufs]=real_pags<=mmu_handle_virtualmemsize[i]) + return; + if (size+pos>mmu_handle_virtualmemsize[i]) + size=mmu_handle_virtualmemsize[i]-pos; + if (!mmu_handle_virtualbuf[i]) + (mmu_handle_func[i])(mmu_handle_membuf[i], pos, size); + else + { + unsigned j; + mmu_handle_prefetching=1; + mmu_handle_func_t back_prefetch_func=NULL; + if ((mmu_handle_prefetch_func[i])&&(mmu_handle_prefetch_func_enable)) + { + back_prefetch_func=mmu_handle_func[i]; + mmu_handle_func[i]=mmu_handle_prefetch_func[i]; + } + if (!back_prefetch_func) + { + for(j=pos;j<(pos+size);j+=MMU_HANDLE_SLOT_SIZE) + d+=*((unsigned char *)((unsigned)mmu_handle_virtualbuf[i])+j); + } + else + { + for(j=pos;j<(pos+size);j+=MMU_HANDLE_SLOT_SIZE) + { + (back_prefetch_func)(mmu_handle_prefetch_mem[i],j,MMU_HANDLE_SLOT_SIZE); + d+=*((unsigned char *)((unsigned)mmu_handle_virtualbuf[i])+j); + } + } + if (back_prefetch_func) + mmu_handle_func[i]=back_prefetch_func; + mmu_handle_prefetching=0; + } + ___mmu_handle_prefetched___=d; + } +#ifdef MMU_HANDLE_DEBUG + puts("mmu_handle.c: prefetched"); +#endif +} + + +void mmu_handle_prefetch_by_array(unsigned id, unsigned *the_array,mmu_handle_loading_func_t func) +{ +#ifdef MMU_HANDLE_DEBUG + printf("mmu_handle.c: prefetching by array %p ...\n",id); +#endif + unsigned i,total=0,min=0xFFFFFFFF,max=0; + unsigned partial, size=mmu_handle_memaccess_size>>1,mul=2; + unsigned min_array, max_array; + for(i=0;imax)&&(the_array[i]<200000)) + max=the_array[i]; + if ((the_array[i]>=min)&&(the_array[i]<=max)) + total++; + } + if (i>10) + size=i-1; + else + return; + mmu_handle_reset(); + mmu_handle_prefetching=1; + mmu_handle_prefetch_func_enable=1; + if (total=min)&&(the_array[i]<=max)) + { + if (!ac) + init_ac=i; + ac++; + } + else + { + if (ac) + { + if (func) + { + static unsigned loading_func_time=0; + if (!(loading_func_time&31)) + (*func)((size*(mul-2))+i,size*mul); + loading_func_time++; + } + mmu_handle_prefetch(id,init_ac<=max_array) + max_array--; + } + } + mmu_handle_prefetching=0; + mmu_handle_prefetch_func_enable=1; + if (func) + (*func)(64,64); + +#ifdef MMU_HANDLE_DEBUG + puts("mmu_handle.c: prefetched by array"); +#endif +} + + +void mmu_handle_inc_frame(void) +{ + mmu_handle_frame++; +} + +void mmu_handle_flush(void) +{ + register uint32 status; + status = *mmu_handle_mmucr; + status |= 0x04; + *mmu_handle_mmucr = status; +} + +unsigned mmu_handle_get_free_memory(void) +{ + unsigned vp=MMU_HANDLE_BEGINMEM_PAG; + unsigned ret=mmu_handle_npags; + for(;(vp<(MMU_HANDLE_BEGINMEM_PAG+mmu_handle_nvirtualpags))&&(ret);vp++) + { + mmusubcontext_t *sc=mmu_handle_ctx->sub[vp>>9]; + if (!sc) break; + mmupage_t *p=&sc->page[vp&0x1ff]; + if (!p) continue; + if ((p->valid!=0)&&(p->prkey==MMU_ALL_RDWR)) + ret--; + } + return ret<sub[vp>>9]; + if (!sc) break; + mmupage_t *p=&sc->page[vp&0x1ff]; + if (!p) continue; + p->valid=0; + } + if (mmu_handle_memaccess) + bzero(mmu_handle_memaccess,mmu_handle_memaccess_size); + mmu_handle_frame=1; + mmu_handle_flush(); +} + +void mmu_handle_dump_memaccess(void) +{ + unsigned n,size=(mmu_handle_memaccess_size/sizeof(unsigned)); + unsigned next=0,saved=0,used=0; + for(n=0;n +#else +#include +#include +#include +#endif + +#if !defined(PAGESIZE) || !defined(PAGESIZE_BITS) +#undef PAGESIZE +#undef PAGESIZE_BITS +#define PAGESIZE_BITS 12 +#define PAGESIZE (1< +#include +#include +#include +#include + +#ifndef __WIN32__ +#include +#include +#include +#include +#endif + +#if defined (__WIN32__) +#include +#include + +#define ioctl ioctlsocket +#define close closesocket +#define read(a,b,c) recv(a, b, c, 0) +#define write(a,b,c) send(a, b, c, 0) +#else + +#include +#include +#include +#include +#include +#include + +#ifdef __SVR4 +#include +#endif +#endif + +#ifdef USE_THREADS +#include +#include +#include +#endif + +#include "snes9x.h" +#include "cpuexec.h" +#include "netplay.h" +#include "memmap.h" +#include "snapshot.h" +#include "display.h" + +void S9xNPClientLoop (void *); +bool8 S9xNPLoadROM (uint32 len); +bool8 S9xNPLoadROMDialog (const char *); +bool8 S9xNPGetROMImage (uint32 len); +void S9xNPGetSRAMData (uint32 len); +void S9xNPGetFreezeFile (uint32 len); + +unsigned long START = 0; + +bool8 S9xNPConnectToServer (const char *hostname, int port, + const char *rom_name) +{ + if (!S9xNPInitialise ()) + return (FALSE); + + S9xNPDisconnect (); + + NetPlay.MySequenceNum = 0; + NetPlay.ServerSequenceNum = 0; + NetPlay.Connected = FALSE; + NetPlay.Abort = FALSE; + NetPlay.Player = 0; + NetPlay.Paused = FALSE; + NetPlay.PercentageComplete = 0; + NetPlay.Socket = 0; + if (NetPlay.ServerHostName) + free ((char *) NetPlay.ServerHostName); + NetPlay.ServerHostName = strdup (hostname); + if (NetPlay.ROMName) + free ((char *) NetPlay.ROMName); + NetPlay.ROMName = strdup (rom_name); + NetPlay.Port = port; + NetPlay.PendingWait4Sync = FALSE; + +#ifdef __WIN32__ + if (GUI.ClientSemaphore == NULL) + GUI.ClientSemaphore = CreateSemaphore (NULL, 0, NP_JOYPAD_HIST_SIZE, NULL); + + if (NetPlay.ReplyEvent == NULL) + NetPlay.ReplyEvent = CreateEvent (NULL, FALSE, FALSE, NULL); + + _beginthread (S9xNPClientLoop, 0, NULL); +#endif + + return (TRUE); +} + +bool8 S9xNPConnect () +{ + struct sockaddr_in address; + struct hostent *hostinfo; + unsigned int addr; + + address.sin_family = AF_INET; + address.sin_port = htons (NetPlay.Port); +#ifdef NP_DEBUG + printf ("CLIENT: Looking up server's hostname (%s) @%ld\n", NetPlay.ServerHostName, S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Looking up server's hostname..."); + if ((int) (addr = inet_addr (NetPlay.ServerHostName)) == -1) + { + if ((hostinfo = gethostbyname (NetPlay.ServerHostName))) + { + memcpy ((char *)&address.sin_addr, hostinfo->h_addr, + hostinfo->h_length); + } + else + { + S9xNPSetError ("\ +Unable to look up server's IP address from hostname.\n\n\ +Unknown hostname or may be your nameserver isn't set\n\ +up correctly?"); + return (FALSE); + } + } + else + { + memcpy ((char *)&address.sin_addr, &addr, sizeof (addr)); + } + +#ifdef NP_DEBUG + printf ("CLIENT: Creating socket @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Creating network socket..."); + if ((NetPlay.Socket = socket (AF_INET, SOCK_STREAM, 0)) < 0) + { + S9xNPSetError ("Creating network socket failed."); + return (FALSE); + } + +#ifdef NP_DEBUG + printf ("CLIENT: Trying to connect to server @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Trying to connect to Snes9X server..."); + + if (connect (NetPlay.Socket, (struct sockaddr *) &address, sizeof (address)) < 0) + { + char buf [100]; +#ifdef __WIN32__ + if (WSAGetLastError () == WSAECONNREFUSED) +#else + if (errno == ECONNREFUSED) +#endif + { + S9xNPSetError ("\ +Connection to remote server socket refused:\n\n\ +Is there actually a Snes9X NetPlay server running\n\ +on the remote machine on this port?"); + } + else + { + sprintf (buf, "Connection to server failed with error number %d", +#ifdef __WIN32__ + WSAGetLastError () +#else + errno +#endif + ); + S9xNPDisconnect (); + } + return (FALSE); + } + NetPlay.Connected = TRUE; + +#ifdef NP_DEBUG + printf ("CLIENT: Sending 'HELLO' message @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Sending 'HELLO' message..."); + /* Send the server a HELLO packet*/ + int len = 7 + 4 + strlen (NetPlay.ROMName) + 1; + uint8 *tmp = new uint8 [len]; + uint8 *ptr = tmp; + + *ptr++ = NP_CLNT_MAGIC; + *ptr++ = NetPlay.MySequenceNum++; + *ptr++ = NP_CLNT_HELLO; + WRITE_LONG (ptr, len); + ptr += 4; + uint32 ft = Settings.FrameTime * 1000; + + WRITE_LONG (ptr, ft); + + ptr += 4; + strcpy ((char *) ptr, NetPlay.ROMName); + + if (!S9xNPSendData (NetPlay.Socket, tmp, len)) + { + S9xNPSetError ("Sending 'HELLO' message failed."); + S9xNPDisconnect (); + delete tmp; + return (FALSE); + } + delete tmp; + +#ifdef NP_DEBUG + printf ("CLIENT: Waiting for 'WELCOME' reply from server @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Waiting for 'HELLO' reply from server..."); + + uint8 header [7]; + + if (!S9xNPGetData (NetPlay.Socket, header, 7) || + header [0] != NP_SERV_MAGIC || header [1] != 0 || + (header [2] & 0x1f) != NP_SERV_HELLO) + { + S9xNPSetError ("Error in 'HELLO' reply packet received from server."); + S9xNPDisconnect (); + return (FALSE); + } +#ifdef NP_DEBUG + printf ("CLIENT: Got 'WELCOME' reply @%ld\n", S9xGetMilliTime () - START); +#endif + len = READ_LONG (&header [3]); + if (len > 256) + { + S9xNPSetError ("Error in 'HELLO' reply packet received from server."); + S9xNPDisconnect (); + return (FALSE); + } + uint8 *data = new uint8 [len]; + if (!S9xNPGetData (NetPlay.Socket, data, len - 7)) + { + S9xNPSetError ("Error in 'HELLO' reply packet received from server."); + delete data; + S9xNPDisconnect (); + return (FALSE); + } + + if (data [0] != NP_VERSION) + { + S9xNPSetError ("\ +The Snes9X NetPlay server implements a different\n\ +version of the protocol. Disconnecting."); + delete data; + S9xNPDisconnect (); + return (FALSE); + } + + NetPlay.FrameCount = READ_LONG (&data [2]); + + if (!(header [2] & 0x80) && + strcmp ((char *) data + 4 + 2, NetPlay.ROMName) != 0) + { + if (!S9xNPLoadROMDialog ((char *) data + 4 + 2)) + { + delete data; + S9xNPDisconnect (); + return (FALSE); + } + } + NetPlay.Player = data [1]; + delete data; + + NetPlay.PendingWait4Sync = TRUE; + Settings.NetPlay = TRUE; + S9xNPResetJoypadReadPos (); + NetPlay.ServerSequenceNum = 1; + +#ifdef NP_DEBUG + printf ("CLIENT: Sending 'READY' to server @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Sending 'READY' to the server..."); + + return (S9xNPSendReady ((header [2] & 0x80) ? + NP_CLNT_WAITING_FOR_ROM_IMAGE : + NP_CLNT_READY)); +} + +bool8 S9xNPSendReady (uint8 op) +{ + uint8 ready [7]; + uint8 *ptr = ready; + *ptr++ = NP_CLNT_MAGIC; + *ptr++ = NetPlay.MySequenceNum++; + *ptr++ = op; + WRITE_LONG (ptr, 7); + ptr += 4; + + if (!S9xNPSendData (NetPlay.Socket, ready, 7)) + { + S9xNPDisconnect (); + S9xNPSetError ("Sending 'READY' message failed."); + return (FALSE); + } + + return (TRUE); +} + +bool8 S9xNPSendPause (bool8 paused) +{ +#ifdef NP_DEBUG + printf ("CLIENT: Pause - %s @%ld\n", paused ? "YES" : "NO", S9xGetMilliTime () - START); +#endif + uint8 pause [7]; + uint8 *ptr = pause; + *ptr++ = NP_CLNT_MAGIC; + *ptr++ = NetPlay.MySequenceNum++; + *ptr++ = NP_CLNT_PAUSE | (paused ? 0x80 : 0); + WRITE_LONG (ptr, 7); + ptr += 4; + + if (!S9xNPSendData (NetPlay.Socket, pause, 7)) + { + S9xNPSetError ("Sending 'PAUSE' message failed."); + S9xNPDisconnect (); + return (FALSE); + } + + return (TRUE); +} + +#ifdef __WIN32__ +void S9xNPClientLoop (void *) +{ + NetPlay.Waiting4EmulationThread = FALSE; + + if (S9xNPConnect ()) + { + S9xClearPause (PAUSE_NETPLAY_CONNECT); + while (NetPlay.Connected) + { + if (S9xNPWaitForHeartBeat ()) + { + LONG prev; + if (!ReleaseSemaphore (GUI.ClientSemaphore, 1, &prev)) + { +#ifdef NP_DEBUG + printf ("CLIENT: ReleaseSemaphore failed - already hit max count (%d) %ld\n", NP_JOYPAD_HIST_SIZE, S9xGetMilliTime () - START); +#endif + S9xNPSetWarning ("NetPlay: Client may be out of sync with server."); + } + else + { + if (!NetPlay.Waiting4EmulationThread && + prev == (int) NetPlay.MaxBehindFrameCount) + { + NetPlay.Waiting4EmulationThread = TRUE; + S9xNPSendPause (TRUE); + } + } + } + else + S9xNPDisconnect (); + } + } + else + { + S9xClearPause (PAUSE_NETPLAY_CONNECT); + } +#ifdef NP_DEBUG + printf ("CLIENT: Client thread exiting @%ld\n", S9xGetMilliTime () - START); +#endif +} +#endif + +bool8 S9xNPWaitForHeartBeat () +{ + uint8 header [3 + 4 + 4 * 5]; + + while (S9xNPGetData (NetPlay.Socket, header, 3 + 4)) + { + if (header [0] != NP_SERV_MAGIC) + { + S9xNPSetError ("Bad magic value from server while waiting for heart-beat message\n"); + S9xNPDisconnect (); + return (FALSE); + } + if (header [1] != NetPlay.ServerSequenceNum) + { + char buf [200]; + sprintf (buf, "Unexpected message sequence number from server, expected %d, got %d\n", NetPlay.ServerSequenceNum, header [1]); + S9xNPSetWarning (buf); + NetPlay.ServerSequenceNum = header [1] + 1; + } + else + NetPlay.ServerSequenceNum++; + + if ((header [2] & 0x1f) == NP_SERV_JOYPAD) + { + // Top 2 bits + 1 of opcode is joypad data count. + int num = (header [2] >> 6) + 1; + + if (num) + { + if (!S9xNPGetData (NetPlay.Socket, header + 3 + 4, num * 4)) + { + S9xNPSetError ("Error while receiving 'JOYPAD' message."); + S9xNPDisconnect (); + return (FALSE); + } + } + NetPlay.Frame [NetPlay.JoypadWriteInd] = READ_LONG (&header [3]); + + for (int i = 0; i < num; i++) + { + NetPlay.Joypads [NetPlay.JoypadWriteInd][i] = + READ_LONG (&header [3 + 4 + i * sizeof (uint32)]); + } + NetPlay.Paused = (header [2] & 0x20) != 0; + + NetPlay.JoypadWriteInd = (NetPlay.JoypadWriteInd + 1) % NP_JOYPAD_HIST_SIZE; + + if (NetPlay.JoypadWriteInd != (NetPlay.JoypadReadInd + 1) % NP_JOYPAD_HIST_SIZE) + { + //printf ("(%d)", (NetPlay.JoypadWriteInd - NetPlay.JoypadReadInd) % NP_JOYPAD_HIST_SIZE); fflush (stdout); + } +//printf ("CLIENT: HB: @%d\n", S9xGetMilliTime () - START); + return (TRUE); + } + else + { + uint32 len = READ_LONG (&header [3]); + switch (header [2] & 0x1f) + { + case NP_SERV_RESET: +#ifdef NP_DEBUG + printf ("CLIENT: RESET received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDiscardHeartbeats (); + S9xReset (); + NetPlay.FrameCount = READ_LONG (&header [3]); + S9xNPResetJoypadReadPos (); + S9xNPSendReady (); + break; + case NP_SERV_PAUSE: + NetPlay.Paused = (header [2] & 0x20) != 0; + break; + case NP_SERV_LOAD_ROM: +#ifdef NP_DEBUG + printf ("CLIENT: LOAD_ROM received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDiscardHeartbeats (); + if (S9xNPLoadROM (len - 7)) + S9xNPSendReady (NP_CLNT_LOADED_ROM); + break; + case NP_SERV_ROM_IMAGE: +#ifdef NP_DEBUG + printf ("CLIENT: ROM_IMAGE received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDiscardHeartbeats (); + if (S9xNPGetROMImage (len - 7)) + S9xNPSendReady (NP_CLNT_RECEIVED_ROM_IMAGE); + break; + case NP_SERV_SRAM_DATA: +#ifdef NP_DEBUG + printf ("CLIENT: SRAM_DATA received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDiscardHeartbeats (); + S9xNPGetSRAMData (len - 7); + break; + case NP_SERV_FREEZE_FILE: +#ifdef NP_DEBUG + printf ("CLIENT: FREEZE_FILE received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDiscardHeartbeats (); + S9xNPGetFreezeFile (len - 7); + S9xNPResetJoypadReadPos (); + S9xNPSendReady (); + break; + default: +#ifdef NP_DEBUG + printf ("CLIENT: UNKNOWN received @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPDisconnect (); + return (FALSE); + } + } + } + + S9xNPDisconnect (); + return (FALSE); +} + +bool8 S9xNPLoadROMDialog (const char *rom_name) +{ + NetPlay.Answer = FALSE; + +#ifdef __WIN32__ + ResetEvent (NetPlay.ReplyEvent); + +#ifdef NP_DEBUG + printf ("CLIENT: Asking GUI thread to open ROM load dialog...\n"); +#endif + + PostMessage (GUI.hWnd, WM_USER + 3, (uint32) rom_name, (uint32) rom_name); + +#ifdef NP_DEBUG + printf ("CLIENT: Waiting for reply from GUI thread...\n"); +#endif + + WaitForSingleObject (NetPlay.ReplyEvent, INFINITE); + +#ifdef NP_DEBUG + printf ("CLIENT: Got reply from GUI thread (%d)\n", NetPlay.Answer); +#endif +#endif + + return (NetPlay.Answer); +} + +bool8 S9xNPLoadROM (uint32 len) +{ + uint8 *data = new uint8 [len]; + + S9xNPSetAction ("Receiving ROM name..."); + if (!S9xNPGetData (NetPlay.Socket, data, len)) + { + S9xNPSetError ("Error while receiving ROM name."); + delete data; + S9xNPDisconnect (); + return (FALSE); + } + + S9xNPSetAction ("Opening LoadROM dialog..."); + if (!S9xNPLoadROMDialog ((char *) data)) + { + S9xNPSetError ("Disconnected from NetPlay server because you are playing a different game!"); + delete data; + S9xNPDisconnect (); + return (FALSE); + } + delete data; + return (TRUE); +} + +bool8 S9xNPGetROMImage (uint32 len) +{ + uint8 rom_info [5]; + + S9xNPSetAction ("Receiving ROM information..."); + if (!S9xNPGetData (NetPlay.Socket, rom_info, 5)) + { + S9xNPSetError ("Error while receiving ROM information."); + S9xNPDisconnect (); + return (FALSE); + } + uint32 CalculatedSize = READ_LONG (&rom_info [1]); +#ifdef NP_DEBUG + printf ("CLIENT: Hi-ROM: %s, Size: %04x\n", rom_info [0] ? "Y" : "N", CalculatedSize); +#endif + if (CalculatedSize + 5 >= len || + CalculatedSize >= CMemory_MAX_ROM_SIZE) + { + S9xNPSetError ("Size error in ROM image data received from server."); + S9xNPDisconnect (); + return (FALSE); + } + + Memory.HiROM = rom_info [0]; + Memory.LoROM = !Memory.HiROM; + Memory.HeaderCount = 0; + Memory.CalculatedSize = CalculatedSize; + + // Load up ROM image +#ifdef NP_DEBUG + printf ("CLIENT: Receiving ROM image @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Receiving ROM image..."); + if (!S9xNPGetData (NetPlay.Socket, Memory.ROM, Memory.CalculatedSize)) + { + S9xNPSetError ("Error while receiving ROM image from server."); + Settings.StopEmulation = TRUE; + S9xNPDisconnect (); + return (FALSE); + } +#ifdef NP_DEBUG + printf ("CLIENT: Receiving ROM filename @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Receiving ROM filename..."); + uint32 filename_len = len - Memory.CalculatedSize - 5; + if (filename_len > _MAX_PATH || + !S9xNPGetData (NetPlay.Socket, (uint8 *) Memory.ROMFilename, filename_len)) + { + S9xNPSetError ("Error while receiving ROM filename from server."); + S9xNPDisconnect (); + Settings.StopEmulation = TRUE; + return (FALSE); + } + Memory.InitROM (FALSE); + S9xReset (); + S9xNPResetJoypadReadPos (); + Settings.StopEmulation = FALSE; + +#ifdef __WIN32__ + PostMessage (GUI.hWnd, WM_NULL, 0, 0); +#endif + + return (TRUE); +} + +void S9xNPGetSRAMData (uint32 len) +{ + if (len > 0x10000) + { + S9xNPSetError ("Length error in S-RAM data received from server."); + S9xNPDisconnect (); + return; + } + S9xNPSetAction ("Receiving S-RAM data..."); + if (len > 0 && !S9xNPGetData (NetPlay.Socket, CMemory_SRAM, len)) + { + S9xNPSetError ("Error while receiving S-RAM data from server."); + S9xNPDisconnect (); + } +} + +void S9xNPGetFreezeFile (uint32 len) +{ + uint8 frame_count [4]; + +#ifdef NP_DEBUG + printf ("CLIENT: Receiving freeze file information @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Receiving freeze file information..."); + if (!S9xNPGetData (NetPlay.Socket, frame_count, 4)) + { + S9xNPSetError ("Error while receiving freeze file information from server."); + S9xNPDisconnect (); + return; + } + NetPlay.FrameCount = READ_LONG (frame_count); + +#ifdef NP_DEBUG + printf ("CLIENT: Receiving freeze file @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Receiving freeze file..."); + uint8 *data = new uint8 [len]; + if (!S9xNPGetData (NetPlay.Socket, data, len - 4)) + { + S9xNPSetError ("Error while receiving freeze file from server."); + S9xNPDisconnect (); + delete data; + return; + } + + //FIXME: Setting umask here wouldn't hurt. + FILE *file; +#ifdef HAVE_MKSTEMP + int fd; + char fname[] = "/tmp/snes9x_fztmpXXXXXX"; + if ((fd = mkstemp(fname)) < 0) + { + if ((file = fdopen (fd, "wb"))) +#else + char fname [L_tmpnam]; + if (tmpnam (fname)) + { + if ((file = fopen (fname, "wb"))) +#endif + { + if (fwrite (data, 1, len, file) == len) + { + fclose(file); + if (!S9xUnfreezeGame (fname)) + S9xNPSetError ("Unable to load freeze file just received."); + } else { + S9xNPSetError ("Failed to write to temporary freeze file."); + fclose (file); + } + } else + S9xNPSetError ("Failed to create temporary freeze file."); + remove (fname); + } else + S9xNPSetError ("Unable to get name for temporary freeze file."); + delete data; +} + +uint32 S9xNPGetJoypad (int which1) +{ + if (Settings.NetPlay && which1 < 5) + return (NetPlay.Joypads [NetPlay.JoypadReadInd][which1]); + + return (0); +} + +void S9xNPStepJoypadHistory () +{ + if ((NetPlay.JoypadReadInd + 1) % NP_JOYPAD_HIST_SIZE != NetPlay.JoypadWriteInd) + { + NetPlay.JoypadReadInd = (NetPlay.JoypadReadInd + 1) % NP_JOYPAD_HIST_SIZE; + if (NetPlay.FrameCount != NetPlay.Frame [NetPlay.JoypadReadInd]) + { + S9xNPSetWarning ("This Snes9X session may be out of sync with the server."); +#ifdef NP_DEBUG + printf ("*** CLIENT: client out of sync with server (%d, %d) @%ld\n", NetPlay.FrameCount, NetPlay.Frame [NetPlay.JoypadReadInd], S9xGetMilliTime () - START); +#endif + } + } + else + { +#ifdef NP_DEBUG + printf ("*** CLIENT: S9xNPStepJoypadHistory NOT OK@%ld\n", S9xGetMilliTime () - START); +#endif + } +} + + +void S9xNPResetJoypadReadPos () +{ +#ifdef NP_DEBUG + printf ("CLIENT: ResetJoyReadPos @%ld\n", S9xGetMilliTime () - START); fflush (stdout); +#endif + NetPlay.JoypadWriteInd = 0; + NetPlay.JoypadReadInd = NP_JOYPAD_HIST_SIZE - 1; + for (int h = 0; h < NP_JOYPAD_HIST_SIZE; h++) + memset ((void *) &NetPlay.Joypads [h], 0, sizeof (NetPlay.Joypads [0])); +} + +bool8 S9xNPSendJoypadUpdate (uint32 joypad) +{ + uint8 data [7]; + uint8 *ptr = data; + + *ptr++ = NP_CLNT_MAGIC; + *ptr++ = NetPlay.MySequenceNum++; + *ptr++ = NP_CLNT_JOYPAD; + + joypad |= 0x80000000; + + WRITE_LONG (ptr, joypad); + if (!S9xNPSendData (NetPlay.Socket, data, 7)) + { + S9xNPSetError ("Error while sending joypad data server."); + S9xNPDisconnect (); + return (FALSE); + } + return (TRUE); +} + +void S9xNPDisconnect () +{ + close (NetPlay.Socket); + NetPlay.Socket = -1; + NetPlay.Connected = FALSE; + Settings.NetPlay = FALSE; +} + +bool8 S9xNPSendData (int socket, const uint8 *data, int length) +{ + int len = length; + const uint8 *ptr = data; + + NetPlay.PercentageComplete = 0; + + do + { + if (NetPlay.Abort) + return (FALSE); + + int num_bytes = len; + + // Write the data in small chunks, allowing this thread to spot an + // abort request from another thread. + if (num_bytes > 512) + num_bytes = 512; + + int sent = write (socket, (char *) ptr, num_bytes); + if (sent < 0) + { + if (errno == EINTR +#ifdef EAGAIN + || errno == EAGAIN +#endif +#ifdef EWOULDBLOCK + || errno == EWOULDBLOCK +#endif + ) + { +#ifdef NP_DEBUG + printf ("CLIENT: EINTR, EAGAIN or EWOULDBLOCK while sending data @%ld\n", S9xGetMilliTime () - START); +#endif + continue; + } + return (FALSE); + } + else + if (sent == 0) + return (FALSE); + len -= sent; + ptr += sent; + + NetPlay.PercentageComplete = (uint8) (((length - len) * 100) / length); + } while (len > 0); + + return (TRUE); +} + +bool8 S9xNPGetData (int socket, uint8 *data, int length) +{ + int len = length; + uint8 *ptr = data; + int chunk = length / 50; + + if (chunk < 1024) + chunk = 1024; + + NetPlay.PercentageComplete = 0; + do + { + if (NetPlay.Abort) + return (FALSE); + + int num_bytes = len; + + // Read the data in small chunks, allowing this thread to spot an + // abort request from another thread. + if (num_bytes > chunk) + num_bytes = chunk; + + int got = read (socket, (char *) ptr, num_bytes); + if (got < 0) + { + if (errno == EINTR +#ifdef EAGAIN + || errno == EAGAIN +#endif +#ifdef EWOULDBLOCK + || errno == EWOULDBLOCK +#endif +#ifdef WSAEWOULDBLOCK + || errno == WSAEWOULDBLOCK +#endif + ) + { +#ifdef NP_DEBUG + printf ("CLIENT: EINTR, EAGAIN or EWOULDBLOCK while receiving data @%ld\n", S9xGetMilliTime () - START); +#endif + continue; + } +#ifdef WSAEMSGSIZE + if (errno != WSAEMSGSIZE) + return (FALSE); + else + { + got = num_bytes; +#ifdef NP_DEBUG + printf ("CLIENT: WSAEMSGSIZE, actual bytes %d while receiving data @%ld\n", got, S9xGetMilliTime () - START); +#endif + } +#else + return (FALSE); +#endif + } + else + if (got == 0) + return (FALSE); + + len -= got; + ptr += got; + + if (!Settings.NetPlayServer && length > 1024) + { + NetPlay.PercentageComplete = (uint8) (((length - len) * 100) / length); +#ifdef __WIN32__ + PostMessage (GUI.hWnd, WM_USER, NetPlay.PercentageComplete, + NetPlay.PercentageComplete); + Sleep (0); +#endif + } + + } while (len > 0); + + return (TRUE); +} + +bool8 S9xNPInitialise () +{ +#ifdef __WIN32__ + static bool8 initialised = FALSE; + + if (!initialised) + { + initialised = TRUE; + WSADATA data; + +#ifdef NP_DEBUG + START = S9xGetMilliTime (); + + printf ("CLIENT/SERVER: Initialising WinSock @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Initialising Windows sockets interface..."); + if (WSAStartup (MAKEWORD (1, 0), &data) != 0) + { + S9xNPSetError ("Call to init Windows sockets failed. Do you have WinSock2 installed?"); + return (FALSE); + } + } +#endif + return (TRUE); +} + +void S9xNPDiscardHeartbeats () +{ + // Discard any pending heartbeats and wait for any frame that is currently + // being emulated to complete. +#ifdef NP_DEBUG + printf ("CLIENT: DiscardHeartbeats @%ld, finished @", S9xGetMilliTime () - START); + fflush (stdout); +#endif + +#ifdef __WIN32__ + while (WaitForSingleObject (GUI.ClientSemaphore, 200) == WAIT_OBJECT_0) + ; +#endif + +#ifdef NP_DEBUG + printf ("%ld\n", S9xGetMilliTime () - START); +#endif + NetPlay.Waiting4EmulationThread = FALSE; +} + +void S9xNPSetAction (const char *action, bool8 force) +{ + if (force || !Settings.NetPlayServer) + { + strncpy (NetPlay.ActionMsg, action, NP_MAX_ACTION_LEN - 1); + NetPlay.ActionMsg [NP_MAX_ACTION_LEN - 1] = 0; +#ifdef __WIN32__ + PostMessage (GUI.hWnd, WM_USER, 0, 0); + Sleep (0); +#endif + } +} + +void S9xNPSetError (const char *error) +{ + strncpy (NetPlay.ErrorMsg, error, NP_MAX_ACTION_LEN - 1); + NetPlay.ErrorMsg [NP_MAX_ACTION_LEN - 1] = 0; +#ifdef __WIN32 + PostMessage (GUI.hWnd, WM_USER + 1, 0, 0); + Sleep (0); +#endif +} + +void S9xNPSetWarning (const char *warning) +{ + strncpy (NetPlay.WarningMsg, warning, NP_MAX_ACTION_LEN - 1); + NetPlay.WarningMsg [NP_MAX_ACTION_LEN - 1] = 0; +#ifdef __WIN32__ + PostMessage (GUI.hWnd, WM_USER + 2, 0, 0); + Sleep (0); +#endif +} +#endif + + diff --git a/src/obc1.cpp b/src/obc1.cpp new file mode 100644 index 0000000..b820784 --- /dev/null +++ b/src/obc1.cpp @@ -0,0 +1,204 @@ +/**************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include "memmap.h" +#include "obc1.h" + +static uint8 *OBC1_RAM = NULL; + +int OBC1_Address; +int OBC1_BasePtr; +int OBC1_Shift; + +extern "C" +{ +uint8 GetOBC1 (uint16 Address) +{ + switch(Address) { + case 0x7ff0: + return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2)]; + + case 0x7ff1: + return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 1]; + + case 0x7ff2: + return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 2]; + + case 0x7ff3: + return OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 3]; + + case 0x7ff4: + return OBC1_RAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200]; + } + + return OBC1_RAM[Address & 0x1fff]; +} + +void SetOBC1 (uint8 Byte, uint16 Address) +{ + switch(Address) { + case 0x7ff0: + { + OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2)] = Byte; + break; + } + + case 0x7ff1: + { + OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 1] = Byte; + break; + } + + case 0x7ff2: + { + OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 2] = Byte; + break; + } + + case 0x7ff3: + { + OBC1_RAM[OBC1_BasePtr + (OBC1_Address << 2) + 3] = Byte; + break; + } + + case 0x7ff4: + { + unsigned char Temp; + + Temp = OBC1_RAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200]; + Temp = (Temp & ~(3 << OBC1_Shift)) | ((Byte & 3) << OBC1_Shift); + OBC1_RAM[OBC1_BasePtr + (OBC1_Address >> 2) + 0x200] = Temp; + break; + } + + case 0x7ff5: + { + if (Byte & 1) + OBC1_BasePtr = 0x1800; + else + OBC1_BasePtr = 0x1c00; + + break; + } + + case 0x7ff6: + { + OBC1_Address = Byte & 0x7f; + OBC1_Shift = (Byte & 3) << 1; + break; + } + } + + OBC1_RAM[Address & 0x1fff] = Byte; +} + +uint8 *GetBasePointerOBC1(uint32 Address) +{ + return CMemory_FillRAM; +} + +uint8 *GetMemPointerOBC1(uint32 Address) +{ + return (CMemory_FillRAM + (Address & 0xffff)); +} + +void ResetOBC1() +{ + OBC1_RAM = &CMemory_FillRAM[0x6000]; + + if (OBC1_RAM[0x1ff5] & 1) + OBC1_BasePtr = 0x1800; + else + OBC1_BasePtr = 0x1c00; + + OBC1_Address = OBC1_RAM[0x1ff6] & 0x7f; + OBC1_Shift = (OBC1_RAM[0x1ff6] & 3) << 1; +} + +} diff --git a/src/offsets.cpp b/src/offsets.cpp new file mode 100644 index 0000000..6839f6a --- /dev/null +++ b/src/offsets.cpp @@ -0,0 +1,557 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +// #define DREAMCAST + +#include "snes9x.h" +#include "65c816.h" +#include "memmap.h" +#include "ppu.h" +#include "apu.h" +#include "cpuexec.h" +#include "sa1.h" + +#ifndef S9xSTREAM +#define S9xSTREAM stdout +#endif + +#ifndef DREAMCAST +#define OFFSET(N,F) \ +fprintf (S9xSTREAM, "#define " #N " CPU + %d\n", (int) &((struct SCPUState *) 0)->F); +#define OFFSET2(N,F) \ +fprintf (S9xSTREAM, "#define " #N " Registers + %d\n", (int) &((struct SRegisters *) 0)->F); +#define OFFSET3(F) \ +fprintf (S9xSTREAM, "#define " #F " Memory + %d\n", (int) &((class CMemory *) 0)->F); +#define OFFSET4(N,F) \ +fprintf (S9xSTREAM, "#define " #N " APU + %d\n", (int) &((struct SAPU *) 0)->F); +#define OFFSET5(N,F) \ +fprintf (S9xSTREAM, "#define " #N " IAPU + %d\n", (int) &((struct SIAPU *) 0)->F); +#define OFFSET6(N,F) \ +fprintf (S9xSTREAM, "#define " #N " ICPU + %d\n", (int) &((struct SICPU *) 0)->F); +#define OFFSET7(N,F) \ +fprintf (S9xSTREAM, "#define " #N " Settings + %d\n", (int) &((struct SSettings *) 0)->F); +#define OFFSET8(N, F) \ +fprintf (S9xSTREAM, "#define " #N " APURegisters + %d\n", (int) &((struct SAPURegisters *) 0)->F); + +#define OFFSET9(N, F) \ +fprintf (S9xSTREAM, "#define " #N " PPU + %d\n", (int) &((struct SPPU *) 0)->F); +#define OFFSET10(N, F) \ +fprintf (S9xSTREAM, "#define " #N " IPPU + %d\n", (int) &((struct InternalPPU *) 0)->F); +#define OFFSET11(N, F) \ +fprintf (S9xSTREAM, "#define " #N " SA1 + %d\n", (int) &((struct SSA1 *) 0)->F); +#define OFFSET12(N, F) \ +fprintf (S9xSTREAM, "#define " #N " SA1Registers + %d\n", (int) &((struct SSA1Registers *) 0)->F); + +#else + +#ifdef USE_OFFSET_R12 +#define OFFSET(N,F) \ +if (((int) &((struct SCPUState *) 0)->F)) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r12)\n", (int) &((struct SCPUState *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r12\n"); +#else +#define OFFSET(N,F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r11)\n", 16+((int) &((struct SCPUState *) 0)->F)); +#endif + +#define OFFSET2(N,F) \ +if ((int) &((struct SRegisters *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r11)\n", (int) &((struct SRegisters *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r11\n"); + +#define OFFSET3(F) \ +fprintf (S9xSTREAM, "#define " #F " _Memory + %d\n", (int) &((class CMemory *) 0)->F); + +#define OFFSET4(N,F) \ +if ((int) &((struct SAPU *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SAPU *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET5(N,F) \ +if ((int) &((struct SIAPU *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SIAPU *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET6(N,F) \ +if ((int) &((struct SICPU *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SICPU *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET7(N,F) \ +if ((int) &((struct SSettings *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SSettings *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET8(N, F) \ +if ((int) &((struct SAPURegisters *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SAPURegisters *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET9(N, F) \ +if ((int) &((struct SPPU *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct SPPU *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET10(N, F) \ +if ((int) &((struct InternalPPU *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r1)\n", (int) &((struct InternalPPU *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r1\n"); + +#define OFFSET11(N, F) \ +if ((int) &((struct SSA1 *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, SA1REG)\n", (int) &((struct SSA1 *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @SA1REG\n"); + +#define OFFSET12(N, F) \ +if ((int) &((struct SSA1Registers *) 0)->F) \ +fprintf (S9xSTREAM, "#define " #N " @(%d, r11)\n", (int) &((struct SSA1Registers *) 0)->F); \ +else \ +fprintf (S9xSTREAM, "#define " #N " @r11\n"); + +#endif + +int main (int /*argc*/, char ** /*argv*/) +{ + OFFSET(Flags,Flags) + OFFSET(BranchSkip,BranchSkip) + OFFSET(NMIActive,NMIActive) + OFFSET(IRQActive,IRQActive) + OFFSET(WaitingForInterrupt,WaitingForInterrupt) + OFFSET(InDMA,InDMA) + OFFSET(WhichEvent,WhichEvent) + OFFSET(PCS,PC) + OFFSET(PCBase,PCBase) + OFFSET(PCAtOpcodeStart,PCAtOpcodeStart) + OFFSET(WaitAddress,WaitAddress) + OFFSET(WaitCounter,WaitCounter) + OFFSET(Cycles,Cycles) + OFFSET(NextEvent,NextEvent) + OFFSET(V_Counter,V_Counter) + OFFSET(MemSpeed,MemSpeed) + OFFSET(MemSpeedx2,MemSpeedx2) + OFFSET(FastROMSpeed,FastROMSpeed) + OFFSET(AutoSaveTimer,AutoSaveTimer) + OFFSET(SRAMModified,SRAMModified) + OFFSET(NMITriggerPoint,NMITriggerPoint) + OFFSET(TriedInterleavedMode2,TriedInterleavedMode2) + OFFSET(BRKTriggered,BRKTriggered) + OFFSET(NMICycleCount,NMICycleCount) + OFFSET(IRQCycleCount,IRQCycleCount) + + OFFSET2(PB,PB) + OFFSET2(DB,DB) + OFFSET2(PP,P.W) + OFFSET2(PL,P.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define PH PL + 1\n"); +#else + fprintf (S9xSTREAM, "#define PH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->P.W)+1); +#endif + OFFSET2(AA,A.W) + OFFSET2(AL,A.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define AH AL + 1\n"); +#else + fprintf (S9xSTREAM, "#define AH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->A.W)+1); +#endif + OFFSET2(DD,D.W) + OFFSET2(DL,D.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define DH DL + 1\n"); +#else + fprintf (S9xSTREAM, "#define DH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->D.W)+1); +#endif + OFFSET2(SS,S.W) + OFFSET2(SL,S.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define SH SL + 1\n"); +#else + fprintf (S9xSTREAM, "#define SH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->S.W)+1); +#endif + OFFSET2(XX,X.W) + OFFSET2(XL,X.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define XH XL + 1\n"); +#else + fprintf (S9xSTREAM, "#define XH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->X.W)+1); +#endif + OFFSET2(YY,Y.W) + OFFSET2(YL,Y.W) +#ifndef DREAMCAST + fprintf (S9xSTREAM, "#define YH YL + 1\n"); +#else + fprintf (S9xSTREAM, "#define YH @(%d, r11)\n", ((int) &((struct SRegisters *) 0)->Y.W)+1); +#endif + OFFSET2(PCR, PC) + + OFFSET3(RAM) + OFFSET3(ROM) + OFFSET3(VRAM) + OFFSET3(SRAM) + OFFSET3(BWRAM) + OFFSET3(FillRAM) + OFFSET3(C4RAM) + OFFSET3(HiROM) + OFFSET3(LoROM) + OFFSET3(SRAMMask) + OFFSET3(SRAMSize) + OFFSET3(Map) + OFFSET3(WriteMap) + OFFSET3(MemorySpeed) + OFFSET3(BlockIsRAM) + OFFSET3(BlockIsROM) + OFFSET3(ROMFilename) + + OFFSET5(APUPCS,PC) + OFFSET5(APURAM,RAM) + OFFSET5(APUExecuting,APUExecuting) + OFFSET5(APUDirectPage,DirectPage) + OFFSET5(APUBit,Bit) + OFFSET5(APUAddress,Address) + OFFSET5(APUWaitAddress1,WaitAddress1) + OFFSET5(APUWaitAddress2,WaitAddress2) + OFFSET5(APUWaitCounter,WaitCounter) + OFFSET5(APUShadowRAM,ShadowRAM) + OFFSET5(APUCachedSamples,CachedSamples) + OFFSET5(APU_Carry,_Carry) + OFFSET5(APU_Zero,_Zero) + OFFSET5(APU_Overflow,_Overflow) + OFFSET5(APUTimerErrorCounter,TimerErrorCounter) + OFFSET5(NextAPUTimerPos,NextAPUTimerPos) + OFFSET5(APUTimerCounter,APUTimerCounter) + + OFFSET4(APUCycles,Cycles) + OFFSET4(APUShowROM,ShowROM) + OFFSET4(APUFlags,Flags) + OFFSET4(APUKeyedChannels,KeyedChannels) + OFFSET4(APUOutPorts,OutPorts) + OFFSET4(APUDSP,DSP) +#ifndef DREAMCAST + OFFSET4(APUExtraRAM,ExtraRAM) + OFFSET4(APUTimer,Timer) + OFFSET4(APUTimerTarget,TimerTarget) + OFFSET4(APUTimerEnabled,TimerEnabled) + OFFSET4(TimerValueWritten,TimerValueWritten) +#else + fprintf (S9xSTREAM, "#define APUExtraRAM %d\n", (int) &((struct SAPU *) 0)->ExtraRAM); + fprintf (S9xSTREAM, "#define APUTimer %d\n", (int) &((struct SAPU *) 0)->Timer); + fprintf (S9xSTREAM, "#define APUTimerTarget %d\n", (int) &((struct SAPU *) 0)->TimerTarget); + fprintf (S9xSTREAM, "#define APUTimerEnabled %d\n", (int) &((struct SAPU *) 0)->TimerEnabled); + fprintf (S9xSTREAM, "#define TimerValueWritten %d\n", (int) &((struct SAPU *) 0)->TimerValueWritten); +#endif + + OFFSET6(CPUSpeed,Speed) + OFFSET6(CPUOpcodes,S9xOpcodes) + OFFSET6(_Carry,_Carry) + OFFSET6(_Zero,_Zero) + OFFSET6(_Negative,_Negative) + OFFSET6(_Overflow,_Overflow) + OFFSET6(ShiftedDB,ShiftedDB) + OFFSET6(ShiftedPB,ShiftedPB) + OFFSET6(CPUExecuting,CPUExecuting) + OFFSET6(Scanline,Scanline) + OFFSET6(Frame,Frame) + + OFFSET7(APUEnabled,APUEnabled) + OFFSET7(Shutdown,Shutdown) + OFFSET7(H_Max,H_Max) + OFFSET7(HBlankStart,HBlankStart) + OFFSET7(CyclesPercentage,CyclesPercentage) + OFFSET7(DisableIRQ,DisableIRQ) + OFFSET7(Paused,Paused) + OFFSET7(PAL,PAL) + OFFSET7(SA1Enabled,SA1) + OFFSET7(SuperFXEnabled,SuperFX) + + OFFSET8(ApuP,P) + OFFSET8(ApuYA,YA.W) + OFFSET8(ApuA,YA.B.A) + OFFSET8(ApuY,YA.B.Y) + OFFSET8(ApuX,X) + OFFSET8(ApuS,S) + OFFSET8(ApuPC,PC) + OFFSET8(APUPCR,PC) + + OFFSET9(BGMode,BGMode) + OFFSET9(BG3Priority,BG3Priority) + OFFSET9(Brightness,Brightness) + OFFSET9(GHight,VMA.High) + OFFSET9(GInc,VMA.Increment) + OFFSET9(GAddress,VMA.Address) + OFFSET9(GMask1,VMA.Mask1) + OFFSET9(GFullGraphicCount,VMA.FullGraphicCount) + OFFSET9(GShift,VMA.Shift) + OFFSET9(CGFLIP,CGFLIP) + OFFSET9(CGDATA,CGDATA) + OFFSET9(FirstSprite,FirstSprite) + OFFSET9(LastSprite,LastSprite) + OFFSET9(OBJ,OBJ) + OFFSET9(OAMPriorityRotation,OAMPriorityRotation) + OFFSET9(OAMAddr,OAMAddr) + OFFSET9(OAMFlip,OAMFlip) + OFFSET9(OAMTileAddress,OAMTileAddress) + OFFSET9(IRQVBeamPos,IRQVBeamPos) + OFFSET9(IRQHBeamPos,IRQHBeamPos) + OFFSET9(VBeamPosLatched,VBeamPosLatched) + OFFSET9(HBeamPosLatched,HBeamPosLatched) + OFFSET9(HBeamFlip,HBeamFlip) + OFFSET9(VBeamFlip,VBeamFlip) + OFFSET9(HVBeamCounterLatched,HVBeamCounterLatched) + OFFSET9(MatrixA,MatrixA) + OFFSET9(MatrixB,MatrixB) + OFFSET9(MatrixC,MatrixC) + OFFSET9(MatrixD,MatrixD) + OFFSET9(CentreX,CentreX) + OFFSET9(CentreY,CentreY) + OFFSET9(Joypad1ButtonReadPos,Joypad1ButtonReadPos) + OFFSET9(Joypad2ButtonReadPos,Joypad2ButtonReadPos) + OFFSET9(CGADD,CGADD) + OFFSET9(FixedColourGreen,FixedColourGreen) + OFFSET9(FixedColourRed,FixedColourRed) + OFFSET9(FixedColourBlue,FixedColourBlue) + OFFSET9(SavedOAMAddr,SavedOAMAddr) + OFFSET9(ScreenHeight,ScreenHeight) + OFFSET9(WRAM,WRAM) + OFFSET9(BG_Forced,BG_Forced) + OFFSET9(ForcedBlanking,ForcedBlanking) + OFFSET9(OBJThroughMain,OBJThroughMain) + OFFSET9(OBJThroughSub,OBJThroughSub) + OFFSET9(OBJSizeSelect,OBJSizeSelect) + OFFSET9(OBJNameBase,OBJNameBase) + OFFSET9(OAMReadFlip,OAMReadFlip) + OFFSET9(OAMData,OAMData) + OFFSET9(VTimerEnabled,VTimerEnabled) + OFFSET9(HTimerEnabled,HTimerEnabled) + OFFSET9(HTimerPosition,HTimerPosition) + OFFSET9(Mosaic,Mosaic) + OFFSET9(BGMosaic,BGMosaic) + OFFSET9(Mode7HFlip,Mode7HFlip) + OFFSET9(Mode7VFlip,Mode7VFlip) + OFFSET9(Mode7Repeat,Mode7Repeat) + OFFSET9(Window1Left,Window1Left) + OFFSET9(Window1Right,Window1Right) + OFFSET9(Window2Left,Window2Left) + OFFSET9(Window2Right,Window2Right) + OFFSET9(ClipWindowOverlapLogic,ClipWindowOverlapLogic) + OFFSET9(ClipWindow1Enable,ClipWindow1Enable) + OFFSET9(ClipWindow2Enable,ClipWindow2Enable) + OFFSET9(ClipWindow1Inside,ClipWindow1Inside) + OFFSET9(ClipWindow2Inside,ClipWindow2Inside) + OFFSET9(RecomputeClipWindows,RecomputeClipWindows) + OFFSET9(CGFLIPRead,CGFLIPRead) + OFFSET9(OBJNameSelect,OBJNameSelect) + OFFSET9(Need16x8Mulitply,Need16x8Mulitply) + OFFSET9(Joypad3ButtonReadPos,Joypad3ButtonReadPos) + OFFSET9(MouseSpeed,MouseSpeed) + OFFSET9(RangeTimeOver,RangeTimeOver) + + OFFSET10(ColorsChanged,ColorsChanged) + OFFSET10(HDMA,HDMA) + OFFSET10(HDMAStarted,HDMAStarted) + OFFSET10(MaxBrightness,MaxBrightness) + OFFSET10(LatchedBlanking,LatchedBlanking) + OFFSET10(OBJChanged,OBJChanged) + OFFSET10(RenderThisFrame,RenderThisFrame) + OFFSET10(SkippedFrames,SkippedFrames) + OFFSET10(FrameSkip,FrameSkip) + OFFSET10(TileCache,TileCache) + OFFSET10(TileCached,TileCached) +#ifdef CORRECT_VRAM_READS + OFFSET10(VRAMReadBuffer,VRAMReadBuffer) +#else + OFFSET10(FirstVRAMRead,FirstVRAMRead) +#endif + OFFSET10(Interlace,Interlace) + OFFSET10(DoubleWidthPixels,DoubleWidthPixels) + OFFSET10(RenderedScreenHeight,RenderedScreenHeight) + OFFSET10(RenderedScreenWidth,RenderedScreenWidth) + OFFSET10(Red,Red) + OFFSET10(Green,Green) + OFFSET10(Blue,Blue) + OFFSET10(XB,XB) + OFFSET10(ScreenColors,ScreenColors) + OFFSET10(PreviousLine,PreviousLine) + OFFSET10(CurrentLine,CurrentLine) + OFFSET10(Joypads,Joypads) + OFFSET10(SuperScope,SuperScope) + OFFSET10(Mouse,Mouse) + OFFSET10(PrevMouseX,PrevMouseX) + OFFSET10(PrevMouseY,PrevMouseY) + OFFSET10(Clip,Clip) + + OFFSET11(SA1Opcodes,S9xOpcodes) + OFFSET11(SA1_Carry,_Carry) + OFFSET11(SA1_Zero,_Zero) + OFFSET11(SA1_Negative,_Negative) + OFFSET11(SA1_Overflow,_Overflow) + OFFSET11(SA1CPUExecuting,CPUExecuting) + OFFSET11(SA1ShiftedPB,ShiftedPB) + OFFSET11(SA1ShiftedDB,ShiftedDB) + OFFSET11(SA1Flags,Flags) + OFFSET11(SA1Executing,Executing) + OFFSET11(SA1NMIActive,NMIActive) + OFFSET11(SA1IRQActive,IRQActive) + OFFSET11(SA1WaitingForInterrupt,WaitingForInterrupt) + OFFSET11(SA1PCS,PC) + OFFSET11(SA1PCBase,PCBase) + OFFSET11(SA1PCAtOpcodeStart,PCAtOpcodeStart) + OFFSET11(SA1WaitAddress,WaitAddress) + OFFSET11(SA1WaitCounter,WaitCounter) + OFFSET11(SA1WaitByteAddress1,WaitByteAddress1) + OFFSET11(SA1WaitByteAddress2,WaitByteAddress2) + OFFSET11(SA1BWRAM,BWRAM) + OFFSET11(SA1Map,Map) + OFFSET11(SA1WriteMap,WriteMap) + OFFSET11(SA1op1,op1) + OFFSET11(SA1op2,op2) + OFFSET11(SA1arithmetic_op,arithmetic_op) + OFFSET11(SA1sum,sum) + OFFSET11(SA1overflow,overflow) + OFFSET11(VirtualBitmapFormat,VirtualBitmapFormat) + OFFSET11(SA1_in_char_dma,in_char_dma) + OFFSET11(SA1variable_bit_pos,variable_bit_pos) + + OFFSET12(SA1PB,PB) + OFFSET12(SA1DB,DB) + OFFSET12(SA1PP,P.W) + OFFSET12(SA1PL,P.W) + fprintf (S9xSTREAM, "#define SA1PH SA1PL + 1\n"); + OFFSET12(SA1AA,A.W) + OFFSET12(SA1AL,A.W) + fprintf (S9xSTREAM, "#define SA1AH SA1AL + 1\n"); + OFFSET12(SA1DD,D.W) + OFFSET12(SA1DL,D.W) + fprintf (S9xSTREAM, "#define SA1DH SA1DL + 1\n"); + OFFSET12(SA1SS,S.W) + OFFSET12(SA1SL,S.W) + fprintf (S9xSTREAM, "#define SA1SH SA1SL + 1\n"); + OFFSET12(SA1XX,X.W) + OFFSET12(SA1XL,X.W) + fprintf (S9xSTREAM, "#define SA1XH SA1XL + 1\n"); + OFFSET12(SA1YY,Y.W) + OFFSET12(SA1YL,Y.W) + fprintf (S9xSTREAM, "#define SA1YH SA1YL + 1\n"); + OFFSET12(SA1PCR, PC) + +#ifdef DREAMCAST + + fputs("#define S9xGetByte @(4, r14)\n",S9xSTREAM); + fputs("#define S9xSetByte @(8, r14)\n",S9xSTREAM); + fputs("#define S9xGetWord @(12, r14)\n",S9xSTREAM); + fputs("#define S9xSetWord @(16, r14)\n",S9xSTREAM); + fputs("#define S9xOpcode_IRQ @(20, r14)\n",S9xSTREAM); + fputs("#define S9xOpcode_NMI @(24, r14)\n",S9xSTREAM); + fputs("#define S9xSetPCBase @(28, r14)\n",S9xSTREAM); + fputs("#define ICPU @(32, r14)\n",S9xSTREAM); + fputs("#define IAPU @(36, r14)\n",S9xSTREAM); + fputs("#define APU @(40, r14)\n",S9xSTREAM); + fputs("#define SA1 @(44, r14)\n",S9xSTREAM); + fputs("#define APURegisters @(48, r14)\n",S9xSTREAM); + fputs("#define Settings @(52, r14)\n",S9xSTREAM); + fputs("#define IPPU @(56, r14)\n",S9xSTREAM); + fputs("#define PPU @(60, r14)\n",S9xSTREAM); + + fprintf (S9xSTREAM, "#define SA1Map_offs %d\n", (int) &((struct SSA1 *) 0)->Map); + fprintf (S9xSTREAM, "#define SA1WriteMap_offs %d\n", (int) &((struct SSA1 *) 0)->WriteMap); + fprintf (S9xSTREAM, "#define NMITriggerPoint_offs %d\n", (int) &((struct SCPUState *) 0)->NMITriggerPoint); +#endif + + return (0); +} + diff --git a/src/ppu.cpp b/src/ppu.cpp new file mode 100644 index 0000000..8d98cfd --- /dev/null +++ b/src/ppu.cpp @@ -0,0 +1,3282 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "ppu.h" +#include "cpuexec.h" +#include "missing.h" +#include "apu.h" +#include "dma.h" +#include "gfx.h" +#include "display.h" +#include "sa1.h" +#include "netplay.h" +#include "sdd1.h" +#include "srtc.h" +#include "spc7110.h" +#include "movie.h" + +#ifndef ZSNES_FX +#include "fxemu.h" +#include "fxinst.h" +extern struct FxInit_s SuperFX; +#else +EXTERN_C void S9xSuperFXWriteReg (uint8, uint32); +EXTERN_C uint8 S9xSuperFXReadReg (uint32); +#endif + +uint32 justifiers=0xFFFF00AA; +uint8 in_bit=0; + +extern uint8 *HDMAMemPointers [8]; + +static __inline__ void S9xLatchCounters (bool force) +{ + if(!force && !(CMemory_FillRAM[0x4213] & 0x80)) return; + + // Latch h and v counters, like the gun +#if 0 +# ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PCAtOpcodeStart; +# endif +#endif + PPU.HVBeamCounterLatched = 1; + PPU.VBeamPosLatched = (uint16) CPU.V_Counter; + PPU.HBeamPosLatched = (uint16) ((CPU.Cycles * SNES_HCOUNTER_MAX) / Settings.H_Max); + + // Causes screen flicker for Yoshi's Island if uncommented + //CLEAR_IRQ_SOURCE (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); + + CMemory_FillRAM [0x213F] |= 0x40; +} + +void S9xUpdateJustifiers(); + +void S9xUpdateHTimer () +{ + if (PPU.HTimerEnabled) + { + PPU.HTimerPosition = PPU.IRQHBeamPos * Settings.H_Max / SNES_HCOUNTER_MAX; + if (PPU.HTimerPosition == Settings.H_Max || + PPU.HTimerPosition == Settings.HBlankStart) + { + PPU.HTimerPosition--; + } + + if (!PPU.VTimerEnabled || CPU.V_Counter == PPU.IRQVBeamPos) + { + if (PPU.HTimerPosition < CPU.Cycles) + { + // Missed the IRQ on this line already + if (CPU.WhichEvent == HBLANK_END_EVENT || + CPU.WhichEvent == HTIMER_AFTER_EVENT) + { + CPU.WhichEvent = HBLANK_END_EVENT; + CPU.NextEvent = Settings.H_Max; + } + else + { + CPU.WhichEvent = HBLANK_START_EVENT; + CPU.NextEvent = Settings.HBlankStart; + } + } + else + { + if (CPU.WhichEvent == HTIMER_BEFORE_EVENT || + CPU.WhichEvent == HBLANK_START_EVENT) + { + if (PPU.HTimerPosition > Settings.HBlankStart) + { + // HTimer was to trigger before h-blank start, + // now triggers after start of h-blank + CPU.NextEvent = Settings.HBlankStart; + CPU.WhichEvent = HBLANK_START_EVENT; + } + else + { + CPU.NextEvent = PPU.HTimerPosition; + CPU.WhichEvent = HTIMER_BEFORE_EVENT; + } + } + else + { + CPU.WhichEvent = HTIMER_AFTER_EVENT; + CPU.NextEvent = PPU.HTimerPosition; + } + } + } + } +} + +void S9xFixColourBrightness() +{ +//printf("FixColourBrightness %i, max=%i\n",PPU.Brightness,IPPU.MaxBrightness); +//static unsigned back=512; +//printf("RESET por cambiar de %i a %i\n",back,PPU.Brightness); +//back=PPU.Brightness; + IPPU.XB = mul_brightness [PPU.Brightness]; + for (register int i = 0; i < 256; i++) + { + IPPU.Red [i] = IPPU.XB [PPU.CGDATA [i] & 0x1f]; + IPPU.Green [i] = IPPU.XB [(PPU.CGDATA [i] >> 5) & 0x1f]; + IPPU.Blue [i] = IPPU.XB [(PPU.CGDATA [i] >> 10) & 0x1f]; + IPPU.ScreenColors [i] = BUILD_PIXEL (IPPU.Red [i], IPPU.Green [i], IPPU.Blue [i]); + } +} + +#ifdef USE_GL +static __inline__ void S9xFixColourBrightnessCond() { +//printf("FixColourBrightnessCond %i, max=%i\n",PPU.Brightness,IPPU.MaxBrightness); + extern int videogl_hw_render; + if (!videogl_hw_render) + S9xFixColourBrightness(); +} +#else +#define S9xFixColourBrightnessCond() S9xFixColourBrightness() +#endif + + +/******************************************************************************/ +/* S9xSetPPU() */ +/* This function sets a PPU Register to a specific byte */ +/******************************************************************************/ +#ifdef DIRECT_COLOR_MAP +#define SETPPU_BRIGHTNESS(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2100]) { \ + FLUSH_REDRAW (); \ + if (PPU.Brightness != ((DAT) & 0xF)) { \ + /*IPPU.ColorsChanged = TRUE;*/ \ + IPPU.DirectColourMapsNeedRebuild = TRUE; \ + PPU.Brightness = (DAT) & 0xF; \ + S9xFixColourBrightnessCond(); \ + if (PPU.Brightness > IPPU.MaxBrightness) \ + IPPU.MaxBrightness = PPU.Brightness; \ + } \ + if ((CMemory_FillRAM[0x2100] & 0x80) != ((DAT) & 0x80)) { \ + /*IPPU.ColorsChanged = TRUE;*/ \ + PPU.ForcedBlanking = ((DAT) >> 7) & 1; \ + } \ + CMemory_FillRAM[0x2100] = (DAT); \ + } +#else +#define SETPPU_BRIGHTNESS(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2100]) { \ + FLUSH_REDRAW (); \ + if (PPU.Brightness != ((DAT) & 0xF)) { \ + /*IPPU.ColorsChanged = TRUE;*/ \ + PPU.Brightness = (DAT) & 0xF; \ + S9xFixColourBrightnessCond(); \ + if (PPU.Brightness > IPPU.MaxBrightness) \ + IPPU.MaxBrightness = PPU.Brightness; \ + } \ + if ((CMemory_FillRAM[0x2100] & 0x80) != ((DAT) & 0x80)) { \ + /*IPPU.ColorsChanged = TRUE;*/ \ + PPU.ForcedBlanking = ((DAT) >> 7) & 1; \ + } \ + CMemory_FillRAM[0x2100] = (DAT); \ + } +#endif + +#define SETPPU_OBJ(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2101]) { \ + FLUSH_REDRAW (); \ + PPU.OBJNameBase = ((DAT) & 3) << 14; \ + PPU.OBJNameSelect = (((DAT) >> 3) & 3) << 13; \ + PPU.OBJSizeSelect = ((DAT) >> 5) & 7; \ + IPPU.OBJChanged = TRUE; \ + CMemory_FillRAM[0x2101] = (DAT); \ + } + +#define SETPPU_SPR_WRITE_LOW(DAT) \ + PPU.OAMAddr = ((CMemory_FillRAM[0x2103]&1)<<8) | (DAT); \ + PPU.OAMFlip = 2;\ + PPU.OAMReadFlip = 0;\ + PPU.SavedOAMAddr = PPU.OAMAddr;\ + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) { \ + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; \ + IPPU.OBJChanged = TRUE; \ + } \ + CMemory_FillRAM[0x2102] = (DAT); + +#define SETPPU_SPR_WRITE_HIGH(DAT) \ + PPU.OAMAddr = (((DAT)&1)<<8) | CMemory_FillRAM[0x2102]; \ + PPU.OAMPriorityRotation=((DAT) & 0x80)? 1 : 0; \ + if (PPU.OAMPriorityRotation) { \ + if (PPU.FirstSprite != (PPU.OAMAddr >> 1)) { \ + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; \ + IPPU.OBJChanged = TRUE; \ + } \ + } else { \ + if (PPU.FirstSprite != 0) { \ + PPU.FirstSprite = 0; \ + IPPU.OBJChanged = TRUE; \ + } \ + } \ + PPU.OAMFlip = 0; \ + PPU.OAMReadFlip = 0; \ + PPU.SavedOAMAddr = PPU.OAMAddr; \ + CMemory_FillRAM[0x2103] = (DAT); + +#define SETPPU_SPR_REG_WRITE(DAT) \ + REGISTER_2104((DAT)); \ + CMemory_FillRAM[0x2104] = (DAT); + +#define SETPPU_SCREEN_MODE(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2105]) { \ + FLUSH_REDRAW (); \ + PPU.BG[0].BGSize = ((DAT) >> 4) & 1; \ + PPU.BG[1].BGSize = ((DAT) >> 5) & 1; \ + PPU.BG[2].BGSize = ((DAT) >> 6) & 1; \ + PPU.BG[3].BGSize = ((DAT) >> 7) & 1; \ + PPU.BGMode = (DAT) & 7; \ + PPU.BG3Priority = (((DAT) & 0x0f) == 0x09); \ + if(PPU.BGMode==5||PPU.BGMode==6) \ + IPPU.Interlace = CMemory_FillRAM[0x2133]&1; \ + CMemory_FillRAM[0x2105] = (DAT); \ + } + +#define SETPPU_MOSAIC_PIXEL(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2106]) { \ + FLUSH_REDRAW (); \ + PPU.Mosaic = ((DAT) >> 4) + 1; \ + PPU.BGMosaic [0] = ((DAT) & 1) && PPU.Mosaic > 1; \ + PPU.BGMosaic [1] = ((DAT) & 2) && PPU.Mosaic > 1; \ + PPU.BGMosaic [2] = ((DAT) & 4) && PPU.Mosaic > 1; \ + PPU.BGMosaic [3] = ((DAT) & 8) && PPU.Mosaic > 1; \ + CMemory_FillRAM[0x2106] = (DAT); \ + } + +#define SETPPU_BG0SC(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2107]) { \ + FLUSH_REDRAW (); \ + PPU.BG[0].SCSize = (DAT) & 3; \ + PPU.BG[0].SCBase = ((DAT) & 0x7c) << 8; \ + CMemory_FillRAM[0x2107] = (DAT); \ + } + +#define SETPPU_BG1SC(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2108]) { \ + FLUSH_REDRAW (); \ + PPU.BG[1].SCSize = (DAT) & 3; \ + PPU.BG[1].SCBase = ((DAT) & 0x7c) << 8; \ + CMemory_FillRAM[0x2108] = (DAT); \ + } + +#define SETPPU_BG2SC(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2109]) { \ + FLUSH_REDRAW (); \ + PPU.BG[2].SCSize = (DAT) & 3; \ + PPU.BG[2].SCBase = ((DAT) & 0x7c) << 8; \ + CMemory_FillRAM[0x2109] = (DAT); \ + } + +#define SETPPU_BG3SC(DAT) \ + if ((DAT) != CMemory_FillRAM [0x210a]) { \ + FLUSH_REDRAW (); \ + PPU.BG[3].SCSize = (DAT) & 3; \ + PPU.BG[3].SCBase = ((DAT) & 0x7c) << 8; \ + CMemory_FillRAM[0x210a] = (DAT); \ + } + +#define SETPPU_BG01NBA(DAT) \ + if ((DAT) != CMemory_FillRAM [0x210b]) { \ + FLUSH_REDRAW (); \ + PPU.BG[0].NameBase = ((DAT) & 7) << 12; \ + PPU.BG[1].NameBase = (((DAT) >> 4) & 7) << 12; \ + CMemory_FillRAM[0x210b] = (DAT); \ + } + +#define SETPPU_BG23NBA(DAT) \ + if ((DAT) != CMemory_FillRAM [0x210c]) { \ + FLUSH_REDRAW (); \ + PPU.BG[2].NameBase = ((DAT) & 7) << 12; \ + PPU.BG[3].NameBase = (((DAT) >> 4) & 7) << 12; \ + CMemory_FillRAM[0x210c] = (DAT); \ + } + +#define SETPPU_210D(DAT) \ + PPU.BG[0].HOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x210d] = (DAT); + +#define SETPPU_210E(DAT) \ + PPU.BG[0].VOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x210e] = (DAT); + +#define SETPPU_210F(DAT) \ + PPU.BG[1].HOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x210f] = (DAT); + +#define SETPPU_2110(DAT) \ + PPU.BG[1].VOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x2110] = (DAT); + +#define SETPPU_2111(DAT) \ + PPU.BG[2].HOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x2111] = (DAT); + +#define SETPPU_2112(DAT) \ + PPU.BG[2].VOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x2112] = (DAT); + +#define SETPPU_2113(DAT) \ + PPU.BG[3].HOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x2113] = (DAT); + +#define SETPPU_2114(DAT) \ + PPU.BG[3].VOffset = ((DAT)<<8) | PPU.BGnxOFSbyte; \ + PPU.BGnxOFSbyte = (DAT); \ + CMemory_FillRAM[0x2114] = (DAT); + +#define SETPPU_VRAM_ACCESS(DAT) \ + PPU.VMA.High = ((DAT) & 0x80) == 0 ? FALSE : TRUE; \ + switch ((DAT) & 3) { \ + case 0: PPU.VMA.Increment = 1; break; \ + case 1: PPU.VMA.Increment = 32; break; \ + case 2: PPU.VMA.Increment = 128; break; \ + case 3: PPU.VMA.Increment = 128; break; \ + } \ + if ((DAT) & 0x0c) { \ + static uint16 IncCount [4] = { 0, 32, 64, 128 }; \ + static uint16 Shift [4] = { 0, 5, 6, 7 }; \ + /*PPU.VMA.Increment = 1;*/ \ + uint8 i = ((DAT) & 0x0c) >> 2; \ + PPU.VMA.FullGraphicCount = IncCount [i]; \ + PPU.VMA.Mask1 = IncCount [i] * 8 - 1; \ + PPU.VMA.Shift = Shift [i]; \ + } else \ + PPU.VMA.FullGraphicCount = 0; \ + CMemory_FillRAM[0x2115] = (DAT); + +#ifdef CORRECT_VRAM_READS +#define SETPPU_VRAM_ADDR_LOW(DAT) \ + PPU.VMA.Address &= 0xFF00; \ + PPU.VMA.Address |= (DAT); \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((address << 1) & 0xFFFF)); \ + } else \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((PPU.VMA.Address << 1) & 0xffff)); \ + CMemory_FillRAM[0x2116] = (DAT); +#else +#define SETPPU_VRAM_ADDR_LOW(DAT) \ + PPU.VMA.Address &= 0xFF00; \ + PPU.VMA.Address |= (DAT); \ + IPPU.FirstVRAMRead = TRUE; \ + CMemory_FillRAM[0x2116] = (DAT); +#endif + +#ifdef CORRECT_VRAM_READS +#define SETPPU_VRAM_ADDR_HIGH(DAT) \ + PPU.VMA.Address &= 0x00FF; \ + PPU.VMA.Address |= (DAT) << 8; \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((address << 1) & 0xFFFF)); \ + } else \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((PPU.VMA.Address << 1) & 0xffff)); \ + CMemory_FillRAM[0x2117] = (DAT); +#else +#define SETPPU_VRAM_ADDR_HIGH(DAT) \ + PPU.VMA.Address &= 0x00FF; \ + PPU.VMA.Address |= (DAT) << 8; \ + IPPU.FirstVRAMRead = TRUE; \ + CMemory_FillRAM[0x2117] = (DAT); +#endif + +#ifndef CORRECT_VRAM_READS +#define SETPPU_VRAM_WRITE_LOW(DAT) \ + IPPU.FirstVRAMRead = TRUE; \ + REGISTER_2118((DAT)); \ + CMemory_FillRAM[0x2118] = (DAT); +#else +#define SETPPU_VRAM_WRITE_LOW(DAT) \ + REGISTER_2118((DAT)); \ + CMemory_FillRAM[0x2118] = (DAT); +#endif + +#ifndef CORRECT_VRAM_READS +#define SETPPU_VRAM_WRITE_HIGH(DAT) \ + IPPU.FirstVRAMRead = TRUE; \ + REGISTER_2119((DAT)); \ + CMemory_FillRAM[0x2119] = (DAT); +#else +#define SETPPU_VRAM_WRITE_HIGH(DAT) \ + REGISTER_2119((DAT)); \ + CMemory_FillRAM[0x2119] = (DAT); +#endif + +#define SETPPU_MODE7_ROT(DAT) \ + if ((DAT) != CMemory_FillRAM [0x211a]) { \ + FLUSH_REDRAW (); \ + PPU.Mode7Repeat = (DAT) >> 6; \ + if (PPU.Mode7Repeat == 1) \ + PPU.Mode7Repeat = 0; \ + PPU.Mode7VFlip = ((DAT) & 2) >> 1; \ + PPU.Mode7HFlip = (DAT) & 1; \ + CMemory_FillRAM[0x211a] = (DAT); \ + } + +#define SETPPU_MODE7_MATRIX_A(DAT) \ + PPU.MatrixA = ((PPU.MatrixA >> 8) & 0xff) | ((DAT) << 8); \ + PPU.Need16x8Mulitply = TRUE; \ + CMemory_FillRAM[0x211b] = (DAT); + +#define SETPPU_MODE7_MATRIX_B(DAT) \ + PPU.MatrixB = ((PPU.MatrixB >> 8) & 0xff) | ((DAT) << 8); \ + PPU.Need16x8Mulitply = TRUE; \ + CMemory_FillRAM[0x211c] = (DAT); + +#define SETPPU_MODE7_MATRIX_C(DAT) \ + PPU.MatrixC = ((PPU.MatrixC >> 8) & 0xff) | ((DAT) << 8); \ + CMemory_FillRAM[0x211d] = (DAT); + +#define SETPPU_MODE7_MATRIX_D(DAT) \ + PPU.MatrixD = ((PPU.MatrixD >> 8) & 0xff) | ((DAT) << 8); \ + CMemory_FillRAM[0x211e] = (DAT); + +#define SETPPU_MODE7_CENTRE_X(DAT) \ + PPU.CentreX = ((PPU.CentreX >> 8) & 0xff) | ((DAT) << 8); \ + CMemory_FillRAM[0x211f] = (DAT); + +#define SETPPU_MODE7_CENTRE_Y(DAT) \ + PPU.CentreY = ((PPU.CentreY >> 8) & 0xff) | ((DAT) << 8); \ + CMemory_FillRAM[0x2120] = (DAT); + +#define SETPPU_CGRAM_ADDR(DAT) \ + PPU.CGFLIP = 0; \ + PPU.CGFLIPRead = 0; \ + PPU.CGADD = (DAT); \ + CMemory_FillRAM[0x2121] = (DAT); + +#define SETPPU_2122(DAT) \ + REGISTER_2122((DAT)); \ + CMemory_FillRAM[0x2122] = (DAT); + +#define SETPPU_ENABLE_WIN_12(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2123]) { \ + FLUSH_REDRAW (); \ + PPU.ClipWindow1Enable [0] = !!((DAT) & 0x02); \ + PPU.ClipWindow1Enable [1] = !!((DAT) & 0x20); \ + PPU.ClipWindow2Enable [0] = !!((DAT) & 0x08); \ + PPU.ClipWindow2Enable [1] = !!((DAT) & 0x80); \ + PPU.ClipWindow1Inside [0] = !((DAT) & 0x01); \ + PPU.ClipWindow1Inside [1] = !((DAT) & 0x10); \ + PPU.ClipWindow2Inside [0] = !((DAT) & 0x04); \ + PPU.ClipWindow2Inside [1] = !((DAT) & 0x40); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2123] = (DAT); \ + } + +#define SETPPU_ENABLE_WIN_34(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2124]) { \ + FLUSH_REDRAW (); \ + PPU.ClipWindow1Enable [2] = !!((DAT) & 0x02); \ + PPU.ClipWindow1Enable [3] = !!((DAT) & 0x20); \ + PPU.ClipWindow2Enable [2] = !!((DAT) & 0x08); \ + PPU.ClipWindow2Enable [3] = !!((DAT) & 0x80); \ + PPU.ClipWindow1Inside [2] = !((DAT) & 0x01); \ + PPU.ClipWindow1Inside [3] = !((DAT) & 0x10); \ + PPU.ClipWindow2Inside [2] = !((DAT) & 0x04); \ + PPU.ClipWindow2Inside [3] = !((DAT) & 0x40); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2124] = (DAT); \ + } + +#define SETPPU_ENABLE_WIN_OBJ(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2125]) { \ + FLUSH_REDRAW (); \ + PPU.ClipWindow1Enable [4] = !!((DAT) & 0x02); \ + PPU.ClipWindow1Enable [5] = !!((DAT) & 0x20); \ + PPU.ClipWindow2Enable [4] = !!((DAT) & 0x08); \ + PPU.ClipWindow2Enable [5] = !!((DAT) & 0x80); \ + PPU.ClipWindow1Inside [4] = !((DAT) & 0x01); \ + PPU.ClipWindow1Inside [5] = !((DAT) & 0x10); \ + PPU.ClipWindow2Inside [4] = !((DAT) & 0x04); \ + PPU.ClipWindow2Inside [5] = !((DAT) & 0x40); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2125] = (DAT); \ + } + +#define SETPPU_WIN_1_LEFT(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2126]) { \ + FLUSH_REDRAW (); \ + PPU.Window1Left = (DAT); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2126] = (DAT); \ + } + +#define SETPPU_WIN_1_RIGHT(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2127]) { \ + FLUSH_REDRAW (); \ + PPU.Window1Right = (DAT); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2127] = (DAT); \ + } + +#define SETPPU_WIN_2_LEFT(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2128]) { \ + FLUSH_REDRAW (); \ + PPU.Window2Left = (DAT); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2128] = (DAT); \ + } + +#define SETPPU_WIN_2_RIGHT(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2129]) { \ + FLUSH_REDRAW (); \ + PPU.Window2Right = (DAT); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2129] = (DAT); \ + } + +#define SETPPU_WIN_OVERLAP_14(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212a]) { \ + FLUSH_REDRAW (); \ + PPU.ClipWindowOverlapLogic [0] = ((DAT) & 0x03); \ + PPU.ClipWindowOverlapLogic [1] = ((DAT) & 0x0c) >> 2; \ + PPU.ClipWindowOverlapLogic [2] = ((DAT) & 0x30) >> 4; \ + PPU.ClipWindowOverlapLogic [3] = ((DAT) & 0xc0) >> 6; \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212a] = (DAT); \ + } + +#define SETPPU_WIN_OVERLAP_OBJ(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212b]) { \ + FLUSH_REDRAW (); \ + PPU.ClipWindowOverlapLogic [4] = (DAT) & 0x03; \ + PPU.ClipWindowOverlapLogic [5] = ((DAT) & 0x0c) >> 2; \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212a] = (DAT); \ + } + +#define SETPPU_MAIN_SCREEN_DEST(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212c]) { \ + FLUSH_REDRAW (); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212c] = (DAT); \ + } + +#define SETPPU_SUB_SCREEN_DEST(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212d]) { \ + FLUSH_REDRAW (); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212d] = (DAT); \ + } + +#define SETPPU_MAIN_SCREEN_MASK(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212e]) { \ + FLUSH_REDRAW (); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212e] = (DAT); \ + } + +#define SETPPU_SUB_SCREEN_MASK(DAT) \ + if ((DAT) != CMemory_FillRAM [0x212f]) { \ + FLUSH_REDRAW (); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x212f] = (DAT); \ + } + +#define SETPPU_FIXED_ADD(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2130]) { \ + FLUSH_REDRAW (); \ + PPU.RecomputeClipWindows = TRUE; \ + CMemory_FillRAM[0x2130] = (DAT); \ + } + +#define SETPPU_COL_ADD(DAT) \ + if ((DAT) != CMemory_FillRAM[0x2131]) { \ + FLUSH_REDRAW (); \ + CMemory_FillRAM[0x2131] = (DAT); \ + } + +#define SETPPU_FIXED_SUB(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2132]) { \ + FLUSH_REDRAW (); \ + if ((DAT) & 0x80) \ + PPU.FixedColourBlue = (DAT) & 0x1f; \ + if ((DAT) & 0x40) \ + PPU.FixedColourGreen = (DAT) & 0x1f; \ + if ((DAT) & 0x20) \ + PPU.FixedColourRed = (DAT) & 0x1f; \ + CMemory_FillRAM[0x2132] = (DAT); \ + } + +#define SETPPU_SCREEN_SETS(DAT) \ + if ((DAT) != CMemory_FillRAM [0x2133]) { \ + if ((DAT) & 0x04) { \ + PPU.ScreenHeight = SNES_HEIGHT_EXTENDED; \ + IPPU.RenderedScreenHeight = PPU.ScreenHeight; \ + } \ + else PPU.ScreenHeight = SNES_HEIGHT; \ + /*if(((DAT) & 1)&&(PPU.BGMode==5||PPU.BGMode==6))*/ \ + /*IPPU.Interlace=1;*/ \ + if((CMemory_FillRAM [0x2133] ^ (DAT))&3) { \ + FLUSH_REDRAW (); \ + if((CMemory_FillRAM [0x2133] ^ (DAT))&2) \ + IPPU.OBJChanged = TRUE; \ + if(PPU.BGMode==5||PPU.BGMode==6) \ + IPPU.Interlace = (DAT)&1; \ + IPPU.InterlaceSprites=0; \ + /*IPPU.InterlaceSprites = ((DAT)&2)>>1;*/ \ + } \ + CMemory_FillRAM[0x2133] = (DAT); \ + } + +#define SETPPU_NULL() + +#ifdef SPCTOOL +#define SETPPU_SPC700(ADDR,DAT) \ + _SPCInPB ((ADDR) & 3, (DAT)); \ + CMemory_FillRAM [(ADDR)] = (DAT); +#else +#ifdef SPC700_SHUTDOWN +#define SETPPU_SPC700_COMMON(ADDR,DAT) \ + /*CPU.Flags |= DEBUG_MODE_FLAG;*/ \ + CMemory_FillRAM [(ADDR)] = (DAT); \ + IAPU.RAM [((ADDR) & 3) + 0xf4] = (DAT); \ + IAPU.APUExecuting = Settings.APUEnabled; \ + IAPU.WaitCounter++; +#else +#define SETPPU_SPC700_COMMON(ADDR,DAT) \ + /*CPU.Flags |= DEBUG_MODE_FLAG;*/ \ + CMemory_FillRAM [(ADDR)] = (DAT); \ + IAPU.RAM [((ADDR) & 3) + 0xf4] = (DAT); +#endif +#ifdef USE_ALWAYS_APU_SYNC +#define SETPPU_SPC700(ADDR,DAT) SETPPU_SPC700_COMMON(ADDR,DAT) +#else +#define SETPPU_SPC700(ADDR,DAT) \ + if (snes4all_sound_enable<=1) \ + S9xApuExecute(); \ + SETPPU_SPC700_COMMON(ADDR,DAT) +#endif +#endif + +#define SETPPU_2180(DAT) \ + REGISTER_2180((DAT)); \ + CMemory_FillRAM[0x2180] = (DAT); + +#define SETPPU_2181(DAT) \ + PPU.WRAM &= 0x1FF00; \ + PPU.WRAM |= (DAT); \ + CMemory_FillRAM[0x2181] = (DAT); + +#define SETPPU_2182(DAT) \ + PPU.WRAM &= 0x100FF; \ + PPU.WRAM |= (DAT) << 8; \ + CMemory_FillRAM[0x2182] = (DAT); + +#define SETPPU_2183(DAT) \ + PPU.WRAM &= 0x0FFFF; \ + PPU.WRAM |= (DAT) << 16; \ + PPU.WRAM &= 0x1FFFF; \ + CMemory_FillRAM[0x2183] = (DAT); + +#define SETPPU_SA1(ADDR,DAT) \ + if (Settings.SA1) { \ + if ((ADDR) >= 0x2200 && (ADDR) <0x23ff) \ + S9xSetSA1 ((DAT), (ADDR)); \ + else \ + CMemory_FillRAM [(ADDR)] = (DAT); \ + return; \ + } + +#define SETPPU_EMPTY(ADDR,DAT) \ + CMemory_FillRAM [(ADDR)] = (DAT); + +#define SETPPU_2801(DAT) \ + if (Settings.SRTC) \ + S9xSetSRTC ((DAT), 0x2801); \ + CMemory_FillRAM [0x2801] = (DAT); + +#define SETPPU_SUPERFX() \ + if (!Settings.SuperFX) \ + return; + +#ifdef ZSNES_FX +#define SETPPU_3030(DAT) \ + CMemory_FillRAM [0x3030] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3030); +#else +#define SETPPU_3030(DAT) \ + if ((CMemory_FillRAM [0x3030] ^ (DAT)) & FLG_G) { \ + CMemory_FillRAM [0x3030] = (DAT); \ + if ((DAT) & FLG_G) \ + if (Settings.SuperFX) { \ + S9xSuperFXExec (); \ + } \ + else \ + FxFlushCache (); \ + } else \ + CMemory_FillRAM [0x3030] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_3031(DAT) \ + CMemory_FillRAM [0x3031] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3031); +#else +#define SETPPU_3031(DAT) \ + CMemory_FillRAM [0x3031] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_3033(DAT) \ + CMemory_FillRAM [0x3033] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3033); +#else +#define SETPPU_3033(DAT) \ + CMemory_FillRAM [0x3033] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_3034(DAT) \ + CMemory_FillRAM [0x3034] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3034); +#else +#define SETPPU_3034(DAT) \ + CMemory_FillRAM [0x3034] = (DAT) & 0x7f; +#endif + +#ifdef ZSNES_FX +#define SETPPU_3036(DAT) \ + CMemory_FillRAM [0x3036] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3036); +#else +#define SETPPU_3036(DAT) \ + CMemory_FillRAM [0x3036] = (DAT) & 0x7f; +#endif + +#ifdef ZSNES_FX +#define SETPPU_3037(DAT) \ + CMemory_FillRAM [0x3037] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3037); +#else +#define SETPPU_3037(DAT) \ + CMemory_FillRAM [0x3037] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_3038(DAT) \ + CMemory_FillRAM [0x3038] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3038); +#else +#define SETPPU_3038(DAT) \ + CMemory_FillRAM [0x3038] = (DAT); \ + fx_dirtySCBR(); +#endif + +#ifdef ZSNES_FX +#define SETPPU_3039(DAT) \ + CMemory_FillRAM [0x3039] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x3039); +#else +#define SETPPU_3039(DAT) \ + CMemory_FillRAM [0x3039] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_303A(DAT) \ + CMemory_FillRAM [0x303a] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x303a); +#else +#define SETPPU_303A(DAT) \ + CMemory_FillRAM [0x303a] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_303B(DAT) \ + CMemory_FillRAM [0x303b] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x303b); +#else +#define SETPPU_303B(DAT) +#endif + +#ifdef ZSNES_FX +#define SETPPU_303C(DAT) \ + CMemory_FillRAM [0x303c] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x303c); +#else +#define SETPPU_303C(DAT) \ + CMemory_FillRAM [0x303c] = (DAT); \ + fx_updateRamBank((DAT)); +#endif + +#ifdef ZSNES_FX +#define SETPPU_303F(DAT) \ + CMemory_FillRAM [0x303f] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x303f); +#else +#define SETPPU_303F(DAT) \ + CMemory_FillRAM [0x303f] = (DAT); +#endif + +#ifdef ZSNES_FX +#define SETPPU_301F(DAT) \ + CMemory_FillRAM [0x301f] = (DAT); \ + S9xSuperFXWriteReg ((DAT), 0x301f); +#else +#define SETPPU_301F(DAT) \ + CMemory_FillRAM [0x301f] = (DAT); \ + CMemory_FillRAM [0x3000 + GSU_SFR] |= FLG_G; \ + if (Settings.SuperFX) \ + S9xSuperFXExec (); +#endif + +#ifdef ZSNES_FX +#define SETPPU_DEFAULT_FX(ADDR,DAT) \ + CMemory_FillRAM [(ADDR)] = (DAT); \ + if ((ADDR) < 0x3040) \ + S9xSuperFXWriteReg ((BYTE), (ADDR)); +#else +#define SETPPU_DEFAULT_FX(ADDR,DAT) \ + CMemory_FillRAM[(ADDR)] = (DAT); \ + if ((ADDR) >= 0x3100){ \ + FxCacheWriteAccess (ADDR); \ + } +#endif + +#ifdef ZSNES_FX +#define SETPPU_NULL_FX(ADDR,DAT) \ + CMemory_FillRAM [(ADDR)] = (DAT); \ + if ((ADDR) < 0x3040) \ + S9xSuperFXWriteReg ((BYTE), (ADDR)); +#else +#define SETPPU_NULL_FX(ADDR,DAT) +#endif + +#if defined(USE_SETPPU_TABLE) || defined(USE_SETPPU_SMALL_TABLE) +static void S9xSetPPU_brightness(uint8 Byte, uint16 Address) { SETPPU_BRIGHTNESS(Byte); } +static void S9xSetPPU_obj(uint8 Byte, uint16 Address) { SETPPU_OBJ(Byte); } +static void S9xSetPPU_spr_write_low(uint8 Byte, uint16 Address) { SETPPU_SPR_WRITE_LOW(Byte); } +static void S9xSetPPU_spr_write_high(uint8 Byte, uint16 Address) { SETPPU_SPR_WRITE_HIGH(Byte); } +static void S9xSetPPU_spr_reg_write(uint8 Byte, uint16 Address) { SETPPU_SPR_REG_WRITE(Byte); } +static void S9xSetPPU_screen_mode(uint8 Byte, uint16 Address) { SETPPU_SCREEN_MODE(Byte); } +static void S9xSetPPU_mosaic_pixel(uint8 Byte, uint16 Address) { SETPPU_MOSAIC_PIXEL(Byte); } +static void S9xSetPPU_bg0sc(uint8 Byte, uint16 Address) { SETPPU_BG0SC(Byte); } +static void S9xSetPPU_bg1sc(uint8 Byte, uint16 Address) { SETPPU_BG1SC(Byte); } +static void S9xSetPPU_bg2sc(uint8 Byte, uint16 Address) { SETPPU_BG2SC(Byte); } +static void S9xSetPPU_bg3sc(uint8 Byte, uint16 Address) { SETPPU_BG3SC(Byte); } +static void S9xSetPPU_bg01nba(uint8 Byte, uint16 Address) { SETPPU_BG01NBA(Byte); } +static void S9xSetPPU_bg23nba(uint8 Byte, uint16 Address) { SETPPU_BG23NBA(Byte); } +static void S9xSetPPU_210d(uint8 Byte, uint16 Address) { SETPPU_210D(Byte); } +static void S9xSetPPU_210e(uint8 Byte, uint16 Address) { SETPPU_210E(Byte); } +static void S9xSetPPU_210f(uint8 Byte, uint16 Address) { SETPPU_210F(Byte); } +static void S9xSetPPU_2110(uint8 Byte, uint16 Address) { SETPPU_2110(Byte); } +static void S9xSetPPU_2111(uint8 Byte, uint16 Address) { SETPPU_2111(Byte); } +static void S9xSetPPU_2112(uint8 Byte, uint16 Address) { SETPPU_2112(Byte); } +static void S9xSetPPU_2113(uint8 Byte, uint16 Address) { SETPPU_2113(Byte); } +static void S9xSetPPU_2114(uint8 Byte, uint16 Address) { SETPPU_2114(Byte); } +static void S9xSetPPU_vram_access(uint8 Byte, uint16 Address) { SETPPU_VRAM_ACCESS(Byte); } +static void S9xSetPPU_vram_addr_low(uint8 Byte, uint16 Address) { SETPPU_VRAM_ADDR_LOW(Byte); } +static void S9xSetPPU_vram_addr_high(uint8 Byte, uint16 Address) { SETPPU_VRAM_ADDR_HIGH(Byte); } +static void S9xSetPPU_vram_write_low(uint8 Byte, uint16 Address) { SETPPU_VRAM_WRITE_LOW(Byte); } +static void S9xSetPPU_vram_write_high(uint8 Byte, uint16 Address) { SETPPU_VRAM_WRITE_HIGH(Byte); } +static void S9xSetPPU_mode7_rot(uint8 Byte, uint16 Address) { SETPPU_MODE7_ROT(Byte); } +static void S9xSetPPU_mode7_matrix_a(uint8 Byte, uint16 Address) { SETPPU_MODE7_MATRIX_A(Byte); } +static void S9xSetPPU_mode7_matrix_b(uint8 Byte, uint16 Address) { SETPPU_MODE7_MATRIX_B(Byte); } +static void S9xSetPPU_mode7_matrix_c(uint8 Byte, uint16 Address) { SETPPU_MODE7_MATRIX_C(Byte); } +static void S9xSetPPU_mode7_matrix_d(uint8 Byte, uint16 Address) { SETPPU_MODE7_MATRIX_D(Byte); } +static void S9xSetPPU_mode7_centre_x(uint8 Byte, uint16 Address) { SETPPU_MODE7_CENTRE_X(Byte); } +static void S9xSetPPU_mode7_centre_y(uint8 Byte, uint16 Address) { SETPPU_MODE7_CENTRE_Y(Byte); } +static void S9xSetPPU_cgram_addr(uint8 Byte, uint16 Address) { SETPPU_CGRAM_ADDR(Byte); } +static void S9xSetPPU_2122(uint8 Byte, uint16 Address) { SETPPU_2122(Byte); } +static void S9xSetPPU_enable_win_12(uint8 Byte, uint16 Address) { SETPPU_ENABLE_WIN_12(Byte); } +static void S9xSetPPU_enable_win_34(uint8 Byte, uint16 Address) { SETPPU_ENABLE_WIN_34(Byte); } +static void S9xSetPPU_enable_win_obj(uint8 Byte, uint16 Address) { SETPPU_ENABLE_WIN_OBJ(Byte); } +static void S9xSetPPU_win_1_left(uint8 Byte, uint16 Address) { SETPPU_WIN_1_LEFT(Byte); } +static void S9xSetPPU_win_1_right(uint8 Byte, uint16 Address) { SETPPU_WIN_1_RIGHT(Byte); } +static void S9xSetPPU_win_2_left(uint8 Byte, uint16 Address) { SETPPU_WIN_2_LEFT(Byte); } +static void S9xSetPPU_win_2_right(uint8 Byte, uint16 Address) { SETPPU_WIN_2_RIGHT(Byte); } +static void S9xSetPPU_win_overlap_14(uint8 Byte, uint16 Address) { SETPPU_WIN_OVERLAP_14(Byte); } +static void S9xSetPPU_win_overlap_obj(uint8 Byte, uint16 Address) { SETPPU_WIN_OVERLAP_OBJ(Byte); } +static void S9xSetPPU_main_screen_dest(uint8 Byte, uint16 Address) { SETPPU_MAIN_SCREEN_DEST(Byte); } +static void S9xSetPPU_sub_screen_dest(uint8 Byte, uint16 Address) { SETPPU_SUB_SCREEN_DEST(Byte); } +static void S9xSetPPU_main_screen_mask(uint8 Byte, uint16 Address) { SETPPU_MAIN_SCREEN_MASK(Byte); } +static void S9xSetPPU_sub_screen_mask(uint8 Byte, uint16 Address) { SETPPU_SUB_SCREEN_MASK(Byte); } +static void S9xSetPPU_fixed_add(uint8 Byte, uint16 Address) { SETPPU_FIXED_ADD(Byte); } +static void S9xSetPPU_col_add(uint8 Byte, uint16 Address) { SETPPU_COL_ADD(Byte); } +static void S9xSetPPU_fixed_sub(uint8 Byte, uint16 Address) { SETPPU_FIXED_SUB(Byte); } +static void S9xSetPPU_screen_sets(uint8 Byte, uint16 Address) { SETPPU_SCREEN_SETS(Byte); } +static void S9xSetPPU_null(uint8 Byte, uint16 Address) { SETPPU_NULL(); } +static void S9xSetPPU_spctool(uint8 Byte, uint16 Address) { SETPPU_SPC700(Address,Byte); } +static void S9xSetPPU_2180(uint8 Byte, uint16 Address) { SETPPU_2180(Byte); } +static void S9xSetPPU_2181(uint8 Byte, uint16 Address) { SETPPU_2181(Byte); } +static void S9xSetPPU_2182(uint8 Byte, uint16 Address) { SETPPU_2182(Byte); } +static void S9xSetPPU_2183(uint8 Byte, uint16 Address) { SETPPU_2183(Byte); } +static void S9xSetPPU_2801(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_2801(Byte); } +static void S9xSetPPU_empty(uint8 Byte, uint16 Address) { SETPPU_EMPTY(Address,Byte); } +static void S9xSetPPU_sa1_empty(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_EMPTY(Address,Byte); } +static void S9xSetPPU_3030(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3030(Byte); } +static void S9xSetPPU_3031(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3031(Byte); } +static void S9xSetPPU_3033(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3033(Byte); } +static void S9xSetPPU_3034(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3034(Byte); } +static void S9xSetPPU_3036(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3036(Byte); } +static void S9xSetPPU_3037(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3037(Byte); } +static void S9xSetPPU_3038(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3038(Byte); } +static void S9xSetPPU_3039(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_3039(Byte); } +static void S9xSetPPU_303a(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_303A(Byte); } +static void S9xSetPPU_303b(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_303B(Byte); } +static void S9xSetPPU_303c(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_303C(Byte); } +static void S9xSetPPU_303f(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_303F(Byte); } +static void S9xSetPPU_301f(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_301F(Byte); } +static void S9xSetPPU_default_fx(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_DEFAULT_FX(Address,Byte); } +static void S9xSetPPU_null_fx(uint8 Byte, uint16 Address) { SETPPU_SA1(Address,Byte) SETPPU_SUPERFX() SETPPU_NULL_FX(Address,Byte); } +#include "setppu_table.h" +#ifdef USE_SETPPU_SMALL_TABLE +void S9xSetPPU (uint8 Byte, uint16 Address) { +#ifdef DREAMCAST + unsigned *ptr=((unsigned *)(&S9xSetPPU_func[Address-0x2100])); + asm("pref @%0" : : "r" (ptr)); +#endif + if (Address<0x2100) { S9xSetPPU_empty(Byte,Address); return; } + else if (Address>=0x3300) { S9xSetPPU_sa1_empty(Byte,Address); return; } +#ifdef DREAMCAST + else ((S9xSetPPU_func_t)(*ptr))(Byte,Address); +#else + else S9xSetPPU_func[Address-0x2100](Byte,Address); +#endif +} +#endif +#else + +void S9xSetPPU (uint8 Byte, uint16 Address) { +// fprintf(stderr, "%03d: %02x to %04x\n", CPU.V_Counter, Byte, Address); + if (Address <= 0x2183) { + switch (Address) { + case 0x2100: SETPPU_BRIGHTNESS(Byte) return; + case 0x2101: SETPPU_OBJ(Byte) return; + case 0x2102: SETPPU_SPR_WRITE_LOW(Byte) return; + case 0x2103: SETPPU_SPR_WRITE_HIGH(Byte) return; + case 0x2104: SETPPU_SPR_REG_WRITE(Byte) return; + case 0x2105: SETPPU_SCREEN_MODE(Byte) return; + case 0x2106: SETPPU_MOSAIC_PIXEL(Byte) return; + case 0x2107: SETPPU_BG0SC(Byte) return; + case 0x2108: SETPPU_BG1SC(Byte) return; + case 0x2109: SETPPU_BG2SC(Byte) return; + case 0x210A: SETPPU_BG3SC(Byte) return; + case 0x210B: SETPPU_BG01NBA(Byte) return; + case 0x210C: SETPPU_BG23NBA(Byte) return; + case 0x210D: SETPPU_210D(Byte) return; + case 0x210E: SETPPU_210E(Byte) return; + case 0x210F: SETPPU_210F(Byte) return; + case 0x2110: SETPPU_2110(Byte) return; + case 0x2111: SETPPU_2111(Byte) return; + case 0x2112: SETPPU_2112(Byte) return; + case 0x2113: SETPPU_2113(Byte) return; + case 0x2114: SETPPU_2114(Byte) return; + case 0x2115: SETPPU_VRAM_ACCESS(Byte) return; + case 0x2116: SETPPU_VRAM_ADDR_LOW(Byte) return; + case 0x2117: SETPPU_VRAM_ADDR_HIGH(Byte) return; + case 0x2118: SETPPU_VRAM_WRITE_LOW(Byte) return; + case 0x2119: SETPPU_VRAM_WRITE_HIGH(Byte) return; + case 0x211a: SETPPU_MODE7_ROT(Byte) return; + case 0x211b: SETPPU_MODE7_MATRIX_A(Byte) return; + case 0x211c: SETPPU_MODE7_MATRIX_B(Byte) return; + case 0x211d: SETPPU_MODE7_MATRIX_C(Byte) return; + case 0x211e: SETPPU_MODE7_MATRIX_D(Byte) return; + case 0x211f: SETPPU_MODE7_CENTRE_X(Byte) return; + case 0x2120: SETPPU_MODE7_CENTRE_Y(Byte) return; + case 0x2121: SETPPU_CGRAM_ADDR(Byte) return; + case 0x2122: SETPPU_2122(Byte) return; + case 0x2123: SETPPU_ENABLE_WIN_12(Byte) return; + case 0x2124: SETPPU_ENABLE_WIN_34(Byte) return; + case 0x2125: SETPPU_ENABLE_WIN_OBJ(Byte) return; + case 0x2126: SETPPU_WIN_1_LEFT(Byte) return; + case 0x2127: SETPPU_WIN_1_RIGHT(Byte) return; + case 0x2128: SETPPU_WIN_2_LEFT(Byte) return; + case 0x2129: SETPPU_WIN_2_RIGHT(Byte) return; + case 0x212a: SETPPU_WIN_OVERLAP_14(Byte) return; + case 0x212b: SETPPU_WIN_OVERLAP_OBJ(Byte) return; + case 0x212c: SETPPU_MAIN_SCREEN_DEST(Byte) return; + case 0x212d: SETPPU_SUB_SCREEN_DEST(Byte) return; + case 0x212e: SETPPU_MAIN_SCREEN_MASK(Byte) return; + case 0x212f: SETPPU_SUB_SCREEN_MASK(Byte) return; + case 0x2130: SETPPU_FIXED_ADD(Byte) return; + case 0x2131: SETPPU_COL_ADD(Byte) return; + case 0x2132: SETPPU_FIXED_SUB(Byte) return; + case 0x2133: SETPPU_SCREEN_SETS(Byte) return; + case 0x2134: case 0x2135: case 0x2136: case 0x2137: + case 0x2138: case 0x2139: case 0x213a: case 0x213b: + case 0x213c: case 0x213d: case 0x213e: case 0x213f: + SETPPU_NULL() return; + case 0x2140: case 0x2141: case 0x2142: case 0x2143: + case 0x2144: case 0x2145: case 0x2146: case 0x2147: + case 0x2148: case 0x2149: case 0x214a: case 0x214b: + case 0x214c: case 0x214d: case 0x214e: case 0x214f: + case 0x2150: case 0x2151: case 0x2152: case 0x2153: + case 0x2154: case 0x2155: case 0x2156: case 0x2157: + case 0x2158: case 0x2159: case 0x215a: case 0x215b: + case 0x215c: case 0x215d: case 0x215e: case 0x215f: + case 0x2160: case 0x2161: case 0x2162: case 0x2163: + case 0x2164: case 0x2165: case 0x2166: case 0x2167: + case 0x2168: case 0x2169: case 0x216a: case 0x216b: + case 0x216c: case 0x216d: case 0x216e: case 0x216f: + case 0x2170: case 0x2171: case 0x2172: case 0x2173: + case 0x2174: case 0x2175: case 0x2176: case 0x2177: + case 0x2178: case 0x2179: case 0x217a: case 0x217b: + case 0x217c: case 0x217d: case 0x217e: case 0x217f: + SETPPU_SPC700(Address,Byte) return; + case 0x2180: SETPPU_2180(Byte) return; + case 0x2181: SETPPU_2181(Byte) return; + case 0x2182: SETPPU_2182(Byte) return; + case 0x2183: SETPPU_2183(Byte) return; + default: SETPPU_EMPTY(Address,Byte); return; + } + } else { + SETPPU_SA1(Address,Byte) + if (Address == 0x2801) { + SETPPU_2801(Byte); return; + } else + if (Address < 0x3000 || Address >= 0x3000 + 768) { + SETPPU_EMPTY(Address,Byte); return; + } else { + SETPPU_SUPERFX() + switch (Address) { + case 0x3030: SETPPU_3030(Byte); return; + case 0x3031: SETPPU_3031(Byte); return; + case 0x3033: SETPPU_3033(Byte); return; + case 0x3034: SETPPU_3034(Byte); return; + case 0x3036: SETPPU_3036(Byte); return; + case 0x3037: SETPPU_3037(Byte); return; + case 0x3038: SETPPU_3038(Byte); return; + case 0x3039: SETPPU_3039(Byte); return; + case 0x303a: SETPPU_303A(Byte); return; + case 0x303b: SETPPU_303B(Byte); return; + case 0x303c: SETPPU_303C(Byte); return; + case 0x303f: SETPPU_303F(Byte); return; + case 0x301f: SETPPU_301F(Byte); return; + default: SETPPU_DEFAULT_FX(Address,Byte); return; + } +// SETPPU_NULL_FX(Address,Byte) return; + } + } +// SETPPU_EMPTY(Address,Byte); +} +#endif + +/******************************************************************************/ +/* S9xGetPPU() */ +/* This function retrieves a PPU Register */ +/******************************************************************************/ + +#define GETPPU_OPENBUS \ + return OpenBus; + +#define GETPPU_PPU_OPENBUS \ + return PPU.OpenBus1; + +#define GETPPU_16X8_MUL(ADDR) \ + if (PPU.Need16x8Mulitply) \ + { \ + int32 r = (int32) PPU.MatrixA * (int32) (PPU.MatrixB >> 8); \ + CMemory_FillRAM[0x2134] = (uint8) r; \ + CMemory_FillRAM[0x2135] = (uint8)(r >> 8); \ + CMemory_FillRAM[0x2136] = (uint8)(r >> 16); \ + PPU.Need16x8Mulitply = FALSE; \ + } \ + return (PPU.OpenBus1 = CMemory_FillRAM[ADDR]); + +#define GETPPU_LATCH_COUNTERS \ + S9xLatchCounters(0); \ + return OpenBus; + +#define GETPPU_READ_OAM \ + { \ + uint8 byte /*= OpenBus*/; \ + if(PPU.OAMAddr&0x100){ \ + if (!(PPU.OAMFlip&1)) { \ + byte = PPU.OAMData [(PPU.OAMAddr&0x10f) << 1]; \ + } else { \ + byte = PPU.OAMData [((PPU.OAMAddr&0x10f) << 1) + 1]; \ + PPU.OAMAddr=(PPU.OAMAddr+1)&0x1ff; \ + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) { \ + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; \ + IPPU.OBJChanged = TRUE; \ + } \ + } \ + } else { \ + if (!(PPU.OAMFlip&1)) { \ + byte = PPU.OAMData [PPU.OAMAddr << 1]; \ + } else { \ + byte = PPU.OAMData [(PPU.OAMAddr << 1) + 1]; \ + ++PPU.OAMAddr; \ + if (PPU.OAMPriorityRotation && PPU.FirstSprite != (PPU.OAMAddr >> 1)) { \ + PPU.FirstSprite = (PPU.OAMAddr&0xFE) >> 1; \ + IPPU.OBJChanged = TRUE; \ + } \ + } \ + } \ + PPU.OAMFlip ^= 1; \ + return (PPU.OpenBus1 = byte); \ + } + +#ifdef CORRECT_VRAM_READS +#define GETPPU_READ_LOW_VRAM \ + { \ + uint8 byte = IPPU.VRAMReadBuffer & 0xff; \ + if (!PPU.VMA.High) { \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((address << 1) & 0xFFFF)); \ + } else \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((PPU.VMA.Address << 1) & 0xffff)); \ + PPU.VMA.Address += PPU.VMA.Increment; \ + } \ + PPU.OpenBus1 = byte; \ + return byte; \ + } +#else +#define GETPPU_READ_LOW_VRAM \ + { \ + uint8 byte/* = OpenBus*/; \ + if (IPPU.FirstVRAMRead) \ + byte = CMemory_VRAM[(PPU.VMA.Address << 1)&0xFFFF]; \ + else \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address - 1; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + byte = CMemory_VRAM [((address << 1) - 2) & 0xFFFF]; \ + } else \ + byte = CMemory_VRAM[((PPU.VMA.Address << 1) - 2) & 0xffff]; \ + if (!PPU.VMA.High) { \ + PPU.VMA.Address += PPU.VMA.Increment; \ + IPPU.FirstVRAMRead = FALSE; \ + } \ + PPU.OpenBus1 = byte; \ + return byte; \ + } +#endif + +#ifdef CORRECT_VRAM_READS +#define GETPPU_READ_HIGH_VRAM \ + { \ + uint8 byte = (IPPU.VRAMReadBuffer>>8) & 0xff; \ + if (PPU.VMA.High) { \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((address << 1) & 0xFFFF)); \ + } else \ + IPPU.VRAMReadBuffer = READ_WORD(CMemory_VRAM+((PPU.VMA.Address << 1) & 0xffff)); \ + PPU.VMA.Address += PPU.VMA.Increment; \ + } \ + PPU.OpenBus1 = byte; \ + return byte; \ + } +#else +#define GETPPU_READ_HIGH_VRAM \ + { \ + uint8 byte/* = OpenBus*/; \ + if (IPPU.FirstVRAMRead) \ + byte = CMemory_VRAM[((PPU.VMA.Address << 1) + 1) & 0xffff]; \ + else \ + if (PPU.VMA.FullGraphicCount) { \ + uint32 addr = PPU.VMA.Address - 1; \ + uint32 rem = addr & PPU.VMA.Mask1; \ + uint32 address = (addr & ~PPU.VMA.Mask1) + \ + (rem >> PPU.VMA.Shift) + \ + ((rem & (PPU.VMA.FullGraphicCount - 1)) << 3); \ + byte = CMemory_VRAM [((address << 1) - 1) & 0xFFFF]; \ + } else \ + byte = CMemory_VRAM[((PPU.VMA.Address << 1) - 1) & 0xFFFF]; \ + if (PPU.VMA.High) { \ + PPU.VMA.Address += PPU.VMA.Increment; \ + IPPU.FirstVRAMRead = FALSE; \ + } \ + PPU.OpenBus1 = byte; \ + return byte; \ + } +#endif + +#define GETPPU_READ_PAL_DATA \ + { \ + uint8 byte/* = OpenBus*/; \ + if (PPU.CGFLIPRead) \ + byte = PPU.CGDATA [PPU.CGADD++] >> 8; \ + else \ + byte = PPU.CGDATA [PPU.CGADD] & 0xff; \ + PPU.CGFLIPRead ^= 1; \ + return (PPU.OpenBus2 = byte); \ + } + +#define GETPPU_H_COUNTER \ + { \ + uint8 byte/* = OpenBus*/; \ + if (PPU.HBeamFlip) \ + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.HBeamPosLatched >> 8) & 0x01); \ + else \ + byte = (uint8)PPU.HBeamPosLatched; \ + PPU.OpenBus2 = byte; \ + PPU.HBeamFlip ^= 1; \ + return byte; \ + } + +#define GETPPU_V_COUNTER \ + { \ + uint8 byte/* = OpenBus*/; \ + if (PPU.VBeamFlip) \ + byte = (PPU.OpenBus2 & 0xfe) | ((PPU.VBeamPosLatched >> 8) & 0x01); \ + else \ + byte = (uint8)PPU.VBeamPosLatched; \ + PPU.OpenBus2 = byte; \ + PPU.VBeamFlip ^= 1; \ + return byte; \ + } + +#define GETPPU_REDRAW \ + FLUSH_REDRAW (); \ + return (PPU.OpenBus1 = (Model->_5C77 | PPU.RangeTimeOver)); + +#define GETPPU_VCLOCK \ + PPU.VBeamFlip = PPU.HBeamFlip = 0; \ + return ((Settings.PAL ? 0x10 : 0) | (CMemory_FillRAM[0x213f] & 0xc0)| Model->_5C78) | (~PPU.OpenBus2 & 0x20); + +unsigned totales=0; +unsigned evitados=0; +#ifdef SPCTOOL +#define GETPPU_SPC700(ADDR) \ + return ((uint8) _SPCOutP [ADDR & 3]); +#else +#define GETPPU_SPC700_COMMON(ADDR) \ + if (Settings.APUEnabled) { \ + if (SNESGameFixes.APU_OutPorts_ReturnValueFix && \ + ADDR >= 0x2140 && ADDR <= 0x2143 && !CPU.V_Counter) { \ + return (uint8)((ADDR & 1) ? ((rand() & 0xff00) >> 8) : \ + (rand() & 0xff)); \ + } \ + return (APU.OutPorts [ADDR & 3]); \ + } \ + CPU.BranchSkip = TRUE; \ + if ((ADDR & 3) < 2) { \ + int r = rand (); \ + if (r & 2) { \ + if (r & 4) \ + return ((ADDR & 3) == 1 ? 0xaa : 0xbb); \ + else \ + return ((r >> 3) & 0xff); \ + } \ + } else { \ + int r = rand (); \ + if (r & 2) \ + return ((r >> 3) & 0xff); \ + } \ + return (CMemory_FillRAM[ADDR]); +#ifdef USE_ALWAYS_APU_SYNC +#define GETPPU_SPC700_APU() +#else +#define GETPPU_SPC700_APU() \ + if (snes4all_sound_enable<=1) \ + S9xApuExecute(); +#endif +#ifdef SPC700_SHUTDOWN +#define GETPPU_SPC700(ADDR) \ + GETPPU_SPC700_APU() \ + IAPU.APUExecuting = Settings.APUEnabled; \ + IAPU.WaitCounter++; \ + GETPPU_SPC700_COMMON(ADDR) +#else +#define GETPPU_SPC700(ADDR) \ + GETPPU_SPC700_APU() \ + GETPPU_SPC700_COMMON(ADDR) +#endif +#endif // SPCTOOL + +#if !defined(USE_MMU) || defined(USE_MMU_BASEPOINTER) +#define GETPPU_READ_WRAM \ + { \ + uint8 byte = CMemory_RAM [PPU.WRAM++]; \ + PPU.WRAM &= 0x1FFFF; \ + return byte; \ + } +#else +#define GETPPU_READ_WRAM \ + { \ + uint8 byte; \ + uint8 *mmu_ram=(uint8 *)(0); \ + if (PPU.WRAM>=0x2000) \ + mmu_ram=(uint8 *)(0x7e0000); \ + byte = mmu_ram[PPU.WRAM++]; \ + PPU.WRAM &= 0x1FFFF; \ + return byte; \ + } +#endif + +#define GETPPU_MODEL_5C77_20 \ + if(Model->_5C77 ==2) \ + return (0x20); \ + return OpenBus; + +#define GETPPU_MODEL_5C77_0 \ + if(Model->_5C77 ==2) \ + return (0); \ + return OpenBus; + +#define GETPPU_MODE_SRTC \ + if (Settings.SRTC) \ + return (S9xGetSRTC (0x2800)); \ + return OpenBus; + +#define GETPPU_SA1 \ + if (Settings.SA1) \ + return (S9xGetSA1 (Address)); + +#ifdef CPU_SHUTDOWN +#define GETPPU_SUPERFX_SHUTDOWN(ADDR) \ + if (ADDR == 0x3030) \ + CPU.WaitAddress = CPU.PCAtOpcodeStart; \ + else +#else +#define GETPPU_SUPERFX_SHUTDOWN(ADDR) +#endif + +#ifdef ZSNES_FX +#define GETPPU_SUPERFX_ZSNES(ADDR) \ + { \ + uint8 byte; \ + if (ADDR < 0x3040) \ + byte = S9xSuperFXReadReg (ADDR); \ + else \ + byte = CMemory_FillRAM [ADDR]; \ + GETPPU_SUPERFX_SHUTDOWN(ADDR) \ + if (ADDR == 0x3031) \ + CLEAR_IRQ_SOURCE (GSU_IRQ_SOURCE); \ + return byte; \ + } +#else +#define GETPPU_SUPERFX_ZSNES(ADDR) \ + { \ + uint8 byte = CMemory_FillRAM [ADDR]; \ + GETPPU_SUPERFX_SHUTDOWN(ADDR) \ + if (ADDR == 0x3031) { \ + CLEAR_IRQ_SOURCE (GSU_IRQ_SOURCE); \ + CMemory_FillRAM [0x3031] = byte & 0x7f; \ + } \ + return (byte); \ + } +#endif + +#define GETPPU_SUPERFX(ADDR) \ + if (!Settings.SuperFX) \ + return OpenBus; \ + GETPPU_SUPERFX_ZSNES(ADDR) + +#ifdef USE_GETPPU_TABLE +static uint8 S9xGetPPU_openbus(uint16 Address) { GETPPU_OPENBUS } +static uint8 S9xGetPPU_ppu_openbus(uint16 Address) { GETPPU_PPU_OPENBUS } +static uint8 S9xGetPPU_16x8_mul(uint16 Address) { GETPPU_16X8_MUL(Address) } +static uint8 S9xGetPPU_latch_counters(uint16 Address) { GETPPU_LATCH_COUNTERS } +static uint8 S9xGetPPU_read_oam(uint16 Address) { GETPPU_READ_OAM } +static uint8 S9xGetPPU_read_low_vram(uint16 Address) { GETPPU_READ_LOW_VRAM } +static uint8 S9xGetPPU_read_high_vram(uint16 Address) { GETPPU_READ_HIGH_VRAM } +static uint8 S9xGetPPU_read_pal_data(uint16 Address) { GETPPU_READ_PAL_DATA } +static uint8 S9xGetPPU_h_counter(uint16 Address) { GETPPU_H_COUNTER } +static uint8 S9xGetPPU_v_counter(uint16 Address) { GETPPU_V_COUNTER } +static uint8 S9xGetPPU_redraw(uint16 Address) { GETPPU_REDRAW } +static uint8 S9xGetPPU_vclock(uint16 Address) { GETPPU_VCLOCK } +static uint8 S9xGetPPU_spctool(uint16 Address) { GETPPU_SPC700(Address) } +static uint8 S9xGetPPU_read_wram(uint16 Address) { GETPPU_READ_WRAM } +static uint8 S9xGetPPU_sa1(uint16 Address) { GETPPU_SA1 GETPPU_OPENBUS } +static uint8 S9xGetPPU_superfx(uint16 Address) { GETPPU_SA1 GETPPU_SUPERFX(Address) } +static uint8 S9xGetPPU_model_5c77_20(uint16 Address) { GETPPU_SA1 GETPPU_MODEL_5C77_20 } +static uint8 S9xGetPPU_model_5c77_0(uint16 Address) { GETPPU_SA1 GETPPU_MODEL_5C77_0 } +static uint8 S9xGetPPU_mode_srtc(uint16 Address) { GETPPU_MODE_SRTC } +#include "getppu_table.h" +#else + +uint8 S9xGetPPU (uint16 Address) { + if(Address<0x2100) + GETPPU_OPENBUS + if (Address <= 0x2190) { + switch (Address) { + case 0x2100: case 0x2101: case 0x2102: case 0x2103: + GETPPU_OPENBUS + case 0x2104: case 0x2105: case 0x2106: + GETPPU_PPU_OPENBUS + case 0x2107: GETPPU_OPENBUS + case 0x2108: case 0x2109: case 0x210a: + GETPPU_PPU_OPENBUS + case 0x210b: case 0x210c: case 0x210d: case 0x210e: + case 0x210f: case 0x2110: case 0x2111: case 0x2112: + case 0x2113: GETPPU_OPENBUS + case 0x2114: case 0x2115: case 0x2116: + GETPPU_PPU_OPENBUS + case 0x2117: GETPPU_OPENBUS + case 0x2118: case 0x2119: case 0x211a: + GETPPU_PPU_OPENBUS + case 0x211b: case 0x211c: case 0x211d: case 0x211e: + case 0x211f: case 0x2120: + GETPPU_OPENBUS + case 0x2121: case 0x2122: case 0x2123: + GETPPU_OPENBUS + case 0x2124: case 0x2125: case 0x2126: + GETPPU_PPU_OPENBUS + case 0x2127: GETPPU_OPENBUS + case 0x2128: case 0x2129: case 0x212a: + GETPPU_PPU_OPENBUS + case 0x212b: case 0x212c: case 0x212d: case 0x212e: + case 0x212f: case 0x2130: case 0x2131: case 0x2132: + case 0x2133: GETPPU_OPENBUS + case 0x2134: case 0x2135: case 0x2136: + GETPPU_16X8_MUL(Address) + case 0x2137: GETPPU_LATCH_COUNTERS + case 0x2138: GETPPU_READ_OAM + case 0x2139: GETPPU_READ_LOW_VRAM + case 0x213A: GETPPU_READ_HIGH_VRAM + case 0x213B: GETPPU_READ_PAL_DATA + case 0x213C: GETPPU_H_COUNTER + case 0x213D: GETPPU_V_COUNTER + case 0x213E: GETPPU_REDRAW + case 0x213F: GETPPU_VCLOCK + case 0x2140: case 0x2141: case 0x2142: case 0x2143: + case 0x2144: case 0x2145: case 0x2146: case 0x2147: + case 0x2148: case 0x2149: case 0x214a: case 0x214b: + case 0x214c: case 0x214d: case 0x214e: case 0x214f: + case 0x2150: case 0x2151: case 0x2152: case 0x2153: + case 0x2154: case 0x2155: case 0x2156: case 0x2157: + case 0x2158: case 0x2159: case 0x215a: case 0x215b: + case 0x215c: case 0x215d: case 0x215e: case 0x215f: + case 0x2160: case 0x2161: case 0x2162: case 0x2163: + case 0x2164: case 0x2165: case 0x2166: case 0x2167: + case 0x2168: case 0x2169: case 0x216a: case 0x216b: + case 0x216c: case 0x216d: case 0x216e: case 0x216f: + case 0x2170: case 0x2171: case 0x2172: case 0x2173: + case 0x2174: case 0x2175: case 0x2176: case 0x2177: + case 0x2178: case 0x2179: case 0x217a: case 0x217b: + case 0x217c: case 0x217d: case 0x217e: case 0x217f: + GETPPU_SPC700(Address) + case 0x2180: GETPPU_READ_WRAM + case 0x2181: case 0x2182: case 0x2183: + GETPPU_OPENBUS + default: GETPPU_OPENBUS + } + } else { + GETPPU_SA1 + if (Address <= 0x2fff || Address >= 0x3000 + 768) { + switch (Address) { + case 0x21c2: GETPPU_MODEL_5C77_20 + case 0x21c3: GETPPU_MODEL_5C77_0 + case 0x2800: GETPPU_MODE_SRTC + default: GETPPU_OPENBUS + } + } + GETPPU_SUPERFX(Address) + } + GETPPU_OPENBUS +} +// GETPPU_TABLE +#endif + +/******************************************************************************/ +/* S9xSetCPU() */ +/* This function sets a CPU/DMA Register to a specific byte */ +/******************************************************************************/ +void S9xSetCPU (uint8 byte, uint16 Address) +{ + int d; + if (Address < 0x4200) + { + CPU.Cycles += ONE_CYCLE; + switch (Address) + { + case 0x4016: + // S9xReset reading of old-style joypads + if ((byte & 1) && !(CMemory_FillRAM [Address] & 1)) + { + PPU.Joypad1ButtonReadPos = 0; + PPU.Joypad2ButtonReadPos = 0; + PPU.Joypad3ButtonReadPos = 0; + } + break; + case 0x4017: + break; + default: + break; + } + } + else + switch (Address) + { + case 0x4200: + // NMI, V & H IRQ and joypad reading enable flags + if (byte & 0x20) + { + //if(!SNESGameFixes.umiharakawaseFix && PPU.IRQVBeamPos==262) fprintf(stderr, "PPU.IRQVBeamPos = %d, CPU.V_Counter = %d\n", PPU.IRQVBeamPos, CPU.V_Counter); + if (!PPU.VTimerEnabled) + { + PPU.VTimerEnabled = TRUE; + if (PPU.HTimerEnabled) + S9xUpdateHTimer (); + else + if (PPU.IRQVBeamPos == CPU.V_Counter) + S9xSetIRQ (PPU_V_BEAM_IRQ_SOURCE); + } + } + else + { + PPU.VTimerEnabled = FALSE; +// if (SNESGameFixes.umiharakawaseFix) +// byte &= ~0x20; + } + + if (byte & 0x10) + { + if (!PPU.HTimerEnabled) + { + PPU.HTimerEnabled = TRUE; + S9xUpdateHTimer (); + } + } + else + { + // No need to check for HTimer being disabled as the scanline + // event trigger code won't trigger an H-IRQ unless its enabled. + PPU.HTimerEnabled = FALSE; + PPU.HTimerPosition = Settings.H_Max + 1; + } + if (!Settings.DaffyDuck) + CLEAR_IRQ_SOURCE (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); + + if ((byte & 0x80) && + !(CMemory_FillRAM [0x4200] & 0x80) && + CPU.V_Counter >= PPU.ScreenHeight + FIRST_VISIBLE_LINE && + CPU.V_Counter <= PPU.ScreenHeight + + (SNESGameFixes.alienVSpredetorFix ? 25 : 15) && //jyam 15->25 alien vs predetor +// Panic Bomberman clears the NMI pending flag @ scanline 230 before enabling +// NMIs again. The NMI routine crashes the CPU if it is called without the NMI +// pending flag being set... + (CMemory_FillRAM [0x4210] & 0x80) && + !CPU.NMIActive) + { + CPU.Flags |= NMI_FLAG; + CPU.NMIActive = TRUE; + CPU.NMICycleCount = CPU.NMITriggerPoint; + } + break; + case 0x4201: + if((byte&0x80)==0 && (CMemory_FillRAM[0x4213]&0x80)==0x80) + S9xLatchCounters(1); + CMemory_FillRAM[0x4201] = CMemory_FillRAM[0x4213] = byte; + break; + case 0x4202: + // Multiplier (for multply) + break; + case 0x4203: + { + // Multiplicand + uint32 res = CMemory_FillRAM[0x4202] * byte; + + CMemory_FillRAM[0x4216] = (uint8) res; + CMemory_FillRAM[0x4217] = (uint8) (res >> 8); + break; + } + case 0x4204: + case 0x4205: + // Low and high muliplier (for divide) + break; + case 0x4206: + { + // Divisor + uint16 a = CMemory_FillRAM[0x4204] + (CMemory_FillRAM[0x4205] << 8); + uint16 div = byte ? a / byte : 0xffff; + uint16 rem = byte ? a % byte : a; + + CMemory_FillRAM[0x4214] = (uint8)div; + CMemory_FillRAM[0x4215] = div >> 8; + CMemory_FillRAM[0x4216] = (uint8)rem; + CMemory_FillRAM[0x4217] = rem >> 8; + break; + } + case 0x4207: + d = PPU.IRQHBeamPos; + PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xFF00) | byte; + + if (PPU.HTimerEnabled && PPU.IRQHBeamPos != d) + S9xUpdateHTimer (); + break; + + case 0x4208: + d = PPU.IRQHBeamPos; + PPU.IRQHBeamPos = (PPU.IRQHBeamPos & 0xFF) | ((byte & 1) << 8); + + if (PPU.HTimerEnabled && PPU.IRQHBeamPos != d) + S9xUpdateHTimer (); + + break; + + case 0x4209: + d = PPU.IRQVBeamPos; + PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xFF00) | byte; + if (PPU.VTimerEnabled && PPU.IRQVBeamPos != d) + { + if (PPU.HTimerEnabled) + S9xUpdateHTimer (); + else + { + if (PPU.IRQVBeamPos == CPU.V_Counter) + S9xSetIRQ (PPU_V_BEAM_IRQ_SOURCE); + } + } + break; + + case 0x420A: + d = PPU.IRQVBeamPos; + PPU.IRQVBeamPos = (PPU.IRQVBeamPos & 0xFF) | ((byte & 1) << 8); + if (PPU.VTimerEnabled && PPU.IRQVBeamPos != d) + { + if (PPU.HTimerEnabled) + S9xUpdateHTimer (); + else + { + if (PPU.IRQVBeamPos == CPU.V_Counter) + S9xSetIRQ (PPU_V_BEAM_IRQ_SOURCE); + } + } + break; + + case 0x420B: + if ((byte & 0x01) != 0) + S9xDoDMA (0); + if ((byte & 0x02) != 0) + S9xDoDMA (1); + if ((byte & 0x04) != 0) + S9xDoDMA (2); + if ((byte & 0x08) != 0) + S9xDoDMA (3); + if ((byte & 0x10) != 0) + S9xDoDMA (4); + if ((byte & 0x20) != 0) + S9xDoDMA (5); + if ((byte & 0x40) != 0) + S9xDoDMA (6); + if ((byte & 0x80) != 0) + S9xDoDMA (7); + break; + case 0x420C: +#ifndef ENABLE_HDMA + byte = 0; +#else +#ifndef USE_HDMA_EVENT + if ((unsigned)CPU.NextEvent > (unsigned)Settings.HBlankStart) { + CPU.WhichEvent = HBLANK_START_EVENT; + CPU.NextEvent = Settings.HBlankStart; + } +#endif +#endif + CMemory_FillRAM[0x420c] = byte; + IPPU.HDMA = byte; + break; + + case 0x420d: + // Cycle speed 0 - 2.68Mhz, 1 - 3.58Mhz (banks 0x80 +) + if ((byte & 1) != (CMemory_FillRAM [0x420d] & 1)) + { + if (byte & 1) + { + CPU.FastROMSpeed = ONE_CYCLE; + } + else CPU.FastROMSpeed = SLOW_ONE_CYCLE; + + CMemory_FixROMSpeed (); + } + break; + + case 0x420e: + case 0x420f: + // --->>> Unknown + break; + case 0x4210: + // NMI ocurred flag (reset on read or write) + CMemory_FillRAM[0x4210] = Model->_5A22; + return; + case 0x4211: + // IRQ ocurred flag (reset on read or write) + CLEAR_IRQ_SOURCE (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); + break; + case 0x4212: + // v-blank, h-blank and joypad being scanned flags (read-only) + case 0x4213: + // I/O Port (read-only) + case 0x4214: + case 0x4215: + // Quotent of divide (read-only) + case 0x4216: + case 0x4217: + // Multiply product (read-only) + return; + case 0x4218: + case 0x4219: + case 0x421a: + case 0x421b: + case 0x421c: + case 0x421d: + case 0x421e: + case 0x421f: + // Joypad values (read-only) + return; + + case 0x4300: + case 0x4310: + case 0x4320: + case 0x4330: + case 0x4340: + case 0x4350: + case 0x4360: + case 0x4370: + d = (Address >> 4) & 0x7; + DMA[d].TransferDirection = (byte & 128) != 0 ? 1 : 0; + DMA[d].HDMAIndirectAddressing = (byte & 64) != 0 ? 1 : 0; + DMA[d].AAddressDecrement = (byte & 16) != 0 ? 1 : 0; + DMA[d].AAddressFixed = (byte & 8) != 0 ? 1 : 0; + DMA[d].TransferMode = (byte & 7); + break; + + case 0x4301: + case 0x4311: + case 0x4321: + case 0x4331: + case 0x4341: + case 0x4351: + case 0x4361: + case 0x4371: + DMA[((Address >> 4) & 0x7)].BAddress = byte; + break; + + case 0x4302: + case 0x4312: + case 0x4322: + case 0x4332: + case 0x4342: + case 0x4352: + case 0x4362: + case 0x4372: + d = (Address >> 4) & 0x7; + DMA[d].AAddress &= 0xFF00; + DMA[d].AAddress |= byte; + break; + + case 0x4303: + case 0x4313: + case 0x4323: + case 0x4333: + case 0x4343: + case 0x4353: + case 0x4363: + case 0x4373: + d = (Address >> 4) & 0x7; + DMA[d].AAddress &= 0xFF; + DMA[d].AAddress |= byte << 8; + break; + + case 0x4304: + case 0x4314: + case 0x4324: + case 0x4334: + case 0x4344: + case 0x4354: + case 0x4364: + case 0x4374: + DMA[((Address >> 4) & 0x7)].ABank = byte; + HDMAMemPointers[((Address >> 4) & 0x7)]=NULL; + + break; + + case 0x4305: + case 0x4315: + case 0x4325: + case 0x4335: + case 0x4345: + case 0x4355: + case 0x4365: + case 0x4375: + d = (Address >> 4) & 0x7; + DMA[d].TransferBytes &= 0xFF00; + DMA[d].TransferBytes |= byte; + DMA[d].IndirectAddress &= 0xff00; + DMA[d].IndirectAddress |= byte; + HDMAMemPointers[d]=NULL; + break; + + case 0x4306: + case 0x4316: + case 0x4326: + case 0x4336: + case 0x4346: + case 0x4356: + case 0x4366: + case 0x4376: + d = (Address >> 4) & 0x7; + DMA[d].TransferBytes &= 0xFF; + DMA[d].TransferBytes |= byte << 8; + DMA[d].IndirectAddress &= 0xff; + DMA[d].IndirectAddress |= byte << 8; + HDMAMemPointers[d]=NULL; + break; + + case 0x4307: + case 0x4317: + case 0x4327: + case 0x4337: + case 0x4347: + case 0x4357: + case 0x4367: + case 0x4377: + DMA[d = ((Address >> 4) & 0x7)].IndirectBank = byte; + HDMAMemPointers[d]=NULL; + break; + + case 0x4308: + case 0x4318: + case 0x4328: + case 0x4338: + case 0x4348: + case 0x4358: + case 0x4368: + case 0x4378: + d = (Address >> 4) & 7; + DMA[d].Address &= 0xff00; + DMA[d].Address |= byte; + HDMAMemPointers[d] = NULL; + break; + + case 0x4309: + case 0x4319: + case 0x4329: + case 0x4339: + case 0x4349: + case 0x4359: + case 0x4369: + case 0x4379: + d = (Address >> 4) & 0x7; + DMA[d].Address &= 0xff; + DMA[d].Address |= byte << 8; + HDMAMemPointers[d] = NULL; + break; + + case 0x430A: + case 0x431A: + case 0x432A: + case 0x433A: + case 0x434A: + case 0x435A: + case 0x436A: + case 0x437A: + d = (Address >> 4) & 0x7; + DMA[d].LineCount = byte & 0x7f; + DMA[d].Repeat = !(byte & 0x80); + break; + + case 0x430F: + case 0x431F: + case 0x432F: + case 0x433F: + case 0x434F: + case 0x435F: + case 0x436F: + case 0x437F: + Address &= ~4; // Convert 43xF to 43xB + /* fall through */ + case 0x430B: + case 0x431B: + case 0x432B: + case 0x433B: + case 0x434B: + case 0x435B: + case 0x436B: + case 0x437B: + + // Unknown, but they seem to be RAM-ish + fprintf(stderr, "Write %02x to %04x!\n", byte, Address); + break; + + //These registers are used by both the S-DD1 and the SPC7110 + case 0x4800: + case 0x4801: + case 0x4802: + case 0x4803: + if(Settings.SPC7110) + S9xSetSPC7110(byte, Address); + //printf ("%02x->%04x\n", byte, Address); + break; + + case 0x4804: + case 0x4805: + case 0x4806: + case 0x4807: + //printf ("%02x->%04x\n", byte, Address); + if(Settings.SPC7110) + S9xSetSPC7110(byte, Address); + else if (Settings.SDD1) + S9xSetSDD1MemoryMap (Address - 0x4804, byte & 7); + break; + + //these are used by the SPC7110 + case 0x4808: + case 0x4809: + case 0x480A: + case 0x480B: + case 0x480C: + case 0x4810: + case 0x4811: + case 0x4812: + case 0x4813: + case 0x4814: + case 0x4815: + case 0x4816: + case 0x4817: + case 0x4818: + case 0x481A: + case 0x4820: + case 0x4821: + case 0x4822: + case 0x4823: + case 0x4824: + case 0x4825: + case 0x4826: + case 0x4827: + case 0x4828: + case 0x4829: + case 0x482A: + case 0x482B: + case 0x482C: + case 0x482D: + case 0x482E: + case 0x482F: + case 0x4830: + case 0x4831: + case 0x4832: + case 0x4833: + case 0x4834: + case 0x4840: + case 0x4841: + case 0x4842: + if(Settings.SPC7110) + { + S9xSetSPC7110(byte, Address); + break; + } + + default: + break; + } + CMemory_FillRAM [Address] = byte; +} + +/******************************************************************************/ +/* S9xGetCPU() */ +/* This function retrieves a CPU/DMA Register */ +/******************************************************************************/ +uint8 S9xGetCPU (uint16 Address) +{ + uint8 byte; +// fprintf(stderr, "read from %04x\n", Address); + + if (Address < 0x4200) + { + CPU.Cycles += ONE_CYCLE; + switch (Address) + { + case 0x4016: + { + if (CMemory_FillRAM [0x4016] & 1) + { + if ((!Settings.SwapJoypads && + IPPU.Controller == SNES_MOUSE_SWAPPED) || + (Settings.SwapJoypads && + IPPU.Controller == SNES_MOUSE)) + { + if (++PPU.MouseSpeed [0] > 2) + PPU.MouseSpeed [0] = 0; + } + return (0); + } + + int ind = Settings.SwapJoypads ? 1 : 0; + byte = IPPU.Joypads[ind] >> (PPU.Joypad1ButtonReadPos ^ 15); + PPU.Joypad1ButtonReadPos++; + return (byte & 1); + } + case 0x4017: + { + if (CMemory_FillRAM [0x4016] & 1) + { + // MultiPlayer5 adaptor is only allowed to be plugged into port 2 + switch (IPPU.Controller) + { + case SNES_MULTIPLAYER5: + return (2); + case SNES_MOUSE_SWAPPED: + if (Settings.SwapJoypads && ++PPU.MouseSpeed [0] > 2) + PPU.MouseSpeed [0] = 0; + break; + + case SNES_MOUSE: + if (!Settings.SwapJoypads && ++PPU.MouseSpeed [0] > 2) + PPU.MouseSpeed [0] = 0; + break; + } + return (0x00); + } + + int ind = Settings.SwapJoypads ? 0 : 1; + + if (IPPU.Controller == SNES_MULTIPLAYER5) + { + if (CMemory_FillRAM [0x4201] & 0x80) + { + byte = ((IPPU.Joypads[ind] >> (PPU.Joypad2ButtonReadPos ^ 15)) & 1) | + (((IPPU.Joypads[2] >> (PPU.Joypad2ButtonReadPos ^ 15)) & 1) << 1); + PPU.Joypad2ButtonReadPos++; + return (byte); + } + else + { + byte = ((IPPU.Joypads[3] >> (PPU.Joypad3ButtonReadPos ^ 15)) & 1) | + (((IPPU.Joypads[4] >> (PPU.Joypad3ButtonReadPos ^ 15)) & 1) << 1); + PPU.Joypad3ButtonReadPos++; + return (byte); + } + } + else if(IPPU.Controller ==SNES_JUSTIFIER || IPPU.Controller ==SNES_JUSTIFIER_2) + { + uint8 rv; + rv=(1&(justifiers>>in_bit)); + in_bit++; + in_bit%=32; + return rv; + } + return ((IPPU.Joypads[ind] >> (PPU.Joypad2ButtonReadPos++ ^ 15)) & 1); + } + default: + return OpenBus; + + } +// return (CMemory_FillRAM [Address]); + } + else + switch (Address) + { + case 0x4200: + case 0x4201: + case 0x4202: + case 0x4203: + case 0x4204: + case 0x4205: + case 0x4206: + case 0x4207: + case 0x4208: + case 0x4209: + case 0x420a: + case 0x420b: + case 0x420c: + case 0x420d: + case 0x420e: + case 0x420f: + return OpenBus; + + case 0x4210: +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PCAtOpcodeStart; +#endif + byte = CMemory_FillRAM[0x4210]; + CMemory_FillRAM[0x4210] = Model->_5A22; + //SNEeSe returns 2 for 5A22 version. + return ((byte&0x80)|(OpenBus&0x70)|Model->_5A22); + + case 0x4211: + byte = (CPU.IRQActive & (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE)) ? 0x80 : 0; + // Super Robot Wars Ex ROM bug requires this. + byte |= CPU.Cycles >= Settings.HBlankStart ? 0x40 : 0; + CLEAR_IRQ_SOURCE (PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE); + + // Maybe? Register Scan indicated open bus... + byte |= OpenBus&0x3f; + + return (byte); + + case 0x4212: + // V-blank, h-blank and joypads being read flags (read-only) +#ifdef CPU_SHUTDOWN + CPU.WaitAddress = CPU.PCAtOpcodeStart; +#endif + return (REGISTER_4212()|(OpenBus&0x3E)); + + case 0x4213: + // I/O port input - returns 0 wherever $4201 is 0, and 1 elsewhere + // unless something else pulls it down (i.e. a gun) + return CMemory_FillRAM[0x4213]; + + case 0x4214: + case 0x4215: + // Quotient of divide result + case 0x4216: + case 0x4217: + // Multiplcation result (for multiply) or remainder of + // divison. + return (CMemory_FillRAM[Address]); + case 0x4218: + case 0x4219: + case 0x421a: + case 0x421b: + case 0x421c: + case 0x421d: + case 0x421e: + case 0x421f: + // Joypads 1-4 button and direction state. + return (CMemory_FillRAM [Address]); + + case 0x4300: + case 0x4310: + case 0x4320: + case 0x4330: + case 0x4340: + case 0x4350: + case 0x4360: + case 0x4370: + // DMA direction, address type, fixed flag, + return (CMemory_FillRAM[Address]); + + case 0x4301: + case 0x4311: + case 0x4321: + case 0x4331: + case 0x4341: + case 0x4351: + case 0x4361: + case 0x4371: + return (CMemory_FillRAM[Address]); + + case 0x4302: + case 0x4312: + case 0x4322: + case 0x4332: + case 0x4342: + case 0x4352: + case 0x4362: + case 0x4372: + return (CMemory_FillRAM[Address]); + + case 0x4303: + case 0x4313: + case 0x4323: + case 0x4333: + case 0x4343: + case 0x4353: + case 0x4363: + case 0x4373: + return (CMemory_FillRAM[Address]); + + case 0x4304: + case 0x4314: + case 0x4324: + case 0x4334: + case 0x4344: + case 0x4354: + case 0x4364: + case 0x4374: + return (CMemory_FillRAM[Address]); + + case 0x4305: + case 0x4315: + case 0x4325: + case 0x4335: + case 0x4345: + case 0x4355: + case 0x4365: + case 0x4375: + return (CMemory_FillRAM[Address]); + + case 0x4306: + case 0x4316: + case 0x4326: + case 0x4336: + case 0x4346: + case 0x4356: + case 0x4366: + case 0x4376: + return (CMemory_FillRAM[Address]); + + case 0x4307: + case 0x4317: + case 0x4327: + case 0x4337: + case 0x4347: + case 0x4357: + case 0x4367: + case 0x4377: + return (DMA[(Address >> 4) & 7].IndirectBank); + + case 0x4308: + case 0x4318: + case 0x4328: + case 0x4338: + case 0x4348: + case 0x4358: + case 0x4368: + case 0x4378: + return (CMemory_FillRAM[Address]); + + case 0x4309: + case 0x4319: + case 0x4329: + case 0x4339: + case 0x4349: + case 0x4359: + case 0x4369: + case 0x4379: + return (CMemory_FillRAM[Address]); + + case 0x430A: + case 0x431A: + case 0x432A: + case 0x433A: + case 0x434A: + case 0x435A: + case 0x436A: + case 0x437A: + { + int d = (Address & 0x70) >> 4; + if (IPPU.HDMA & (1 << d)) + { + return (DMA[d].LineCount); + } + return (CMemory_FillRAM[Address]); + } + + case 0x430F: + case 0x431F: + case 0x432F: + case 0x433F: + case 0x434F: + case 0x435F: + case 0x436F: + case 0x437F: + Address &= ~4; // Convert 43xF to 43xB + /* fall through */ + case 0x430B: + case 0x431B: + case 0x432B: + case 0x433B: + case 0x434B: + case 0x435B: + case 0x436B: + case 0x437B: + // Unknown, but they seem to be RAM-ish + return (CMemory_FillRAM[Address]); + default: + if(Address>= 0x4800&&Settings.SPC7110) + return S9xGetSPC7110(Address); + + if(Address>=0x4800&&Address<=0x4807&&Settings.SDD1) + { + return CMemory_FillRAM[Address]; + } + + return OpenBus; + } +// return (CMemory_FillRAM[Address]); +} + +void S9xResetPPU () +{ + PPU.BGMode = 0; + PPU.BG3Priority = 0; + PPU.Brightness = 0; + PPU.VMA.High = 0; + PPU.VMA.Increment = 1; + PPU.VMA.Address = 0; + PPU.VMA.FullGraphicCount = 0; + PPU.VMA.Shift = 0; + + for (uint8 B = 0; B != 4; B++) + { + PPU.BG[B].SCBase = 0; + PPU.BG[B].VOffset = 0; + PPU.BG[B].HOffset = 0; + PPU.BG[B].BGSize = 0; + PPU.BG[B].NameBase = 0; + PPU.BG[B].SCSize = 0; + + PPU.ClipCounts[B] = 0; + PPU.ClipWindowOverlapLogic [B] = CLIP_OR; + PPU.ClipWindow1Enable[B] = FALSE; + PPU.ClipWindow2Enable[B] = FALSE; + PPU.ClipWindow1Inside[B] = TRUE; + PPU.ClipWindow2Inside[B] = TRUE; + } + + PPU.ClipCounts[4] = 0; + PPU.ClipCounts[5] = 0; + PPU.ClipWindowOverlapLogic[4] = PPU.ClipWindowOverlapLogic[5] = CLIP_OR; + PPU.ClipWindow1Enable[4] = PPU.ClipWindow1Enable[5] = FALSE; + PPU.ClipWindow2Enable[4] = PPU.ClipWindow2Enable[5] = FALSE; + PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = TRUE; + PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = TRUE; + + PPU.CGFLIP = 0; + int c; + for (c = 0; c < 256; c++) + { + IPPU.Red [c] = (c & 7) << 2; + IPPU.Green [c] = ((c >> 3) & 7) << 2; + IPPU.Blue [c] = ((c >> 6) & 2) << 3; + PPU.CGDATA [c] = IPPU.Red [c] | (IPPU.Green [c] << 5) | + (IPPU.Blue [c] << 10); + } + + PPU.FirstSprite = 0; + PPU.LastSprite = 127; + for (int Sprite = 0; Sprite < 128; Sprite++) + { + PPU.OBJ[Sprite].HPos = 0; + PPU.OBJ[Sprite].VPos = 0; + PPU.OBJ[Sprite].VFlip = 0; + PPU.OBJ[Sprite].HFlip = 0; + PPU.OBJ[Sprite].Priority = 0; + PPU.OBJ[Sprite].Palette = 0; + PPU.OBJ[Sprite].Name = 0; + PPU.OBJ[Sprite].Size = 0; + } + PPU.OAMPriorityRotation = 0; + PPU.OAMWriteRegister = 0; + PPU.RangeTimeOver = 0; + PPU.OpenBus1 = 0; + PPU.OpenBus2 = 0; + + PPU.OAMFlip = 0; + PPU.OAMTileAddress = 0; + PPU.OAMAddr = 0; + PPU.IRQVBeamPos = 0; + PPU.IRQHBeamPos = 0; + PPU.VBeamPosLatched = 0; + PPU.HBeamPosLatched = 0; + + PPU.HBeamFlip = 0; + PPU.VBeamFlip = 0; + PPU.HVBeamCounterLatched = 0; + + PPU.MatrixA = PPU.MatrixB = PPU.MatrixC = PPU.MatrixD = 0; + PPU.CentreX = PPU.CentreY = 0; + PPU.Joypad1ButtonReadPos = 0; + PPU.Joypad2ButtonReadPos = 0; + PPU.Joypad3ButtonReadPos = 0; + + PPU.CGADD = 0; + PPU.FixedColourRed = PPU.FixedColourGreen = PPU.FixedColourBlue = 0; + PPU.SavedOAMAddr = 0; + PPU.ScreenHeight = SNES_HEIGHT; + PPU.WRAM = 0; + PPU.BG_Forced = 0; + PPU.ForcedBlanking = TRUE; + PPU.OBJThroughMain = FALSE; + PPU.OBJThroughSub = FALSE; + PPU.OBJSizeSelect = 0; + PPU.OBJNameSelect = 0; + PPU.OBJNameBase = 0; + PPU.OBJAddition = FALSE; + PPU.OAMReadFlip = 0; + PPU.BGnxOFSbyte = 0; + ZeroMemory (PPU.OAMData, 512 + 32); + + PPU.VTimerEnabled = FALSE; + PPU.HTimerEnabled = FALSE; + PPU.HTimerPosition = Settings.H_Max + 1; + PPU.Mosaic = 0; + PPU.BGMosaic [0] = PPU.BGMosaic [1] = FALSE; + PPU.BGMosaic [2] = PPU.BGMosaic [3] = FALSE; + PPU.Mode7HFlip = FALSE; + PPU.Mode7VFlip = FALSE; + PPU.Mode7Repeat = 0; + PPU.Window1Left = 1; + PPU.Window1Right = 0; + PPU.Window2Left = 1; + PPU.Window2Right = 0; + PPU.RecomputeClipWindows = TRUE; + PPU.CGFLIPRead = 0; + PPU.Need16x8Mulitply = FALSE; + PPU.MouseSpeed[0] = PPU.MouseSpeed[1] = 0; + + IPPU.ColorsChanged = TRUE; + IPPU.HDMA = 0; + IPPU.HDMAStarted = FALSE; + IPPU.MaxBrightness = 0; + IPPU.LatchedBlanking = 0; + IPPU.OBJChanged = TRUE; + IPPU.RenderThisFrame = TRUE; +#ifdef DIRECT_COLOR_MAP + IPPU.DirectColourMapsNeedRebuild = TRUE; +#endif + IPPU.FrameCount = 0; + IPPU.RenderedFramesCount = 0; + IPPU.DisplayedRenderedFrameCount = 0; + IPPU.SkippedFrames = 0; + IPPU.FrameSkip = 0; + ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); +#ifdef CORRECT_VRAM_READS + IPPU.VRAMReadBuffer = 0; // XXX: FIXME: anything better? +#else + IPPU.FirstVRAMRead = FALSE; +#endif + IPPU.Interlace = FALSE; + IPPU.InterlaceSprites = FALSE; + IPPU.DoubleWidthPixels = FALSE; + IPPU.DoubleHeightPixels = FALSE; + IPPU.RenderedScreenWidth = SNES_WIDTH; + IPPU.RenderedScreenHeight = SNES_HEIGHT; + IPPU.XB = NULL; + for (c = 0; c < 256; c++) + IPPU.ScreenColors [c] = c; + S9xFixColourBrightness (); + IPPU.PreviousLine = IPPU.CurrentLine = 0; + IPPU.Joypads[0] = IPPU.Joypads[1] = IPPU.Joypads[2] = 0; + IPPU.Joypads[3] = IPPU.Joypads[4] = 0; + IPPU.SuperScope = 0; + IPPU.Mouse[0] = IPPU.Mouse[1] = 0; + IPPU.PrevMouseX[0] = IPPU.PrevMouseX[1] = 256 / 2; + IPPU.PrevMouseY[0] = IPPU.PrevMouseY[1] = 224 / 2; + + if (Settings.ControllerOption == 0) + IPPU.Controller = SNES_MAX_CONTROLLER_OPTIONS - 1; + else + IPPU.Controller = Settings.ControllerOption - 1; + S9xNextController (); + + for (c = 0; c < 2; c++) + memset (&IPPU.Clip [c], 0, sizeof (struct ClipData)); + + if (Settings.MouseMaster) + { + S9xProcessMouse (0); + S9xProcessMouse (1); + } + for (c = 0; c < 0x8000; c += 0x100) + { + if ( !Settings.SuperFX ) + { + memset (&CMemory_FillRAM [c], c >> 8, 0x100); + } + else if ( (unsigned)c < 0x3000 || (unsigned)c >= 0x3300 ) + { + /* Don't overwrite SFX pvRegisters at 0x3000-0x32FF, + * they were set in FxReset. + */ + memset (&CMemory_FillRAM [c], c >> 8, 0x100); + } + } + + ZeroMemory (&CMemory_FillRAM [0x2100], 0x100); + ZeroMemory (&CMemory_FillRAM [0x4200], 0x100); + ZeroMemory (&CMemory_FillRAM [0x4000], 0x100); + // For BS Suttehakkun 2... + ZeroMemory (&CMemory_FillRAM [0x1000], 0x1000); + + CMemory_FillRAM[0x4201]=CMemory_FillRAM[0x4213]=0xFF; +} + +void S9xSoftResetPPU () +{ + PPU.BGMode = 0; + PPU.BG3Priority = 0; + PPU.Brightness = 0; + PPU.VMA.High = 0; + PPU.VMA.Increment = 1; + PPU.VMA.Address = 0; + PPU.VMA.FullGraphicCount = 0; + PPU.VMA.Shift = 0; + + for (uint8 B = 0; B != 4; B++) + { + PPU.BG[B].SCBase = 0; + PPU.BG[B].VOffset = 0; + PPU.BG[B].HOffset = 0; + PPU.BG[B].BGSize = 0; + PPU.BG[B].NameBase = 0; + PPU.BG[B].SCSize = 0; + + PPU.ClipCounts[B] = 0; + PPU.ClipWindowOverlapLogic [B] = CLIP_OR; + PPU.ClipWindow1Enable[B] = FALSE; + PPU.ClipWindow2Enable[B] = FALSE; + PPU.ClipWindow1Inside[B] = TRUE; + PPU.ClipWindow2Inside[B] = TRUE; + } + + PPU.ClipCounts[4] = 0; + PPU.ClipCounts[5] = 0; + PPU.ClipWindowOverlapLogic[4] = PPU.ClipWindowOverlapLogic[5] = CLIP_OR; + PPU.ClipWindow1Enable[4] = PPU.ClipWindow1Enable[5] = FALSE; + PPU.ClipWindow2Enable[4] = PPU.ClipWindow2Enable[5] = FALSE; + PPU.ClipWindow1Inside[4] = PPU.ClipWindow1Inside[5] = TRUE; + PPU.ClipWindow2Inside[4] = PPU.ClipWindow2Inside[5] = TRUE; + + PPU.CGFLIP = 0; + int c; + for (c = 0; c < 256; c++) + { + IPPU.Red [c] = (c & 7) << 2; + IPPU.Green [c] = ((c >> 3) & 7) << 2; + IPPU.Blue [c] = ((c >> 6) & 2) << 3; + PPU.CGDATA [c] = IPPU.Red [c] | (IPPU.Green [c] << 5) | + (IPPU.Blue [c] << 10); + } + + PPU.FirstSprite = 0; + PPU.LastSprite = 127; + for (int Sprite = 0; Sprite < 128; Sprite++) + { + PPU.OBJ[Sprite].HPos = 0; + PPU.OBJ[Sprite].VPos = 0; + PPU.OBJ[Sprite].VFlip = 0; + PPU.OBJ[Sprite].HFlip = 0; + PPU.OBJ[Sprite].Priority = 0; + PPU.OBJ[Sprite].Palette = 0; + PPU.OBJ[Sprite].Name = 0; + PPU.OBJ[Sprite].Size = 0; + } + PPU.OAMPriorityRotation = 0; + PPU.OAMWriteRegister = 0; + PPU.RangeTimeOver = 0; + PPU.OpenBus1 = 0; + PPU.OpenBus2 = 0; + + PPU.OAMFlip = 0; + PPU.OAMTileAddress = 0; + PPU.OAMAddr = 0; + PPU.IRQVBeamPos = 0; + PPU.IRQHBeamPos = 0; + PPU.VBeamPosLatched = 0; + PPU.HBeamPosLatched = 0; + + PPU.HBeamFlip = 0; + PPU.VBeamFlip = 0; + PPU.HVBeamCounterLatched = 0; + + PPU.MatrixA = PPU.MatrixB = PPU.MatrixC = PPU.MatrixD = 0; + PPU.CentreX = PPU.CentreY = 0; +// PPU.Joypad1ButtonReadPos = 0; +// PPU.Joypad2ButtonReadPos = 0; +// PPU.Joypad3ButtonReadPos = 0; + PPU.CGADD = 0; + PPU.FixedColourRed = PPU.FixedColourGreen = PPU.FixedColourBlue = 0; + PPU.SavedOAMAddr = 0; + PPU.ScreenHeight = SNES_HEIGHT; + PPU.WRAM = 0; + PPU.BG_Forced = 0; + PPU.ForcedBlanking = TRUE; + PPU.OBJThroughMain = FALSE; + PPU.OBJThroughSub = FALSE; + PPU.OBJSizeSelect = 0; + PPU.OBJNameSelect = 0; + PPU.OBJNameBase = 0; + PPU.OBJAddition = FALSE; + PPU.OAMReadFlip = 0; + PPU.BGnxOFSbyte = 0; + ZeroMemory (PPU.OAMData, 512 + 32); + + PPU.VTimerEnabled = FALSE; + PPU.HTimerEnabled = FALSE; + PPU.HTimerPosition = Settings.H_Max + 1; + PPU.Mosaic = 0; + PPU.BGMosaic [0] = PPU.BGMosaic [1] = FALSE; + PPU.BGMosaic [2] = PPU.BGMosaic [3] = FALSE; + PPU.Mode7HFlip = FALSE; + PPU.Mode7VFlip = FALSE; + PPU.Mode7Repeat = 0; + PPU.Window1Left = 1; + PPU.Window1Right = 0; + PPU.Window2Left = 1; + PPU.Window2Right = 0; + PPU.RecomputeClipWindows = TRUE; + PPU.CGFLIPRead = 0; + PPU.Need16x8Mulitply = FALSE; + PPU.MouseSpeed[0] = PPU.MouseSpeed[1] = 0; + + IPPU.ColorsChanged = TRUE; + IPPU.HDMA = 0; + IPPU.HDMAStarted = FALSE; + IPPU.MaxBrightness = 0; + IPPU.LatchedBlanking = 0; + IPPU.OBJChanged = TRUE; + IPPU.RenderThisFrame = TRUE; +#ifdef DIRECT_COLOR_MAP + IPPU.DirectColourMapsNeedRebuild = TRUE; +#endif + IPPU.FrameCount = 0; + IPPU.RenderedFramesCount = 0; + IPPU.DisplayedRenderedFrameCount = 0; + IPPU.SkippedFrames = 0; + IPPU.FrameSkip = 0; + ZeroMemory (IPPU.TileCached [TILE_2BIT], MAX_2BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_4BIT], MAX_4BIT_TILES); + ZeroMemory (IPPU.TileCached [TILE_8BIT], MAX_8BIT_TILES); +#ifdef CORRECT_VRAM_READS + IPPU.VRAMReadBuffer = 0; // XXX: FIXME: anything better? +#else + IPPU.FirstVRAMRead = FALSE; +#endif + IPPU.Interlace = FALSE; + IPPU.InterlaceSprites = FALSE; + IPPU.DoubleWidthPixels = FALSE; + IPPU.DoubleHeightPixels = FALSE; + IPPU.RenderedScreenWidth = SNES_WIDTH; + IPPU.RenderedScreenHeight = SNES_HEIGHT; + IPPU.XB = NULL; + for (c = 0; c < 256; c++) + IPPU.ScreenColors [c] = c; + S9xFixColourBrightness (); + IPPU.PreviousLine = IPPU.CurrentLine = 0; +// IPPU.Joypads[0] = IPPU.Joypads[1] = IPPU.Joypads[2] = 0; +// IPPU.Joypads[3] = IPPU.Joypads[4] = 0; +// IPPU.SuperScope = 0; +// IPPU.Mouse[0] = IPPU.Mouse[1] = 0; +// IPPU.PrevMouseX[0] = IPPU.PrevMouseX[1] = 256 / 2; +// IPPU.PrevMouseY[0] = IPPU.PrevMouseY[1] = 224 / 2; + + if (Settings.ControllerOption == 0) + IPPU.Controller = SNES_MAX_CONTROLLER_OPTIONS - 1; + else + IPPU.Controller = Settings.ControllerOption - 1; + S9xNextController (); + + for (c = 0; c < 2; c++) + memset (&IPPU.Clip [c], 0, sizeof (struct ClipData)); + + if (Settings.MouseMaster) + { + S9xProcessMouse (0); + S9xProcessMouse (1); + } + for (c = 0; c < 0x8000; c += 0x100) + memset (&CMemory_FillRAM [c], c >> 8, 0x100); + + ZeroMemory (&CMemory_FillRAM [0x2100], 0x100); + ZeroMemory (&CMemory_FillRAM [0x4200], 0x100); + ZeroMemory (&CMemory_FillRAM [0x4000], 0x100); + // For BS Suttehakkun 2... + ZeroMemory (&CMemory_FillRAM [0x1000], 0x1000); + + CMemory_FillRAM[0x4201]=CMemory_FillRAM[0x4213]=0xFF; +} + +void S9xProcessMouse (int which1) +{ + int x, y; + uint32 buttons; + + if ((IPPU.Controller == SNES_MOUSE || IPPU.Controller == SNES_MOUSE_SWAPPED) && S9xReadMousePosition (which1, x, y, buttons)) + { + int delta_x, delta_y; +#define MOUSE_SIGNATURE 0x1 + IPPU.Mouse [which1] = MOUSE_SIGNATURE | + (PPU.MouseSpeed [which1] << 4) | + ((buttons & 1) << 6) | ((buttons & 2) << 6); + + delta_x = x - IPPU.PrevMouseX[which1]; + delta_y = y - IPPU.PrevMouseY[which1]; + + if (delta_x > 63) + { + delta_x = 63; + IPPU.PrevMouseX[which1] += 63; + } + else + if (delta_x < -63) + { + delta_x = -63; + IPPU.PrevMouseX[which1] -= 63; + } + else + IPPU.PrevMouseX[which1] = x; + + if (delta_y > 63) + { + delta_y = 63; + IPPU.PrevMouseY[which1] += 63; + } + else + if (delta_y < -63) + { + delta_y = -63; + IPPU.PrevMouseY[which1] -= 63; + } + else + IPPU.PrevMouseY[which1] = y; + + if (delta_x < 0) + { + delta_x = -delta_x; + IPPU.Mouse [which1] |= (delta_x | 0x80) << 16; + } + else + IPPU.Mouse [which1] |= delta_x << 16; + + if (delta_y < 0) + { + delta_y = -delta_y; + IPPU.Mouse [which1] |= (delta_y | 0x80) << 24; + } + else + IPPU.Mouse [which1] |= delta_y << 24; + + if (IPPU.Controller == SNES_MOUSE_SWAPPED) + IPPU.Joypads [0] = IPPU.Mouse [which1]; + else + IPPU.Joypads [1] = IPPU.Mouse [which1]; + } +} + +void ProcessSuperScope () +{ + int x, y; + uint32 buttons; + + if (IPPU.Controller == SNES_SUPERSCOPE && + S9xReadSuperScopePosition (x, y, buttons)) + { +#define SUPERSCOPE_SIGNATURE 0x00ff + uint32 scope; + + scope = SUPERSCOPE_SIGNATURE | ((buttons & 1) << (7 + 8)) | + ((buttons & 2) << (5 + 8)) | ((buttons & 4) << (3 + 8)) | + ((buttons & 8) << (1 + 8)); + if(CMemory_FillRAM[0x4201]&0x80){ + x+=40; + if (x > 295) + x = 295; + if (x < 40) + x = 40; + if (y > PPU.ScreenHeight - 1) + y = PPU.ScreenHeight - 1; + if (y < 0) + y = 0; + + PPU.VBeamPosLatched = (uint16) (y + 1); + PPU.HBeamPosLatched = (uint16) x; + PPU.HVBeamCounterLatched = TRUE; + CMemory_FillRAM [0x213F] |= 0x40 | Model->_5C78; + } + IPPU.Joypads [1] = scope; + } +} + +void S9xNextController () +{ + switch (IPPU.Controller) + { + case SNES_MULTIPLAYER5: + IPPU.Controller = SNES_JOYPAD; + break; + case SNES_JOYPAD: + if (Settings.MouseMaster) + { + IPPU.Controller = SNES_MOUSE_SWAPPED; + break; + } + case SNES_MOUSE_SWAPPED: + if (Settings.MouseMaster) + { + IPPU.Controller = SNES_MOUSE; + break; + } + case SNES_MOUSE: + if (Settings.SuperScopeMaster) + { + IPPU.Controller = SNES_SUPERSCOPE; + break; + } + case SNES_SUPERSCOPE: + if (Settings.JustifierMaster) + { + IPPU.Controller = SNES_JUSTIFIER; + break; + } + case SNES_JUSTIFIER: + if(Settings.JustifierMaster) + { + IPPU.Controller=SNES_JUSTIFIER_2; + break; + } + case SNES_JUSTIFIER_2: + if(Settings.MultiPlayer5Master) + { + IPPU.Controller=SNES_MULTIPLAYER5; + break; + } + default: + IPPU.Controller = SNES_JOYPAD; + break; + } +} + +void S9xUpdateJustifiers() +{ + static bool last_p1; + in_bit=0; +// static int p1count; + justifiers=0xFFFF00AA; + + bool offscreen=JustifierOffscreen(); + + JustifierButtons(justifiers); +// if(p1count==32) +// { + last_p1=!last_p1; +// p1count=0; +// } +// p1count++; + + if(!last_p1) + justifiers|=0x1000; + + int x,y; + uint32 buttons; + + if(CMemory_FillRAM[0x4201]&0x80) + { + + S9xReadSuperScopePosition(x,y,buttons); + + x+=40; + if (x > 295) + x = 295; + if (x < 40) + x = 40; + if (y > PPU.ScreenHeight - 1) + y = PPU.ScreenHeight - 1; + if (y < 0) + y = 0; + + if(last_p1) + { + + PPU.HVBeamCounterLatched = FALSE; + CMemory_FillRAM [0x213F] = Model->_5C78; + + //process latch as Justifier 2 + if(Settings.SecondJustifier) + { + if(IPPU.Controller==SNES_JUSTIFIER_2) + { + if(!offscreen) + { + + PPU.VBeamPosLatched = (uint16) (y + 1); + PPU.HBeamPosLatched = (uint16) x; + PPU.HVBeamCounterLatched = TRUE; + CMemory_FillRAM [0x213F] |= 0x40 | Model->_5C78; + } + } + } + } + else + { + + PPU.HVBeamCounterLatched = FALSE; + CMemory_FillRAM [0x213F] = Model->_5C78; + + //emulate player 1. + if(IPPU.Controller==SNES_JUSTIFIER) + { + if(!offscreen) + { + PPU.VBeamPosLatched = (uint16) (y + 1); + PPU.HBeamPosLatched = (uint16) x; + PPU.HVBeamCounterLatched = TRUE; + CMemory_FillRAM [0x213F] |= 0x40 | Model->_5C78; + } + } + } + + //needs restructure + if(!offscreen) + { + + if((!last_p1&&IPPU.Controller==SNES_JUSTIFIER)||(last_p1&&IPPU.Controller==SNES_JUSTIFIER_2)) + { + PPU.VBeamPosLatched = (uint16) (y + 1); + PPU.HBeamPosLatched = (uint16) x; + PPU.HVBeamCounterLatched = TRUE; + CMemory_FillRAM [0x213F] |= 0x40 | Model->_5C78; + } + else + { + PPU.HVBeamCounterLatched = FALSE; + CMemory_FillRAM [0x213F] = Model->_5C78; + + } + } + else + { + PPU.HVBeamCounterLatched = FALSE; + CMemory_FillRAM [0x213F] = Model->_5C78; + } + } +} + +void S9xUpdateJoypads () +{ + int i; + + for (i = 0; i < 5; i++) + { + IPPU.Joypads [i] = S9xReadJoypad (i); + if (IPPU.Joypads [i] & SNES_LEFT_MASK) + IPPU.Joypads [i] &= ~SNES_RIGHT_MASK; + if (IPPU.Joypads [i] & SNES_UP_MASK) + IPPU.Joypads [i] &= ~SNES_DOWN_MASK; + } + + // BJ: This is correct behavior AFAICT (used to be Touhaiden hack) + if (IPPU.Controller == SNES_JOYPAD || IPPU.Controller == SNES_MULTIPLAYER5) + { + for (i = 0; i < 5; i++) + { + if (IPPU.Joypads [i]) + IPPU.Joypads [i] |= 0xffff0000; + } + } + + // Read mouse position if enabled + if (Settings.MouseMaster) + { + for (i = 0; i < 2; i++) + S9xProcessMouse (i); + } + + // Read SuperScope if enabled + if (Settings.SuperScopeMaster) + ProcessSuperScope (); + + if (CMemory_FillRAM [0x4200] & 1) + { + PPU.Joypad1ButtonReadPos = 16; + if (CMemory_FillRAM [0x4201] & 0x80) + { + PPU.Joypad2ButtonReadPos = 16; + PPU.Joypad3ButtonReadPos = 0; + } + else + { + PPU.Joypad2ButtonReadPos = 0; + PPU.Joypad3ButtonReadPos = 16; + } + int ind = Settings.SwapJoypads ? 1 : 0; + + CMemory_FillRAM [0x4218] = (uint8) IPPU.Joypads [ind]; + CMemory_FillRAM [0x4219] = (uint8) (IPPU.Joypads [ind] >> 8); + CMemory_FillRAM [0x421a] = (uint8) IPPU.Joypads [ind ^ 1]; + CMemory_FillRAM [0x421b] = (uint8) (IPPU.Joypads [ind ^ 1] >> 8); + if (CMemory_FillRAM [0x4201] & 0x80) + { + CMemory_FillRAM [0x421c] = (uint8) IPPU.Joypads [ind]; + CMemory_FillRAM [0x421d] = (uint8) (IPPU.Joypads [ind] >> 8); + CMemory_FillRAM [0x421e] = (uint8) IPPU.Joypads [2]; + CMemory_FillRAM [0x421f] = (uint8) (IPPU.Joypads [2] >> 8); + } + else + { + CMemory_FillRAM [0x421c] = (uint8) IPPU.Joypads [3]; + CMemory_FillRAM [0x421d] = (uint8) (IPPU.Joypads [3] >> 8); + CMemory_FillRAM [0x421e] = (uint8) IPPU.Joypads [4]; + CMemory_FillRAM [0x421f] = (uint8) (IPPU.Joypads [4] >> 8); + } + } + if(Settings.Justifier||Settings.SecondJustifier) + { + CMemory_FillRAM [0x421a] = 0x0E; + CMemory_FillRAM [0x421b] = 0; + S9xUpdateJustifiers(); + } + +} + +#ifndef ZSNES_FX +void S9xSuperFXExec () +{ +//printf("FX:%i (%i)\n",Settings.SuperFX,(unsigned)&Settings.SuperFX-(unsigned)&Settings); +#if 1 + if (Settings.SuperFX) + { + if ((CMemory_FillRAM [0x3000 + GSU_SFR] & FLG_G) && + (CMemory_FillRAM [0x3000 + GSU_SCMR] & 0x18) == 0x18) + { + if (!Settings.WinterGold||Settings.StarfoxHack) + FxEmulate (~0); + else + FxEmulate ((CMemory_FillRAM [0x3000 + GSU_CLSR] & 1) ? 700 : 350); + int GSUStatus = CMemory_FillRAM [0x3000 + GSU_SFR] | + (CMemory_FillRAM [0x3000 + GSU_SFR + 1] << 8); + if ((GSUStatus & (FLG_G | FLG_IRQ)) == FLG_IRQ) + { + // Trigger a GSU IRQ. + S9xSetIRQ (GSU_IRQ_SOURCE); + } + } + } +#else + uint32 tmp = (CMemory_FillRAM[0x3034] << 16) + *(uint16 *) &CMemory_FillRAM [0x301e]; + +#if 0 + if (tmp == 0x018428) + { + *(uint16 *) &SRAM [0x0064] = 0xbc00; + *(uint16 *) &SRAM [0x002c] = 0x8000; + } +#endif + if (tmp == -1)//0x018428) //0x01bfc3) //0x09edaf) //-1) //0x57edaf) + { + while (CMemory_FillRAM [0x3030] & 0x20) + { + int i; + int32 vError; + uint8 avReg[0x40]; + char tmp[128]; + uint8 vPipe; + uint8 vColr; + uint8 vPor; + + FxPipeString (tmp); + /* Make the string 32 chars long */ + if(strlen(tmp) < 32) { memset(&tmp[strlen(tmp)],' ',32-strlen(tmp)); tmp[32] = 0; } + + /* Copy registers (so we can see if any changed) */ + vColr = FxGetColorRegister(); + vPor = FxGetPlotOptionRegister(); + memcpy(avReg,SuperFX.pvRegisters,0x40); + + /* Print the pipe string */ + printf(tmp); + + /* Execute the instruction in the pipe */ + vPipe = FxPipe(); + vError = FxEmulate(1); + + /* Check if any registers changed (and print them if they did) */ + for(i=0; i<16; i++) + { + uint32 a = 0; + uint32 r1 = ((uint32)avReg[i<<1]) | (((uint32)avReg[(i<<1)+1])<<8); + uint32 r2 = (uint32)(SuperFX.pvRegisters[i<<1]) | (((uint32)SuperFX.pvRegisters[(i<<1)+1])<<8); + if(i==15) + a = OPCODE_BYTES(vPipe); + if(((r1+a)&0xffff) != r2) + printf(" r%d=$%04x",i,r2); + } + { + /* Check SFR */ + uint32 r1 = ((uint32)avReg[0x30]) | (((uint32)avReg[0x31])<<8); + uint32 r2 = (uint32)(SuperFX.pvRegisters[0x30]) | (((uint32)SuperFX.pvRegisters[0x31])<<8); + if((r1&(1<<1)) != (r2&(1<<1))) + printf(" Z=%d",(uint32)(!!(r2&(1<<1)))); + if((r1&(1<<2)) != (r2&(1<<2))) + printf(" CY=%d",(uint32)(!!(r2&(1<<2)))); + if((r1&(1<<3)) != (r2&(1<<3))) + printf(" S=%d",(uint32)(!!(r2&(1<<3)))); + if((r1&(1<<4)) != (r2&(1<<4))) + printf(" OV=%d",(uint32)(!!(r2&(1<<4)))); + if((r1&(1<<5)) != (r2&(1<<5))) + printf(" G=%d",(uint32)(!!(r2&(1<<5)))); + if((r1&(1<<6)) != (r2&(1<<6))) + printf(" R=%d",(uint32)(!!(r2&(1<<6)))); + if((r1&(1<<8)) != (r2&(1<<8))) + printf(" ALT1=%d",(uint32)(!!(r2&(1<<8)))); + if((r1&(1<<9)) != (r2&(1<<9))) + printf(" ALT2=%d",(uint32)(!!(r2&(1<<9)))); + if((r1&(1<<10)) != (r2&(1<<10))) + printf(" IL=%d",(uint32)(!!(r2&(1<<10)))); + if((r1&(1<<11)) != (r2&(1<<11))) + printf(" IH=%d",(uint32)(!!(r2&(1<<11)))); + if((r1&(1<<12)) != (r2&(1<<12))) + printf(" B=%d",(uint32)(!!(r2&(1<<12)))); + if((r1&(1<<15)) != (r2&(1<<15))) + printf(" IRQ=%d",(uint32)(!!(r2&(1<<15)))); + } + { + /* Check PBR */ + uint32 r1 = ((uint32)avReg[0x34]); + uint32 r2 = (uint32)(SuperFX.pvRegisters[0x34]); + if(r1 != r2) + printf(" PBR=$%02x",r2); + } + { + /* Check ROMBR */ + uint32 r1 = ((uint32)avReg[0x36]); + uint32 r2 = (uint32)(SuperFX.pvRegisters[0x36]); + if(r1 != r2) + printf(" ROMBR=$%02x",r2); + } + { + /* Check RAMBR */ + uint32 r1 = ((uint32)avReg[0x3c]); + uint32 r2 = (uint32)(SuperFX.pvRegisters[0x3c]); + if(r1 != r2) + printf(" RAMBR=$%02x",r2); + } + { + /* Check CBR */ + uint32 r1 = ((uint32)avReg[0x3e]) | (((uint32)avReg[0x3f])<<8); + uint32 r2 = (uint32)(SuperFX.pvRegisters[0x3e]) | (((uint32)SuperFX.pvRegisters[0x3f])<<8); + if(r1 != r2) + printf(" CBR=$%04x",r2); + } + { + /* Check COLR */ + if(vColr != FxGetColorRegister()) + printf(" COLR=$%02x",FxGetColorRegister()); + } + { + /* Check POR */ + if(vPor != FxGetPlotOptionRegister()) + printf(" POR=$%02x",FxGetPlotOptionRegister()); + } + printf ("\n"); + } + S9xExit (); + } + else + { + uint32 t = (CMemory_FillRAM [0x3034] << 16) + + (CMemory_FillRAM [0x301f] << 8) + + (CMemory_FillRAM [0x301e] << 0); + +printf ("%06x: %d\n", t, FxEmulate (2000000)); +// FxEmulate (2000000); + } +#if 0 + if (!(CPU.Flags & TRACE_FLAG)) + { + static int z = 1; + if (z == 0) + { + extern FILE *trace; + CPU.Flags |= TRACE_FLAG; + trace = fopen ("trace.log", "wb"); + } + else + z--; + } +#endif + CMemory_FillRAM [0x3030] &= ~0x20; + if (CMemory_FillRAM [0x3031] & 0x80) + { + S9xSetIRQ (GSU_IRQ_SOURCE); + } +#endif +} +#endif + diff --git a/src/sa1.cpp b/src/sa1.cpp new file mode 100644 index 0000000..a974a45 --- /dev/null +++ b/src/sa1.cpp @@ -0,0 +1,929 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +#include "ppu.h" +#include "cpuexec.h" + +#include "sa1.h" + +static void S9xSA1CharConv2 (); +static void S9xSA1DMA (); +static void S9xSA1ReadVariableLengthData (bool8 inc, bool8 no_shift); + +void S9xSA1Init () +{ + SA1.NMIActive = FALSE; + SA1.IRQActive = FALSE; + SA1.WaitingForInterrupt = FALSE; + SA1.Waiting = FALSE; + SA1.Flags = 0; + SA1.Executing = FALSE; + memset (&CMemory_FillRAM [0x2200], 0, 0x200); + CMemory_FillRAM [0x2200] = 0x20; + CMemory_FillRAM [0x2220] = 0x00; + CMemory_FillRAM [0x2221] = 0x01; + CMemory_FillRAM [0x2222] = 0x02; + CMemory_FillRAM [0x2223] = 0x03; + CMemory_FillRAM [0x2228] = 0xff; + SA1.op1 = 0; + SA1.op2 = 0; + SA1.arithmetic_op = 0; + SA1.sum = 0; + SA1.overflow = FALSE; + SA1.S9xOpcodes=NULL; +} + +void S9xSA1Reset () +{ + SA1Registers.PB = 0; + SA1Registers.PC = CMemory_FillRAM [0x2203] | + (CMemory_FillRAM [0x2204] << 8); + SA1Registers.D.W = 0; + SA1Registers.DB = 0; + SA1Registers.SH = 1; + SA1Registers.SL = 0xFF; + SA1Registers.XH = 0; + SA1Registers.YH = 0; + SA1Registers.P.W = 0; + + SA1.ShiftedPB = 0; + SA1.ShiftedDB = 0; + SA1SetFlags (MemoryFlag | IndexFlag | IRQ | Emulation); + SA1ClearFlags (Decimal); + + SA1.WaitingForInterrupt = FALSE; + SA1.PC = NULL; + SA1.PCBase = NULL; + S9xSA1SetPCBase (SA1Registers.PC); + SA1.S9xOpcodes = S9xSA1OpcodesM1X1; + + S9xSA1UnpackStatus(); + S9xSA1FixCycles (); + SA1.Executing = TRUE; + SA1.BWRAM = CMemory_SRAM; + CMemory_FillRAM [0x2225] = 0; +} + +void S9xSA1SetBWRAMMemMap (uint8 val) +{ + int c; + + if (val & 0x80) + { + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 6] = SA1.Map [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM_BITMAP2; + SA1.Map [c + 7] = SA1.Map [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM_BITMAP2; + SA1.WriteMap [c + 6] = SA1.WriteMap [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM_BITMAP2; + SA1.WriteMap [c + 7] = SA1.WriteMap [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM_BITMAP2; + } + SA1.BWRAM = CMemory_SRAM + (val & 0x7f) * 0x2000 / 4; + } + else + { + for (c = 0; c < 0x400; c += 16) + { + SA1.Map [c + 6] = SA1.Map [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM; + SA1.Map [c + 7] = SA1.Map [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM; + SA1.WriteMap [c + 6] = SA1.WriteMap [c + 0x806] = (uint8 *) CMemory_MAP_BWRAM; + SA1.WriteMap [c + 7] = SA1.WriteMap [c + 0x807] = (uint8 *) CMemory_MAP_BWRAM; + } + SA1.BWRAM = CMemory_SRAM + (val & 7) * 0x2000; + } +} + +void S9xFixSA1AfterSnapshotLoad () +{ + SA1.ShiftedPB = (uint32) SA1Registers.PB << 16; + SA1.ShiftedDB = (uint32) SA1Registers.DB << 16; + + S9xSA1SetPCBase (SA1.ShiftedPB + SA1Registers.PC); + S9xSA1UnpackStatus (); + S9xSA1FixCycles (); + SA1.VirtualBitmapFormat = (CMemory_FillRAM [0x223f] & 0x80) ? 2 : 4; + CMemory_BWRAM = CMemory_SRAM + (CMemory_FillRAM [0x2224] & 7) * 0x2000; + S9xSA1SetBWRAMMemMap (CMemory_FillRAM [0x2225]); + + SA1.Waiting = (CMemory_FillRAM [0x2200] & 0x60) != 0; + SA1.Executing = !SA1.Waiting; +} + +uint8 S9xSA1GetByte (uint32 address) +{ + uint8 *GetAddress = SA1.Map [(address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) + return (*(GetAddress + (address & 0xffff))); + + switch ((int) GetAddress) + { + case CMemory_MAP_PPU: + return (S9xGetSA1 (address & 0xffff)); + case CMemory_MAP_LOROM_SRAM: + case CMemory_MAP_SA1RAM: + return (*(CMemory_SRAM + (address & 0xffff))); + case CMemory_MAP_BWRAM: + return (*(SA1.BWRAM + ((address & 0x7fff) - 0x6000))); + case CMemory_MAP_BWRAM_BITMAP: + address -= 0x600000; + if (SA1.VirtualBitmapFormat == 2) + return ((CMemory_SRAM [(address >> 2) & 0xffff] >> ((address & 3) << 1)) & 3); + else + return ((CMemory_SRAM [(address >> 1) & 0xffff] >> ((address & 1) << 2)) & 15); + case CMemory_MAP_BWRAM_BITMAP2: + address = (address & 0xffff) - 0x6000; + if (SA1.VirtualBitmapFormat == 2) + return ((SA1.BWRAM [(address >> 2) & 0xffff] >> ((address & 3) << 1)) & 3); + else + return ((SA1.BWRAM [(address >> 1) & 0xffff] >> ((address & 1) << 2)) & 15); + + default: + return OpenBus; + } +} + +uint16 S9xSA1GetWord (uint32 address) +{ + OpenBus = S9xSA1GetByte (address); + return (OpenBus | (S9xSA1GetByte (address + 1) << 8)); +} + +void S9xSA1SetByte (uint8 byte, uint32 address) +{ + uint8 *Setaddress = SA1.WriteMap [(address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + + if (Setaddress >= (uint8 *) CMemory_MAP_LAST) + { + *(Setaddress + (address & 0xffff)) = byte; + return; + } + + switch ((int) Setaddress) + { + case CMemory_MAP_PPU: + S9xSetSA1 (byte, address & 0xffff); + return; + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + *(CMemory_SRAM + (address & 0xffff)) = byte; + return; + case CMemory_MAP_BWRAM: + *(SA1.BWRAM + ((address & 0x7fff) - 0x6000)) = byte; + return; + case CMemory_MAP_BWRAM_BITMAP: + address -= 0x600000; + if (SA1.VirtualBitmapFormat == 2) + { + uint8 *ptr = &CMemory_SRAM [(address >> 2) & 0xffff]; + *ptr &= ~(3 << ((address & 3) << 1)); + *ptr |= (byte & 3) << ((address & 3) << 1); + } + else + { + uint8 *ptr = &CMemory_SRAM [(address >> 1) & 0xffff]; + *ptr &= ~(15 << ((address & 1) << 2)); + *ptr |= (byte & 15) << ((address & 1) << 2); + } + break; + case CMemory_MAP_BWRAM_BITMAP2: + address = (address & 0xffff) - 0x6000; + if (SA1.VirtualBitmapFormat == 2) + { + uint8 *ptr = &SA1.BWRAM [(address >> 2) & 0xffff]; + *ptr &= ~(3 << ((address & 3) << 1)); + *ptr |= (byte & 3) << ((address & 3) << 1); + } + else + { + uint8 *ptr = &SA1.BWRAM [(address >> 1) & 0xffff]; + *ptr &= ~(15 << ((address & 1) << 2)); + *ptr |= (byte & 15) << ((address & 1) << 2); + } + default: + return; + } +} + +void S9xSA1SetWord (uint16 Word, uint32 address) +{ + S9xSA1SetByte ((uint8) Word, address); + S9xSA1SetByte ((uint8) (Word >> 8), address + 1); +} + +void S9xSA1SetPCBase (uint32 address) +{ + uint8 *GetAddress = SA1.Map [(address >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (GetAddress >= (uint8 *) CMemory_MAP_LAST) + { + SA1.PCBase = GetAddress; + SA1.PC = GetAddress + (address & 0xffff); + return; + } + + switch ((int) GetAddress) + { + case CMemory_MAP_PPU: + SA1.PCBase = CMemory_FillRAM - 0x2000; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + + case CMemory_MAP_CPU: + SA1.PCBase = CMemory_FillRAM - 0x4000; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + + case CMemory_MAP_DSP: + SA1.PCBase = CMemory_FillRAM - 0x6000; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + + case CMemory_MAP_SA1RAM: + case CMemory_MAP_LOROM_SRAM: + SA1.PCBase = CMemory_SRAM; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + + case CMemory_MAP_BWRAM: + SA1.PCBase = SA1.BWRAM - 0x6000; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + case CMemory_MAP_HIROM_SRAM: + SA1.PCBase = CMemory_SRAM - 0x6000; + SA1.PC = SA1.PCBase + (address & 0xffff); + return; + + default: + case CMemory_MAP_NONE: + SA1.PCBase = CMemory_RAM; + SA1.PC = CMemory_RAM + (address & 0xffff); + return; + } +} + +void S9xSA1ExecuteDuringSleep () +{ +#if 0 + if (SA1.Executing) + { + while (CPU.Cycles < CPU.NextEvent) + { + S9xSA1MainLoop (); + CPU.Cycles += TWO_CYCLES * 2; + } + } +#endif +} + +void S9xSetSA1MemMap (uint32 which1, uint8 map) +{ + int c; + int start = which1 * 0x100 + 0xc00; + int start2 = which1 * 0x200; + + if (which1 >= 2) + start2 += 0x400; + + for (c = 0; c < 0x100; c += 16) + { + uint8 *block = &CMemory_ROM [(map & 7) * 0x100000 + (c << 12)]; + int i; + + for (i = c; i < c + 16; i++) + CMemory_Map [start + i] = SA1.Map [start + i] = block; + } + + for (c = 0; c < 0x200; c += 16) + { + uint8 *block = &CMemory_ROM [(map & 7) * 0x100000 + (c << 11) - 0x8000]; + int i; + + for (i = c + 8; i < c + 16; i++) + CMemory_Map [start2 + i] = SA1.Map [start2 + i] = block; + } +} + +uint8 S9xGetSA1 (uint32 address) +{ +// printf ("R: %04x\n", address); + switch (address) + { + case 0x2300: + return ((uint8) ((CMemory_FillRAM [0x2209] & 0x5f) | + (CPU.IRQActive & (SA1_IRQ_SOURCE | SA1_DMA_IRQ_SOURCE)))); + case 0x2301: + return ((CMemory_FillRAM [0x2200] & 0xf) | + (CMemory_FillRAM [0x2301] & 0xf0)); + case 0x2306: + return ((uint8) SA1.sum); + case 0x2307: + return ((uint8) (SA1.sum >> 8)); + case 0x2308: + return ((uint8) (SA1.sum >> 16)); + case 0x2309: + return ((uint8) (SA1.sum >> 24)); + case 0x230a: + return ((uint8) (SA1.sum >> 32)); + case 0x230c: + return (CMemory_FillRAM [0x230c]); + case 0x230d: + { + uint8 byte = CMemory_FillRAM [0x230d]; + + if (CMemory_FillRAM [0x2258] & 0x80) + { + S9xSA1ReadVariableLengthData (TRUE, FALSE); + } + return (byte); + } + default: +// printf ("R: %04x\n", address); + break; + } + return (CMemory_FillRAM [address]); +} + +void S9xSetSA1 (uint8 byte, uint32 address) +{ +//printf ("W: %02x -> %04x\n", byte, address); + switch (address) + { + case 0x2200: + SA1.Waiting = (byte & 0x60) != 0; +// SA1.Executing = !SA1.Waiting && SA1.S9xOpcodes; + + if (!(byte & 0x20) && (CMemory_FillRAM [0x2200] & 0x20)) + { + S9xSA1Reset (); + } + if (byte & 0x80) + { + CMemory_FillRAM [0x2301] |= 0x80; + if (CMemory_FillRAM [0x220a] & 0x80) + { + SA1.Flags |= IRQ_PENDING_FLAG; + SA1.IRQActive |= SNES_IRQ_SOURCE; + SA1.Executing = !SA1.Waiting && SA1.S9xOpcodes; + } + } + if (byte & 0x10) + { + CMemory_FillRAM [0x2301] |= 0x10; + if (CMemory_FillRAM [0x220a] & 0x10) + { + } + } + break; + + case 0x2201: + if (((byte ^ CMemory_FillRAM [0x2201]) & 0x80) && + (CMemory_FillRAM [0x2300] & byte & 0x80)) + { + S9xSetIRQ (SA1_IRQ_SOURCE); + } + if (((byte ^ CMemory_FillRAM [0x2201]) & 0x20) && + (CMemory_FillRAM [0x2300] & byte & 0x20)) + { + S9xSetIRQ (SA1_DMA_IRQ_SOURCE); + } + break; + case 0x2202: + if (byte & 0x80) + { + CMemory_FillRAM [0x2300] &= ~0x80; + S9xClearIRQ (SA1_IRQ_SOURCE); + } + if (byte & 0x20) + { + CMemory_FillRAM [0x2300] &= ~0x20; + S9xClearIRQ (SA1_DMA_IRQ_SOURCE); + } + break; + case 0x2203: +// printf ("SA1 reset vector: %04x\n", byte | (CMemory_FillRAM [0x2204] << 8)); + break; + case 0x2204: +// printf ("SA1 reset vector: %04x\n", (byte << 8) | CMemory_FillRAM [0x2203]); + break; + + case 0x2205: +// printf ("SA1 NMI vector: %04x\n", byte | (CMemory_FillRAM [0x2206] << 8)); + break; + case 0x2206: +// printf ("SA1 NMI vector: %04x\n", (byte << 8) | CMemory_FillRAM [0x2205]); + break; + + case 0x2207: +// printf ("SA1 IRQ vector: %04x\n", byte | (CMemory_FillRAM [0x2208] << 8)); + break; + case 0x2208: +// printf ("SA1 IRQ vector: %04x\n", (byte << 8) | CMemory_FillRAM [0x2207]); + break; + + case 0x2209: + CMemory_FillRAM [0x2209] = byte; + if (byte & 0x80) + CMemory_FillRAM [0x2300] |= 0x80; + + if (byte & CMemory_FillRAM [0x2201] & 0x80) + { + S9xSetIRQ (SA1_IRQ_SOURCE); + } + break; + case 0x220a: + if (((byte ^ CMemory_FillRAM [0x220a]) & 0x80) && + (CMemory_FillRAM [0x2301] & byte & 0x80)) + { + SA1.Flags |= IRQ_PENDING_FLAG; + SA1.IRQActive |= SNES_IRQ_SOURCE; +// SA1.Executing = !SA1.Waiting; + } + if (((byte ^ CMemory_FillRAM [0x220a]) & 0x40) && + (CMemory_FillRAM [0x2301] & byte & 0x40)) + { + SA1.Flags |= IRQ_PENDING_FLAG; + SA1.IRQActive |= TIMER_IRQ_SOURCE; +// SA1.Executing = !SA1.Waiting; + } + if (((byte ^ CMemory_FillRAM [0x220a]) & 0x20) && + (CMemory_FillRAM [0x2301] & byte & 0x20)) + { + SA1.Flags |= IRQ_PENDING_FLAG; + SA1.IRQActive |= DMA_IRQ_SOURCE; +// SA1.Executing = !SA1.Waiting; + } + /* + if (((byte ^ CMemory_FillRAM [0x220a]) & 0x10) && + (CMemory_FillRAM [0x2301] & byte & 0x10)) + { + }*/ + break; + case 0x220b: + if (byte & 0x80) + { + SA1.IRQActive &= ~SNES_IRQ_SOURCE; + CMemory_FillRAM [0x2301] &= ~0x80; + } + if (byte & 0x40) + { + SA1.IRQActive &= ~TIMER_IRQ_SOURCE; + CMemory_FillRAM [0x2301] &= ~0x40; + } + if (byte & 0x20) + { + SA1.IRQActive &= ~DMA_IRQ_SOURCE; + CMemory_FillRAM [0x2301] &= ~0x20; + } + if (byte & 0x10) + { + // Clear NMI + CMemory_FillRAM [0x2301] &= ~0x10; + } + if (!SA1.IRQActive) + SA1.Flags &= ~IRQ_PENDING_FLAG; + break; + case 0x220c: +// printf ("SNES NMI vector: %04x\n", byte | (CMemory_FillRAM [0x220d] << 8)); + break; + case 0x220d: +// printf ("SNES NMI vector: %04x\n", (byte << 8) | CMemory_FillRAM [0x220c]); + break; + + case 0x220e: +// printf ("SNES IRQ vector: %04x\n", byte | (CMemory_FillRAM [0x220f] << 8)); + break; + case 0x220f: +// printf ("SNES IRQ vector: %04x\n", (byte << 8) | CMemory_FillRAM [0x220e]); + break; + + case 0x2210: +#if 0 + printf ("Timer %s\n", (byte & 0x80) ? "linear" : "HV"); + printf ("Timer H-IRQ %s\n", (byte & 1) ? "enabled" : "disabled"); + printf ("Timer V-IRQ %s\n", (byte & 2) ? "enabled" : "disabled"); +#endif + break; + case 0x2211: +// printf ("Timer reset\n"); + break; + case 0x2212: +// printf ("H-Timer %04x\n", byte | (CMemory_FillRAM [0x2213] << 8)); + break; + case 0x2213: +// printf ("H-Timer %04x\n", (byte << 8) | CMemory_FillRAM [0x2212]); + break; + case 0x2214: +// printf ("V-Timer %04x\n", byte | (CMemory_FillRAM [0x2215] << 8)); + break; + case 0x2215: +// printf ("V-Timer %04x\n", (byte << 8) | CMemory_FillRAM [0x2214]); + break; + case 0x2220: + case 0x2221: + case 0x2222: + case 0x2223: + S9xSetSA1MemMap (address - 0x2220, byte); +// printf ("MMC: %02x\n", byte); + break; + case 0x2224: +// printf ("BWRAM image SNES %02x -> 0x6000\n", byte); + CMemory_BWRAM = CMemory_SRAM + (byte & 7) * 0x2000; + break; + case 0x2225: +// printf ("BWRAM image SA1 %02x -> 0x6000 (%02x)\n", byte, CMemory_FillRAM [address]); + if (byte != CMemory_FillRAM [address]) + S9xSA1SetBWRAMMemMap (byte); + break; + case 0x2226: +// printf ("BW-RAM SNES write %s\n", (byte & 0x80) ? "enabled" : "disabled"); + break; + case 0x2227: +// printf ("BW-RAM SA1 write %s\n", (byte & 0x80) ? "enabled" : "disabled"); + break; + + case 0x2228: +// printf ("BW-RAM write protect area %02x\n", byte); + break; + case 0x2229: +// printf ("I-RAM SNES write protect area %02x\n", byte); + break; + case 0x222a: +// printf ("I-RAM SA1 write protect area %02x\n", byte); + break; + case 0x2230: +#if 0 + printf ("SA1 DMA %s\n", (byte & 0x80) ? "enabled" : "disabled"); + printf ("DMA priority %s\n", (byte & 0x40) ? "DMA" : "SA1"); + printf ("DMA %s\n", (byte & 0x20) ? "char conv" : "normal"); + printf ("DMA type %s\n", (byte & 0x10) ? "BW-RAM -> I-RAM" : "SA1 -> I-RAM"); + printf ("DMA distination %s\n", (byte & 4) ? "BW-RAM" : "I-RAM"); + printf ("DMA source %s\n", DMAsource [byte & 3]); +#endif + break; + case 0x2231: + if (byte & 0x80) + SA1.in_char_dma = FALSE; +#if 0 + printf ("CHDEND %s\n", (byte & 0x80) ? "complete" : "incomplete"); + printf ("DMA colour mode %d\n", byte & 3); + printf ("virtual VRAM width %d\n", (byte >> 2) & 7); +#endif + break; + case 0x2232: + case 0x2233: + case 0x2234: + CMemory_FillRAM [address] = byte; +#if 0 + printf ("DMA source start %06x\n", + CMemory_FillRAM [0x2232] | (CMemory_FillRAM [0x2233] << 8) | + (CMemory_FillRAM [0x2234] << 16)); +#endif + break; + case 0x2235: + CMemory_FillRAM [address] = byte; + break; + case 0x2236: + CMemory_FillRAM [address] = byte; + if ((CMemory_FillRAM [0x2230] & 0xa4) == 0x80) + { + // Normal DMA to I-RAM + S9xSA1DMA (); + } + else + if ((CMemory_FillRAM [0x2230] & 0xb0) == 0xb0) + { + CMemory_FillRAM [0x2300] |= 0x20; + if (CMemory_FillRAM [0x2201] & 0x20) + S9xSetIRQ (SA1_DMA_IRQ_SOURCE); + SA1.in_char_dma = TRUE; + } + break; + case 0x2237: + CMemory_FillRAM [address] = byte; + if ((CMemory_FillRAM [0x2230] & 0xa4) == 0x84) + { + // Normal DMA to BW-RAM + S9xSA1DMA (); + } +#if 0 + printf ("DMA dest address %06x\n", + CMemory_FillRAM [0x2235] | (CMemory_FillRAM [0x2236] << 8) | + (CMemory_FillRAM [0x2237] << 16)); +#endif + break; + case 0x2238: + case 0x2239: + CMemory_FillRAM [address] = byte; +#if 0 + printf ("DMA length %04x\n", + CMemory_FillRAM [0x2238] | (CMemory_FillRAM [0x2239] << 8)); +#endif + break; + case 0x223f: + SA1.VirtualBitmapFormat = (byte & 0x80) ? 2 : 4; + //printf ("virtual VRAM depth %d\n", (byte & 0x80) ? 2 : 4); + break; + + case 0x2240: case 0x2241: case 0x2242: case 0x2243: + case 0x2244: case 0x2245: case 0x2246: case 0x2247: + case 0x2248: case 0x2249: case 0x224a: case 0x224b: + case 0x224c: case 0x224d: case 0x224e: +#if 0 + if (!(SA1.Flags & TRACE_FLAG)) + { + TraceSA1 (); + Trace (); + } +#endif + CMemory_FillRAM [address] = byte; + break; + + case 0x224f: + CMemory_FillRAM [address] = byte; + if ((CMemory_FillRAM [0x2230] & 0xb0) == 0xa0) + { + // Char conversion 2 DMA enabled + memmove (&CMemory_ROM [CMemory_MAX_ROM_SIZE - 0x10000] + SA1.in_char_dma * 16, + &CMemory_FillRAM [0x2240], 16); + SA1.in_char_dma = (SA1.in_char_dma + 1) & 7; + if ((SA1.in_char_dma & 3) == 0) + { + S9xSA1CharConv2 (); + } + } + break; + case 0x2250: + if (byte & 2) + SA1.sum = 0; + SA1.arithmetic_op = byte & 3; + break; + + case 0x2251: + SA1.op1 = (SA1.op1 & 0xff00) | byte; + break; + case 0x2252: + SA1.op1 = (SA1.op1 & 0xff) | (byte << 8); + break; + case 0x2253: + SA1.op2 = (SA1.op2 & 0xff00) | byte; + break; + case 0x2254: + SA1.op2 = (SA1.op2 & 0xff) | (byte << 8); + switch (SA1.arithmetic_op) + { + case 0: // multiply + SA1.sum = SA1.op1 * SA1.op2; + break; + case 1: // divide + if (SA1.op2 == 0) + SA1.sum = SA1.op1 << 16; + else + { + SA1.sum = (SA1.op1 / (int) ((uint16) SA1.op2)) | + ((SA1.op1 % (int) ((uint16) SA1.op2)) << 16); + } + break; + case 2: + default: // cumulative sum + SA1.sum += SA1.op1 * SA1.op2; + if (SA1.sum & ((int64) 0xffffff << 32)) + SA1.overflow = TRUE; + break; + } + break; + case 0x2258: // Variable bit-field length/auto inc/start. + CMemory_FillRAM [0x2258] = byte; + S9xSA1ReadVariableLengthData (TRUE, FALSE); + return; + case 0x2259: + case 0x225a: + case 0x225b: // Variable bit-field start address + CMemory_FillRAM [address] = byte; + // XXX: ??? + SA1.variable_bit_pos = 0; + S9xSA1ReadVariableLengthData (FALSE, TRUE); + return; + default: +// printf ("W: %02x->%04x\n", byte, address); + break; + } + if (address >= 0x2200 && address <= 0x22ff) + CMemory_FillRAM [address] = byte; +} + +static void S9xSA1CharConv2 () +{ + uint32 dest = CMemory_FillRAM [0x2235] | (CMemory_FillRAM [0x2236] << 8); + uint32 offset = (SA1.in_char_dma & 7) ? 0 : 1; + int depth = (CMemory_FillRAM [0x2231] & 3) == 0 ? 8 : + (CMemory_FillRAM [0x2231] & 3) == 1 ? 4 : 2; + int bytes_per_char = 8 * depth; + uint8 *p = &CMemory_FillRAM [0x3000] + dest + offset * bytes_per_char; + uint8 *q = &CMemory_ROM [CMemory_MAX_ROM_SIZE - 0x10000] + offset * 64; + + switch (depth) + { + case 2: + break; + case 4: + break; + case 8: + for (int l = 0; l < 8; l++, q += 8) + { + for (int b = 0; b < 8; b++) + { + uint8 r = *(q + b); + *(p + 0) = (*(p + 0) << 1) | ((r >> 0) & 1); + *(p + 1) = (*(p + 1) << 1) | ((r >> 1) & 1); + *(p + 16) = (*(p + 16) << 1) | ((r >> 2) & 1); + *(p + 17) = (*(p + 17) << 1) | ((r >> 3) & 1); + *(p + 32) = (*(p + 32) << 1) | ((r >> 4) & 1); + *(p + 33) = (*(p + 33) << 1) | ((r >> 5) & 1); + *(p + 48) = (*(p + 48) << 1) | ((r >> 6) & 1); + *(p + 49) = (*(p + 49) << 1) | ((r >> 7) & 1); + } + p += 2; + } + break; + } +} + +static void S9xSA1DMA () +{ + uint32 src = CMemory_FillRAM [0x2232] | + (CMemory_FillRAM [0x2233] << 8) | + (CMemory_FillRAM [0x2234] << 16); + uint32 dst = CMemory_FillRAM [0x2235] | + (CMemory_FillRAM [0x2236] << 8) | + (CMemory_FillRAM [0x2237] << 16); + uint32 len = CMemory_FillRAM [0x2238] | + (CMemory_FillRAM [0x2239] << 8); + + uint8 *s; + uint8 *d; + + switch (CMemory_FillRAM [0x2230] & 3) + { + case 0: // ROM + s = SA1.Map [(src >> MEMMAP_SHIFT) & MEMMAP_MASK]; + if (s >= (uint8 *) CMemory_MAP_LAST) + s += (src & 0xffff); + else + s = CMemory_ROM + (src & 0xffff); + break; + case 1: // BW-RAM + src &= CMemory_SRAMMask; + len &= CMemory_SRAMMask; + s = CMemory_SRAM + src; + break; + default: + case 2: + src &= 0x3ff; + len &= 0x3ff; + s = &CMemory_FillRAM [0x3000] + src; + break; + } + + if (CMemory_FillRAM [0x2230] & 4) + { + dst &= CMemory_SRAMMask; + len &= CMemory_SRAMMask; + d = CMemory_SRAM + dst; + } + else + { + dst &= 0x3ff; + len &= 0x3ff; + d = &CMemory_FillRAM [0x3000] + dst; + } + memmove (d, s, len); + CMemory_FillRAM [0x2301] |= 0x20; + + if (CMemory_FillRAM [0x220a] & 0x20) + { + SA1.Flags |= IRQ_PENDING_FLAG; + SA1.IRQActive |= DMA_IRQ_SOURCE; +// SA1.Executing = !SA1.Waiting; + } +} + +void S9xSA1ReadVariableLengthData (bool8 inc, bool8 no_shift) +{ + uint32 addr = CMemory_FillRAM [0x2259] | + (CMemory_FillRAM [0x225a] << 8) | + (CMemory_FillRAM [0x225b] << 16); + uint8 shift = CMemory_FillRAM [0x2258] & 15; + + if (no_shift) + shift = 0; + else + if (shift == 0) + shift = 16; + + uint8 s = shift + SA1.variable_bit_pos; + + if (s >= 16) + { + addr += (s >> 4) << 1; + s &= 15; + } + uint32 data = S9xSA1GetWord (addr) | + (S9xSA1GetWord (addr + 2) << 16); + + data >>= s; + CMemory_FillRAM [0x230c] = (uint8) data; + CMemory_FillRAM [0x230d] = (uint8) (data >> 8); + if (inc) + { + SA1.variable_bit_pos = (SA1.variable_bit_pos + shift) & 15; + CMemory_FillRAM [0x2259] = (uint8) addr; + CMemory_FillRAM [0x225a] = (uint8) (addr >> 8); + CMemory_FillRAM [0x225b] = (uint8) (addr >> 16); + } +} + diff --git a/src/sa1cpu.cpp b/src/sa1cpu.cpp new file mode 100644 index 0000000..e8e691c --- /dev/null +++ b/src/sa1cpu.cpp @@ -0,0 +1,186 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#include "snes9x.h" +#include "memmap.h" +#include "ppu.h" +#include "cpuexec.h" + +#include "snes4all.h" + +#include "sa1.h" +#define CPU SA1 +#define ICPU SA1 +#define Registers SA1Registers +#define S9xGetByte S9xSA1GetByte +#define S9xGetWord S9xSA1GetWord +#define S9xSetByte S9xSA1SetByte +#define S9xSetWord S9xSA1SetWord +#define S9xSetPCBase S9xSA1SetPCBase +#define S9xOpcodesM1X1 S9xSA1OpcodesM1X1 +#define S9xOpcodesM1X0 S9xSA1OpcodesM1X0 +#define S9xOpcodesM0X1 S9xSA1OpcodesM0X1 +#define S9xOpcodesM0X0 S9xSA1OpcodesM0X0 +#define S9xOpcodesE1 S9xSA1OpcodesE1 +#define S9xOpcode_IRQ S9xSA1Opcode_IRQ +#define S9xOpcode_NMI S9xSA1Opcode_NMI +#define S9xUnpackStatus S9xSA1UnpackStatus +#define S9xPackStatus S9xSA1PackStatus +#define S9xFixCycles S9xSA1FixCycles +#define Immediate8 SA1Immediate8 +#define Immediate16 SA1Immediate16 +#define Relative SA1Relative +#define RelativeLong SA1RelativeLong +#define AbsoluteIndexedIndirect SA1AbsoluteIndexedIndirect +#define AbsoluteIndirectLong SA1AbsoluteIndirectLong +#define AbsoluteIndirect SA1AbsoluteIndirect +#define Absolute SA1Absolute +#define AbsoluteLong SA1AbsoluteLong +#define Direct SA1Direct +#define DirectIndirectIndexed SA1DirectIndirectIndexed +#define DirectIndirectIndexedLong SA1DirectIndirectIndexedLong +#define DirectIndexedIndirect SA1DirectIndexedIndirect +#define DirectIndexedX SA1DirectIndexedX +#define DirectIndexedY SA1DirectIndexedY +#define AbsoluteIndexedX SA1AbsoluteIndexedX +#define AbsoluteIndexedY SA1AbsoluteIndexedY +#define AbsoluteLongIndexedX SA1AbsoluteLongIndexedX +#define DirectIndirect SA1DirectIndirect +#define DirectIndirectLong SA1DirectIndirectLong +#define StackRelative SA1StackRelative +#define StackRelativeIndirectIndexed SA1StackRelativeIndirectIndexed + +//#undef CPU_SHUTDOWN +#undef VAR_CYCLES +#define SA1_OPCODES + +#include "cpuops.cpp" + +void S9xSA1MainLoop () +{ +#if 0 + if (SA1.Flags & NMI_FLAG) + { + SA1.Flags &= ~NMI_FLAG; + if (SA1.WaitingForInterrupt) + { + SA1.WaitingForInterrupt = FALSE; + SA1.PC++; + } + S9xSA1Opcode_NMI (); + } +#endif + if (SA1.Flags & IRQ_PENDING_FLAG) + { + if (SA1.IRQActive) + { + if (SA1.WaitingForInterrupt) + { + SA1.WaitingForInterrupt = FALSE; + SA1.PC++; + } + if (!SA1CheckFlag (IRQ)) + S9xSA1Opcode_IRQ (); + } + else + SA1.Flags &= ~IRQ_PENDING_FLAG; + } + { +// unsigned timeslice=(snes4all_timeslice<<1)+3; +// while((timeslice--) && SA1.Executing) + for (unsigned i = 0; i < 3 && SA1.Executing; i++) + { +#ifdef CPU_SHUTDOWN + SA1.PCAtOpcodeStart = SA1.PC; +#endif + (*SA1.S9xOpcodes [*SA1.PC++].S9xOpcode) (); + } + } +} + diff --git a/src/screenshot.cpp b/src/screenshot.cpp new file mode 100644 index 0000000..e7d2b3b --- /dev/null +++ b/src/screenshot.cpp @@ -0,0 +1,218 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + + +#ifdef HAVE_CONFIG_H + #include +#endif +#include + +#ifndef __WIN32__ +#include +#else +#include +#endif +#include +#include + +#ifdef HAVE_LIBPNG +#include +#endif + +#include "snes9x.h" +#include "memmap.h" +#include "display.h" +#include "gfx.h" +#include "ppu.h" +#include "screenshot.h" + +bool8 S9xDoScreenshot(int width, int height){ +#ifdef HAVE_LIBPNG + FILE *fp; + png_structp png_ptr; + png_infop info_ptr; + png_color_8 sig_bit; + png_color pngpal[256]; + int imgwidth; + int imgheight; + const char *fname=S9xGetFilenameInc(".png"); + + Settings.TakeScreenshot=FALSE; + + if((fp=fopen(fname, "wb"))==NULL){ + perror("Screenshot failed"); + return FALSE; + } + + png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if(!png_ptr){ + fclose(fp); + unlink(fname); + return FALSE; + } + info_ptr=png_create_info_struct(png_ptr); + if(!info_ptr){ + png_destroy_write_struct(&png_ptr, (png_infopp)NULL); + fclose(fp); + unlink(fname); + return FALSE; + } + + if(setjmp(png_jmpbuf(png_ptr))){ + perror("Screenshot: setjmp"); + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + unlink(fname); + return FALSE; + } + + imgwidth=width; + imgheight=height; + if(Settings.StretchScreenshots==1){ + if(width<=256 && height>SNES_HEIGHT_EXTENDED) imgwidth=width<<1; + if(width>256 && height<=SNES_HEIGHT_EXTENDED) imgheight=height<<1; + } else if(Settings.StretchScreenshots==2){ + if(width<=256) imgwidth=width<<1; + if(height<=SNES_HEIGHT_EXTENDED) imgheight=height<<1; + } + + png_init_io(png_ptr, fp); + png_set_IHDR(png_ptr, info_ptr, imgwidth, imgheight, 8, + PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + + /* 5 bits per color */ + sig_bit.red=5; + sig_bit.green=5; + sig_bit.blue=5; + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + png_set_shift(png_ptr, &sig_bit); + + png_write_info(png_ptr, info_ptr); + + png_set_packing(png_ptr); + + png_byte *row_pointer=new png_byte [png_get_rowbytes(png_ptr, info_ptr)]; + uint8 *screen=GFX.Screen; + for(int y=0; y +#endif + +#ifdef USE_MMU +void set_mmu_mappings(); +static unsigned set_mmus=0; +#endif + +void S9xSetSDD1MemoryMap (uint32 bank, uint32 value) +{ +#ifdef USE_MMU + int changed=0; +#endif + bank = 0xc00 + bank * 0x100; + value = value * 1024 * 1024; + + int c; + + for (c = 0; c < 0x100; c += 16) + { + uint8 *block = &CMemory_ROM [value + (c << 12)]; + int i; + + for (i = c; i < c + 16; i++) +#ifdef USE_MMU + if (CMemory_Map [i + bank] != block) { + changed=1; +#endif + CMemory_Map [i + bank] = block; +#ifdef USE_MMU + } +#endif + } +#ifdef USE_MMU + if (changed) { + set_mmus++; + if (set_mmus<6) + set_mmu_mappings(); + } +#endif +} + +void S9xResetSDD1 () +{ +#ifdef USE_MMU + set_mmus=0; +#endif + memset (&CMemory_FillRAM [0x4800], 0, 4); + for (int i = 0; i < 4; i++) + { + CMemory_FillRAM [0x4804 + i] = i; + S9xSetSDD1MemoryMap (i, i); + } +} + +void S9xSDD1PostLoadState () +{ + for (int i = 0; i < 4; i++) + S9xSetSDD1MemoryMap (i, CMemory_FillRAM [0x4804 + i]); +} + +static int S9xCompareSDD1LoggedDataEntries (const void *p1, const void *p2) +{ + uint8 *b1 = (uint8 *) p1; + uint8 *b2 = (uint8 *) p2; + uint32 a1 = (*b1 << 16) + (*(b1 + 1) << 8) + *(b1 + 2); + uint32 a2 = (*b2 << 16) + (*(b2 + 1) << 8) + *(b2 + 2); + + return (a1 - a2); +} + +void S9xSDD1SaveLoggedData () +{ + if (CMemory_SDD1LoggedDataCount != CMemory_SDD1LoggedDataCountPrev) + { + qsort (CMemory_SDD1LoggedData, CMemory_SDD1LoggedDataCount, 8, + S9xCompareSDD1LoggedDataEntries); + + FILE *fs = fopen (S9xGetFilename (".dat"), "wb"); + + if (fs) + { + fwrite (CMemory_SDD1LoggedData, 8, + CMemory_SDD1LoggedDataCount, fs); + fclose (fs); +#if defined(__linux) + chown (S9xGetFilename (".dat"), getuid (), getgid ()); +#endif + } + CMemory_SDD1LoggedDataCountPrev = CMemory_SDD1LoggedDataCount; + } +} + +void S9xSDD1LoadLoggedData () +{ + FILE *fs = fopen (S9xGetFilename (".dat"), "rb"); + + CMemory_SDD1LoggedDataCount = CMemory_SDD1LoggedDataCountPrev = 0; + + if (fs) + { + int c = fread (CMemory_SDD1LoggedData, 8, + MEMMAP_MAX_SDD1_LOGGED_ENTRIES, fs); + + if (c != EOF) + CMemory_SDD1LoggedDataCount = CMemory_SDD1LoggedDataCountPrev = c; + fclose (fs); + } +} diff --git a/src/sdd1emu.cpp b/src/sdd1emu.cpp new file mode 100644 index 0000000..65dc69d --- /dev/null +++ b/src/sdd1emu.cpp @@ -0,0 +1,413 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +/* S-DD1 decompressor + * + * Based on code and documentation by Andreas Naive, who deserves a great deal + * of thanks and credit for figuring this out. + * + * Andreas says: + * The author is greatly indebted with The Dumper, without whose help and + * patience providing him with real S-DD1 data the research had never been + * possible. He also wish to note that in the very beggining of his research, + * Neviksti had done some steps in the right direction. By last, the author is + * indirectly indebted to all the people that worked and contributed in the + * S-DD1 issue in the past. + */ + +#include +#include "port.h" +#include "sdd1emu.h" + +static int valid_bits; +static uint16 in_stream; +static uint8 *in_buf; +static uint8 bit_ctr[8]; +static uint8 context_states[32]; +static int context_MPS[32]; +static int bitplane_type; +static int high_context_bits; +static int low_context_bits; +static int prev_bits[8]; + +static struct { + uint8 code_size; + uint8 MPS_next; + uint8 LPS_next; +} evolution_table[] = { + /* 0 */ { 0,25,25}, + /* 1 */ { 0, 2, 1}, + /* 2 */ { 0, 3, 1}, + /* 3 */ { 0, 4, 2}, + /* 4 */ { 0, 5, 3}, + /* 5 */ { 1, 6, 4}, + /* 6 */ { 1, 7, 5}, + /* 7 */ { 1, 8, 6}, + /* 8 */ { 1, 9, 7}, + /* 9 */ { 2,10, 8}, + /* 10 */ { 2,11, 9}, + /* 11 */ { 2,12,10}, + /* 12 */ { 2,13,11}, + /* 13 */ { 3,14,12}, + /* 14 */ { 3,15,13}, + /* 15 */ { 3,16,14}, + /* 16 */ { 3,17,15}, + /* 17 */ { 4,18,16}, + /* 18 */ { 4,19,17}, + /* 19 */ { 5,20,18}, + /* 20 */ { 5,21,19}, + /* 21 */ { 6,22,20}, + /* 22 */ { 6,23,21}, + /* 23 */ { 7,24,22}, + /* 24 */ { 7,24,23}, + /* 25 */ { 0,26, 1}, + /* 26 */ { 1,27, 2}, + /* 27 */ { 2,28, 4}, + /* 28 */ { 3,29, 8}, + /* 29 */ { 4,30,12}, + /* 30 */ { 5,31,16}, + /* 31 */ { 6,32,18}, + /* 32 */ { 7,24,22} +}; + +static uint8 run_table[128] = { + 128, 64, 96, 32, 112, 48, 80, 16, 120, 56, 88, 24, 104, 40, 72, + 8, 124, 60, 92, 28, 108, 44, 76, 12, 116, 52, 84, 20, 100, 36, + 68, 4, 126, 62, 94, 30, 110, 46, 78, 14, 118, 54, 86, 22, 102, + 38, 70, 6, 122, 58, 90, 26, 106, 42, 74, 10, 114, 50, 82, 18, + 98, 34, 66, 2, 127, 63, 95, 31, 111, 47, 79, 15, 119, 55, 87, + 23, 103, 39, 71, 7, 123, 59, 91, 27, 107, 43, 75, 11, 115, 51, + 83, 19, 99, 35, 67, 3, 125, 61, 93, 29, 109, 45, 77, 13, 117, + 53, 85, 21, 101, 37, 69, 5, 121, 57, 89, 25, 105, 41, 73, 9, + 113, 49, 81, 17, 97, 33, 65, 1 +}; + +static __inline__ uint8 GetCodeword(int bits){ + uint8 tmp; + + if(!valid_bits){ + in_stream|=*(in_buf++); + valid_bits=8; + } + in_stream<<=1; + valid_bits--; + in_stream^=0x8000; + if(in_stream&0x8000) return 0x80+(1<>8) | (0x7f>>bits); + in_stream<<=bits; + valid_bits-=bits; + if(valid_bits<0){ + in_stream |= (*(in_buf++))<<(-valid_bits); + valid_bits+=8; + } + return run_table[tmp]; +} + +static __inline__ uint8 GolombGetBit(int code_size){ + if(!bit_ctr[code_size]) bit_ctr[code_size]=GetCodeword(code_size); + bit_ctr[code_size]--; + if(bit_ctr[code_size]==0x80){ + bit_ctr[code_size]=0; + return 2; /* secret code for 'last zero'. ones are always last. */ + } + return (bit_ctr[code_size]==0)?1:0; +} + +static __inline__ uint8 ProbGetBit(uint8 context){ + uint8 state=context_states[context]; + uint8 bit=GolombGetBit(evolution_table[state].code_size); + + if(bit&1){ + context_states[context]=evolution_table[state].LPS_next; + if(state<2){ + context_MPS[context]^=1; + return context_MPS[context]; /* just inverted, so just return it */ + } else{ + return context_MPS[context]^1; /* we know bit is 1, so use a constant */ + } + } else if(bit){ + context_states[context]=evolution_table[state].MPS_next; + /* zero here, zero there, no difference so drop through. */ + } + return context_MPS[context]; /* we know bit is 0, so don't bother xoring */ +} + +static __inline__ uint8 GetBit(uint8 cur_bitplane){ + uint8 bit; + + bit=ProbGetBit(((cur_bitplane&1)<<4) + | ((prev_bits[cur_bitplane]&high_context_bits)>>5) + | (prev_bits[cur_bitplane]&low_context_bits)); + + prev_bits[cur_bitplane] <<= 1; + prev_bits[cur_bitplane] |= bit; + return bit; +} + +void SDD1_decompress(uint8 *out, uint8 *in, int len){ + uint8 bit, i, plane; + uint8 byte1, byte2; + + if(len==0) len=0x10000; + + bitplane_type=in[0]>>6; + + switch(in[0]&0x30){ + case 0x00: + high_context_bits=0x01c0; + low_context_bits =0x0001; + break; + case 0x10: + high_context_bits=0x0180; + low_context_bits =0x0001; + break; + case 0x20: + high_context_bits=0x00c0; + low_context_bits =0x0001; + break; + case 0x30: + high_context_bits=0x0180; + low_context_bits =0x0003; + break; + } + + in_stream=(in[0]<<11) | (in[1]<<3); + valid_bits=5; + in_buf=in+2; + memset(bit_ctr, 0, sizeof(bit_ctr)); + memset(context_states, 0, sizeof(context_states)); + memset(context_MPS, 0, sizeof(context_MPS)); + memset(prev_bits, 0, sizeof(prev_bits)); + + switch(bitplane_type){ + case 0: + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(0)) byte1 |= bit; + if(GetBit(1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + } + break; + case 1: + i=plane=0; + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(plane)) byte1 |= bit; + if(GetBit(plane+1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + if(!(i+=32)) plane = (plane+2)&7; + } + break; + case 2: + i=plane=0; + while(1) { + for(byte1=byte2=0, bit=0x80; bit; bit>>=1){ + if(GetBit(plane)) byte1 |= bit; + if(GetBit(plane+1)) byte2 |= bit; + } + *(out++)=byte1; + if(!--len) return; + *(out++)=byte2; + if(!--len) return; + if(!(i+=32)) plane ^= 2; + } + break; + case 3: + do { + for(byte1=plane=0, bit=1; bit; bit<<=1, plane++){ + if(GetBit(plane)) byte1 |= bit; + } + *(out++)=byte1; + } while(--len); + break; + } +} + +static uint8 cur_plane; +static uint8 num_bits; +static uint8 next_byte; + +void SDD1_init(uint8 *in){ + bitplane_type=in[0]>>6; + + switch(in[0]&0x30){ + case 0x00: + high_context_bits=0x01c0; + low_context_bits =0x0001; + break; + case 0x10: + high_context_bits=0x0180; + low_context_bits =0x0001; + break; + case 0x20: + high_context_bits=0x00c0; + low_context_bits =0x0001; + break; + case 0x30: + high_context_bits=0x0180; + low_context_bits =0x0003; + break; + } + + in_stream=(in[0]<<11) | (in[1]<<3); + valid_bits=5; + in_buf=in+2; + memset(bit_ctr, 0, sizeof(bit_ctr)); + memset(context_states, 0, sizeof(context_states)); + memset(context_MPS, 0, sizeof(context_MPS)); + memset(prev_bits, 0, sizeof(prev_bits)); + + cur_plane=0; + num_bits=0; +} + +uint8 SDD1_get_byte(void){ + uint8 bit; + uint8 byte=0; + + switch(bitplane_type){ + case 0: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(0)) byte |= bit; + if(GetBit(1)) next_byte |= bit; + } + return byte; + } else { + return next_byte; + } + + case 1: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(cur_plane)) byte |= bit; + if(GetBit(cur_plane+1)) next_byte |= bit; + } + return byte; + } else { + if(!num_bits) cur_plane = (cur_plane+2)&7; + return next_byte; + } + + case 2: + num_bits+=16; + if(num_bits&16){ + next_byte=0; + for(bit=0x80; bit; bit>>=1){ + if(GetBit(cur_plane)) byte |= bit; + if(GetBit(cur_plane+1)) next_byte |= bit; + } + return byte; + } else { + if(!num_bits) cur_plane ^= 2; + return next_byte; + } + + case 3: + for(cur_plane=0, bit=1; bit; bit<<=1, cur_plane++){ + if(GetBit(cur_plane)) byte |= bit; + } + return byte; + + default: + /* should never happen */ + return 0; + } +} diff --git a/src/sdl/config.cpp b/src/sdl/config.cpp new file mode 100644 index 0000000..da6910c --- /dev/null +++ b/src/sdl/config.cpp @@ -0,0 +1,786 @@ +/* ______ ___ ___ + * /\ _ \ /\_ \ /\_ \ + * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ + * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\ + * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ + * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ + * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ + * /\____/ + * \_/__/ + * By Shawn Hargreaves, + * 1 Salisbury Road, + * Market Drayton, + * Shropshire, + * England, TF9 1AJ. + * + * Configuration routines. + * + * See readme.txt for copyright information. + */ + + +#include +#include +#include +#ifndef DREAMCAST +#include +#endif +#include +#include + +#include "snes9x.h" + +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +typedef struct CONFIG_ENTRY +{ + char *name; /* variable name (NULL if comment) */ + char *data; /* variable value */ + struct CONFIG_ENTRY *next; /* linked list */ +} CONFIG_ENTRY; + + +typedef struct CONFIG +{ + CONFIG_ENTRY *head; /* linked list of config entries */ + char *filename; /* where were we loaded from? */ + int dirty; /* has our data changed? */ +} CONFIG; + + +#define MAX_CONFIGS 4 + +static CONFIG *config[MAX_CONFIGS] = { NULL, NULL, NULL, NULL }; +static CONFIG *config_override = NULL; + +static int config_installed = FALSE; + +char *get_filename(char *path) +{ + int pos; + + for (pos=0; path[pos]; pos++) + ; /* do nothing */ + + while ((pos>0) && (path[pos-1] != '\\') && (path[pos-1] != '/')) + pos--; + return path+pos; +} + +long file_size (char *filename) +{ + FILE *fs = fopen (filename, "r"); + + if (fs) + { + long len; + + fseek (fs, 0, SEEK_END); + len = ftell (fs); + fclose (fs); + + return (len); + } + return (0); +} + +/* destroy_config: + * Destroys a config structure, writing it out to disk if the contents + * have changed. + */ +static void destroy_config(CONFIG *cfg) +{ + CONFIG_ENTRY *pos, *prev; + + if (cfg) { + if (cfg->filename) { + if (cfg->dirty) { + /* write changed data to disk */ + FILE *f = fopen(cfg->filename, "w"); + + if (f) { + pos = cfg->head; + + while (pos) { + if (pos->name) { + fputs(pos->name, f); + if (pos->name[0] != '[') + fputs(" = ", f); + } + if (pos->data) + fputs(pos->data, f); + + fputs("\n", f); + pos = pos->next; + } + + fclose(f); + } + } + + free(cfg->filename); + } + + /* destroy the variable list */ + pos = cfg->head; + + while (pos) { + prev = pos; + pos = pos->next; + + if (prev->name) + free(prev->name); + + if (prev->data) + free(prev->data); + + free(prev); + } + + free(cfg); + } +} + + + +/* config_cleanup: + * Called at shutdown time to free memory being used by the config routines, + * and write any changed data out to disk. + */ +static void config_cleanup() +{ + int i; + + for (i=0; i= 4) + set_config_file(buf[0]); + } +#endif +} + +/* get_line: + * Helper for splitting files up into individual lines. + */ +static int get_line(char *data, int length, char *name, char *val) +{ + char buf[256], buf2[256]; + int pos, i, j; + + for (pos=0; (poshead; + + if (prev) + *prev = NULL; + + while (p) { + if (p->name) { + if ((p->name[0] == '[') && (p->name[strlen(p->name)-1] == ']')) { + /* change section */ + in_section = (strcasecmp(section_name, p->name) == 0); + } + if ((in_section) || (name[0] == '[')) { + /* is this the one? */ + if (strcasecmp(p->name, name) == 0) + return p; + } + } + + if (prev) + *prev = p; + + p = p->next; + } + } + + return NULL; +} + + + +/* get_config_string: + * Reads a string from the configuration file. + */ +char *get_config_string(char *section, char *name, char *def) +{ + CONFIG_ENTRY *p; + + init_config(TRUE); + + p = find_config_string(config_override, section, name, NULL); + + if (!p) + p = find_config_string(config[0], section, name, NULL); + + if (p) + return (char*)(p->data ? p->data : ""); + else + return def; +} + + + +/* get_config_int: + * Reads an integer from the configuration file. + */ +int get_config_int(char *section, char *name, int def) +{ + char *s = get_config_string(section, name, NULL); + + if ((s) && (*s)) + return strtol(s, NULL, 0); + + return def; +} + + + +/* get_config_hex: + * Reads a hexadecimal integer from the configuration file. + */ +int get_config_hex(char *section, char *name, int def) +{ + char *s = get_config_string(section, name, NULL); + int i; + + if ((s) && (*s)) { + i = strtol(s, NULL, 16); + if ((i == 0x7FFFFFFF) && (strcasecmp(s, "7FFFFFFF") != 0)) + i = -1; + return i; + } + + return def; +} + + + +/* get_config_float: + * Reads a float from the configuration file. + */ +float get_config_float(char *section, char *name, float def) +{ + char *s = get_config_string(section, name, NULL); + + if ((s) && (*s)) + return atof(s); + + return def; +} + + + +/* get_config_argv: + * Reads an argc/argv style token list from the configuration file. + */ +char **get_config_argv(char *section, char *name, int *argc) +{ + #define MAX_ARGV 16 + + static char buf[256]; + static char *argv[MAX_ARGV]; + int pos, ac; + + char *s = get_config_string(section, name, NULL); + + if (!s) { + *argc = 0; + return NULL; + } + + strcpy(buf, s); + pos = 0; + ac = 0; + + while ((acname = (char *) malloc(strlen(name)+1); + strcpy(n->name, name); + } + else + n->name = NULL; + + if (data) { + n->data = (char *) malloc(strlen(data)+1); + strcpy(n->data, data); + } + else + n->data = NULL; + + if (p) { + n->next = p->next; + p->next = n; + } + else { + n->next = NULL; + config[0]->head = n; + } + + return n; +} + + + +/* set_config_string: + * Writes a string to the configuration file. + */ +void set_config_string(char *section, char *name, char *val) +{ + CONFIG_ENTRY *p, *prev; + char section_name[256]; + + init_config(TRUE); + + if (config[0]) { + p = find_config_string(config[0], section, name, &prev); + + if (p) { + if ((val) && (*val)) { + /* modify existing variable */ + if (p->data) + free(p->data); + + p->data = (char *) malloc(strlen(val)+1); + strcpy(p->data, val); + } + else { + /* delete variable */ + if (p->name) + free(p->name); + + if (p->data) + free(p->data); + + if (prev) + prev->next = p->next; + else + config[0]->head = p->next; + + free(p); + } + } + else { + if ((val) && (*val)) { + /* add a new variable */ + prettify_section_name(section, section_name); + + if (section_name[0]) { + p = find_config_string(config[0], NULL, section_name, &prev); + + if (!p) { + /* create a new section */ + p = config[0]->head; + while ((p) && (p->next)) + p = p->next; + + if ((p) && (p->data) && (*p->data)) + p = insert_variable(p, NULL, NULL); + + p = insert_variable(p, section_name, NULL); + } + + /* append to the end of the section */ + while ((p) && (p->next) && + (((p->next->name) && (*p->next->name)) || + ((p->next->data) && (*p->next->data)))) + p = p->next; + + p = insert_variable(p, name, val); + } + else { + /* global variable */ + p = config[0]->head; + insert_variable(NULL, name, val); + config[0]->head->next = p; + } + } + } + + config[0]->dirty = TRUE; + } +} + + + +/* set_config_int: + * Writes an integer to the configuration file. + */ +void set_config_int(char *section, char *name, int val) +{ + char buf[32]; + sprintf(buf, "%d", val); + set_config_string(section, name, buf); +} + + + +/* set_config_hex: + * Writes a hexadecimal integer to the configuration file. + */ +void set_config_hex(char *section, char *name, int val) +{ + if (val >= 0) { + char buf[32]; + sprintf(buf, "%X", val); + set_config_string(section, name, buf); + } + else + set_config_string(section, name, "-1"); +} + + + +/* set_config_float: + * Writes a float to the configuration file. + */ +void set_config_float(char *section, char *name, float val) +{ + char buf[32]; + sprintf(buf, "%f", val); + set_config_string(section, name, buf); +} + diff --git a/src/sdl/keydef.h b/src/sdl/keydef.h new file mode 100644 index 0000000..0a0468d --- /dev/null +++ b/src/sdl/keydef.h @@ -0,0 +1,38 @@ +#define A_1 0 +#define B_1 1 +#define X_1 2 +#define Y_1 3 +#define L_1 4 +#define R_1 5 +#define A_2 6 +#define B_2 7 +#define X_2 8 +#define Y_2 9 +#define L_2 10 +#define R_2 11 +#define START_1 12 +#define SELECT_1 13 +#define START_2 14 +#define SELECT_2 15 +#define UP_1 16 +#define DOWN_1 17 +#define LEFT_1 18 +#define RIGHT_1 19 +#define UP_2 20 +#define DOWN_2 21 +#define LEFT_2 22 +#define RIGHT_2 23 +#define LU_2 24 +#define LD_2 25 +#define RU_2 26 +#define RD_2 27 + +#define ACCEL 50 +#define QUIT 51 +#define HELP 52 + +#define SHIFTL 30 +#define SHIFTR 31 +#define CTRLL 32 +#define CTRLR 33 + diff --git a/src/sdl/machine.cpp b/src/sdl/machine.cpp new file mode 100644 index 0000000..cab4c54 --- /dev/null +++ b/src/sdl/machine.cpp @@ -0,0 +1,2042 @@ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code + * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. + * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. + * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). + * + * DOS port code contains the works of other authors. See headers in + * individual files. + * + * Snes9x homepage: http://www.snes9x.com + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ + +#ifdef DREAMCAST +#include +extern uint8 romdisk[]; +KOS_INIT_FLAGS(INIT_DEFAULT); +KOS_INIT_ROMDISK(romdisk); +#endif + + +#include +#include +#include +#include +#ifdef USE_MENU_MUSIC +#include +#endif +#ifdef DREAMCAST +#ifdef USE_MMU +#include "mmu_handle.h" +#endif +#include +extern int sdcard_exists; +void reinit_sdcard(void); +int save_to_vmu(char *); +int load_from_vmu(char *); +#endif +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "keydef.h" +#include "snes9x.h" +#include "memmap.h" +#include "debug.h" +#include "cpuexec.h" +#include "ppu.h" +#include "snapshot.h" +#include "apu.h" +#include "display.h" +#include "gfx.h" +#include "soundux.h" +#include "spc700.h" +#include "sa1.h" +#include "dsp1.h" +#include "missing.h" +#include "dma.h" + +#include "menu.h" + +#include "sdlinterface.h" +#include "videogl.h" + +#define AUTO_FRAMESKIP_DELAY 4 +#define TH_VCOUNTER_SPLIT 11 +#define SNES_MAX_MID_VCOUNTER (SNES_MAX_NTSC_VCOUNTER+((SNES_MAX_PAL_VCOUNTER-SNES_MAX_NTSC_VCOUNTER)/2)) +#define TH_VCOUNTER0 ((TH_VCOUNTER_SPLIT*SNES_MAX_PAL_VCOUNTER)/10) +#define TH_VCOUNTER1 TH_VCOUNTER0 +#define TH_VCOUNTER2 ((TH_VCOUNTER_SPLIT*SNES_MAX_MID_VCOUNTER)/10) +#define TH_VCOUNTER3 ((TH_VCOUNTER_SPLIT*SNES_MAX_NTSC_VCOUNTER)/10) +#define TH_VCOUNTER4 ((TH_VCOUNTER_SPLIT*240)/10) + +#ifdef DEBUG_CPU +#if DEBUG_CPU == 0 +unsigned cpu_debugging=1; +#else +unsigned cpu_debugging=0; +#endif +#endif + +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +unsigned snes4all_max_vcounter=TH_VCOUNTER0; +unsigned snes4all_apu_hmax=1; +short snes4all_vcounter[512]; +#endif + +#if defined(DEBUG_TILECACHE) || defined(PROFILER_SNES4ALL) +int snes4all_frameskip=0; +#if defined(USE_ALWAYS_APU_SYNC) || !defined(DREAMCAST) || !defined(USE_OPC_ASM) +int snes4all_sound_enable=0; +#endif +static int _snes4all_sound_enable_=0; +int snes4all_transparency=0; +int snes4all_throttle=0; +int snes4all_autosave=0; +int snes4all_raster=2; +int snes4all_raster_diff=16; +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +int snes4all_sound_throttle=1; +unsigned snes4all_timeslice=2; +#else +extern unsigned snes4all_timeslice; +#endif + + +#ifdef DEBUG_TILECACHE +unsigned snes4all_debug_tilecache_tiles=0; +unsigned snes4all_debug_tilecache_fails=0; + +static void print_tileche_eficience(void) +{ + double d=snes4all_debug_tilecache_fails; + d*=100.0; + d/=(double)snes4all_debug_tilecache_tiles; + d=100.0-d; + printf("%i total, %i fallados, EFICIENCIA %.2f%%\n",snes4all_debug_tilecache_tiles,snes4all_debug_tilecache_fails,d); +} +#endif + +#else +int snes4all_frameskip=-1; +#if defined(USE_ALWAYS_APU_SYNC) || !defined(DREAMCAST) || !defined(USE_OPC_ASM) +int snes4all_sound_enable=1; +#endif +static int _snes4all_sound_enable_=0; +int snes4all_transparency=0; +int snes4all_raster=2; +int snes4all_raster_diff=16; +int snes4all_autosave=-1; +int snes4all_throttle=1; +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +int snes4all_sound_throttle=(1<<1); +unsigned snes4all_timeslice=2+(1<<1); +#else +extern int snes4all_sound_throttle; +extern unsigned snes4all_timeslice; +#endif +#endif + +#ifdef USE_GL +int snes4all_hw_render=-1; +#endif + +int snes4all_booting=200; +int snes4all_sound_enable_real=1; + +int OldSkipFrame; + +extern SDL_Surface *screen; + +long reportf=0; + +#define MUSIC_VOLUME 64 + +//#define MAX_FRAMESKIP 10 +#define MAX_FRAMESKIP 4 + +char snes4all_image_file[1024]; +int snes4all_emulating=0; +char *rom_filename = (char *)&snes4all_image_file[0]; +char *snapshot_filename = NULL; + +#ifdef DISPLAY_FRAMERATE +unsigned snes4all_frames_per_second=0; +int snes4all_displayframerate=1; +#endif + +static uint32 joypad_val[8]={0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000}; + +static int savestate_tostate=0; +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) +int savestate_state=0; +#else +extern int savestate_state; +#endif +void show_please_wait(char *title, SDL_Surface *scr); + +void OutOfMemory () +{ + fprintf (stderr, "\ +Snes9X: Memory allocation failure - not enough RAM/virtual memory available.\n\ + S9xExiting...\n"); + CMemory_Deinit (); + S9xDeinitAPU (); + exit (1); +} + +static void getChanges(void) +{ +//snes4all_transparency=snes4all_hw_render=-1; snes4all_raster=0; snes4all_frameskip=0; + if (snes4all_transparency) + Settings.Transparency=TRUE; + else + Settings.Transparency=FALSE; + if (snes4all_frameskip<0) + Settings.SkipFrames=AUTO_FRAMERATE; + else + Settings.SkipFrames=snes4all_frameskip; + + snes4all_sound_enable_real=snes4all_sound_enable; + if (snes4all_booting && snes4all_sound_enable==1) { + snes4all_sound_enable=2; + } +#ifdef NOSOUND + S9xSetSoundMute(!snes4all_sound_enable); +#endif + + long i; + switch(snes4all_raster) { + case 0: snes4all_raster_diff=1024; break; + case 1: snes4all_raster_diff=32; break; + case 2: snes4all_raster_diff=16; break; + case 3: snes4all_raster_diff=8; break; + default: snes4all_raster_diff=1; + } + switch(snes4all_throttle) + { + case 4: + Settings.CyclesPercentage = (100 * SNES_MAX_PAL_VCOUNTER) / TH_VCOUNTER4; + for(i=0;i<240;i++) + snes4all_vcounter[i]=i+1; + for(i=240;i<512;i++) + snes4all_vcounter[i]=511; + break; + case 3: + Settings.CyclesPercentage = (100 * SNES_MAX_PAL_VCOUNTER) / TH_VCOUNTER3; + for(i=0;i 0) + SDL_Delay(10); +} + +void MemSpeedx2_hack_load(void) { + unsigned dato=CPU.MemSpeedx2; +#ifndef USE_MEMORY_SPEED + if ((dato>>16)==0x3412) { + snes4all_transparency=dato&1; + if (dato&1) snes4all_transparency=-1; + else snes4all_transparency=0; + if (dato&2) snes4all_hw_render=-1; + else snes4all_hw_render=0; + snes4all_raster=(dato>>2)&0x7; + snes4all_throttle=(dato>>5)&0x7; + snes4all_sound_enable=(dato>>8)&0x3; + snes4all_frameskip=(dato>>10)&0x7; + if (snes4all_frameskip>5) snes4all_frameskip=-1; + getChanges(); + } +#endif + CPU.MemSpeedx2=CPU.MemSpeed << 1; +} + +void MemSpeedx2_hack_save(void) { +#ifndef USE_MEMORY_SPEED + CPU.MemSpeedx2=(0x3412 << 16)|(((unsigned)snes4all_transparency)&1)|((((unsigned)snes4all_hw_render)&1)<<1)|((((unsigned)snes4all_raster)&0x7)<<2)|((((unsigned)snes4all_throttle)&0x7)<<5)|((((unsigned)snes4all_sound_enable)&0x3)<<8)|((((unsigned)snes4all_frameskip)&0x7)<<10); +#endif +} + +#ifdef USE_MMU +static void mi_handler_mmu(void *mem, unsigned start, unsigned size) {} +extern "C"{ +void S9xGetByte_callback(void); +void S9xGetByte_callback_jmp(void); +void S9xGetWord_callback(void); +void S9xGetWord_callback_jmp(void); +void S9xSetByte_callback(void); +void S9xSetByte_callback_jmp(void); +void S9xSetWord_callback(void); +void S9xSetWord_callback_jmp(void); +} + +void set_mmu_mappings(void) { + mmu_handle_restart(); + for(unsigned i=0;i=(uint8 *)CMemory_MAP_LAST)?CMemory_WriteMap[i+j]:CMemory_Map[i+j]; + if (addr>= (uint8 *) CMemory_MAP_LAST) { + addr+=(j*MEMMAP_BLOCK_SIZE); +// printf("%.3x=%.6x:%.6x MAP %s\n",i+j,(i+j)*MEMMAP_BLOCK_SIZE,((i+j+1)*MEMMAP_BLOCK_SIZE)-1,(addr>=&CMemory_FillRAM[0] && addr<&CMemory_FillRAM[SNES4ALL_MAX_ROM_SIZE + 0x200 +0x8000])?"FillRAM":(addr>=&CMemory_RAM[0] && addr<&CMemory_RAM[0x20000])?"RAM":(addr>=&CMemory_ROM[0] && addr<&CMemory_ROM[SNES4ALL_MAX_ROM_SIZE])?"ROM":(addr>=&CMemory_VRAM[0] && addr<&CMemory_VRAM[0x10000])?"VRAM":(addr>=&CMemory_SRAM[0] && addr<&CMemory_SRAM[0x20000])?"SRAM":(addr>=&CMemory_C4RAM[0] && addr<&CMemory_C4RAM[0x8000])?"C4RAM":(CMemory_BWRAM && addr>=&CMemory_BWRAM[0] && addr<&CMemory_BWRAM[0x20000])?"BWRAM":"?????"); + if (((unsigned)addr)&0xFFF) { + puts("MMU ERROR!!!"); + mmu_handle_quit(); + exit(0); + } + unsigned ptr=(unsigned)mmu_handle_add(1<pixels; +#endif +#ifndef AUTOLOAD + run_mainMenu(); +#else + strcpy(rom_filename,AUTOLOAD); +#endif + SDL_FillRect(screen,NULL,0); + sound_disable_music(); + quit_text(); + snes4all_emulating=1; + + getChanges(); + + if (rom_filename) + { + if (!CMemory_LoadROM (rom_filename)) + { + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char fname [_MAX_PATH + 1]; + + _splitpath (rom_filename, drive, dir, name, ext); + _makepath (fname, drive, dir, name, ext); + + strcpy (fname, S9xGetROMDirectory ()); + strcat (fname, SLASH_STR); + strcat (fname, name); + if (ext [0]) + { + strcat (fname, "."); + strcat (fname, ext); + } + _splitpath (fname, drive, dir, name, ext); + _makepath (fname, drive, dir, name, ext); + if (!CMemory_LoadROM (fname)) + { + printf ("Error opening: %s\n", rom_filename); +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit (1); + } + } +#ifdef DREAMCAST + reinit_sdcard(); + if (!sdcard_exists) + load_from_vmu((char *)S9xGetFilenameBase(".srm",1)); +#endif + CMemory_LoadSRAM (S9xGetFilename (".srm")); +// S9xLoadCheatFile (S9xGetFilename (".cht")); + } + else + { + S9xReset (); + Settings.Paused |= 2; + } + CPU.Flags = saved_flags; + + if (snapshot_filename) + { + snes4all_booting=0; + snes4all_sound_enable=snes4all_sound_enable_real; + int Flags = CPU.Flags & (DEBUG_MODE_FLAG | TRACE_FLAG); + if (!S9xLoadSnapshot (snapshot_filename)){ +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit (1); + } + CPU.Flags |= Flags; + } +#ifndef _ZAURUS + S9xGraphicsMode (); + sprintf (String, "\"%s\" %s: %s", CMemory_ROMName, TITLE, "Beta2"); //VERSION); + S9xSetTitle (String); +#endif + + S9xSetSoundMute (TRUE); + if (!Settings.APUEnabled) + S9xSetSoundMute (FALSE); + +#ifdef PROFILER_SNES4ALL + snes4all_prof_init(); + snes4all_prof_add("S9xMainLoop"); // 0 + snes4all_prof_add("S9xDoHBlankProcessing"); // 1 + snes4all_prof_add("RenderLine"); // 2 + snes4all_prof_add("S9xEndScreenRefresh"); // 3 +#endif + + snes4all_prof_start(0); +#ifdef AUTOSAVESTATE + savestate_state=-302; +#endif + _snes4all_sound_enable_=snes4all_sound_enable; +#ifdef USE_MMU + set_mmu_mappings(); +#endif + + S9xMainLoop (); + return (0); +} + +void S9xAutoSaveSRAM () +{ +//puts("S9xAutoSaveSRAM"); + CMemory_SaveSRAM (S9xGetFilename (".srm")); +#ifdef DREAMCAST + reinit_sdcard(); + if (!sdcard_exists) + save_to_vmu((char *)S9xGetFilenameBase(".srm",1)); +#endif +} + +void S9xExit () +{ + S9xSetSoundMute (TRUE); + S9xDeinitDisplay (); + S9xAutoSaveSRAM (); +// S9xSaveCheatFile (S9xGetFilename (".cht")); + CMemory_Deinit (); + S9xDeinitAPU (); +//extern unsigned tiles_2bit_maxframe, tiles_2bit_max, tiles_2bit_maxshift, tiles_2bit_maxmask, tiles_2bit_min, tiles_2bit_minshift, tiles_2bit_minmask; +//printf("2BIT: FRAME=%u, TILES=%u/%u, SHIFT=%u/%u, MASK=%u/%u\n",tiles_2bit_maxframe,tiles_2bit_min==0xffffffff?0:tiles_2bit_min,tiles_2bit_max,tiles_2bit_minshift==0xffffffff?0:tiles_2bit_minshift,tiles_2bit_maxshift,tiles_2bit_minmask==0xffffffff?0:tiles_2bit_minmask,tiles_2bit_maxmask); +//extern unsigned tiles_4bit_maxframe, tiles_4bit_max, tiles_4bit_maxshift, tiles_4bit_maxmask, tiles_4bit_min, tiles_4bit_minshift, tiles_4bit_minmask; +//printf("4BIT: FRAME=%u, TILES=%u/%u, SHIFT=%u/%u, MASK=%u/%u\n",tiles_4bit_maxframe,tiles_4bit_min==0xffffffff?0:tiles_4bit_min,tiles_4bit_max,tiles_4bit_minshift==0xffffffff?0:tiles_4bit_minshift,tiles_4bit_maxshift,tiles_4bit_minmask==0xffffffff?0:tiles_4bit_minmask,tiles_4bit_maxmask); +//extern unsigned tiles_8bit_maxframe, tiles_8bit_max, tiles_8bit_maxshift, tiles_8bit_maxmask, tiles_8bit_min, tiles_8bit_minshift, tiles_8bit_minmask; +//printf("8BIT: FRAME=%u, TILES=%u/%u, SHIFT=%u/%u, MASK=%u/%u\n",tiles_8bit_maxframe,tiles_8bit_min==0xffffffff?0:tiles_8bit_min,tiles_8bit_max,tiles_8bit_minshift==0xffffffff?0:tiles_8bit_minshift,tiles_8bit_maxshift,tiles_8bit_minmask==0xffffffff?0:tiles_8bit_minmask,tiles_8bit_maxmask); +//fflush(stdout); +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit (0); +} + +void S9xInitInputDevices () +{ +} + +#ifndef DREAMCAST +const char *GetHomeDirectory () +{ + return (getenv ("HOME")); +} +#endif + +const char *S9xGetSnapshotDirectory () +{ +#ifndef DREAMCAST + static char filename [PATH_MAX]; + const char *snapshot; + if (!(snapshot = getenv ("SNES9X_SNAPSHOT_DIR")) && + !(snapshot = getenv ("SNES96_SNAPSHOT_DIR"))) +#else + const char *snapshot=fs_getwd(); + if (strncmp(fs_getwd(),"/sd",3)) +#endif + { +#ifdef WIN32 + return("/tmp"); +#else +#ifdef DREAMCAST + reinit_sdcard(); + if (sdcard_exists) return("/sd/snes4all"); + return("/ram"); +#else + const char *home = GetHomeDirectory (); + strcpy (filename, home); + strcat (filename, SLASH_STR); + strcat (filename, ".snes96_snapshots"); + mkdir (filename, 0777); + chown (filename, getuid (), getgid ()); +#endif +#endif + } +#ifndef DREAMCAST + else + return (snapshot); + + return (filename); +#else + return (snapshot); +#endif +} + +const char *S9xGetFilenameBase(const char *ex, int based) { + static char filename [PATH_MAX + 1]; + char drive [_MAX_DRIVE + 1]; + char dir [_MAX_DIR + 1]; + char fname [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + + _splitpath (CMemory_ROMFilename, drive, dir, fname, ext); + if (!based) { + strcpy (filename, S9xGetSnapshotDirectory ()); + strcat (filename, SLASH_STR); + strcat (filename, fname); + } else { + strcpy (filename, fname); + } + strcat (filename, ex); + +//printf("S9xGetFilename(%s)=%s\n",ex,filename); + return (filename); +} + +const char *S9xGetFilename (const char *ex) { + return S9xGetFilenameBase(ex,0); +} + +const char *S9xGetROMDirectory () +{ + const char *roms; + + if (!(roms = getenv ("SNES9X_ROM_DIR")) && + !(roms = getenv ("SNES96_ROM_DIR"))) + return ("." SLASH_STR "roms"); + else + return (roms); +} + +const char *S9xBasename (const char *f) +{ + const char *p; + if ((p = strrchr (f, '/')) != NULL || (p = strrchr (f, '\\')) != NULL) + return (p + 1); + + return (f); +} + +#if 0 +const char *S9xChooseFilename (bool8 read_only) +{ + char def [PATH_MAX + 1]; + char title [PATH_MAX + 1]; + char drive [_MAX_DRIVE + 1]; + char dir [_MAX_DIR + 1]; + char ext [_MAX_EXT + 1]; + + _splitpath (CMemory_ROMFilename, drive, dir, def, ext); + strcat (def, ".s96"); + sprintf (title, "%s snapshot filename", + read_only ? "Select load" : "Choose save"); + const char *filename; + + S9xSetSoundMute (TRUE); + filename = S9xSelectFilename (def, S9xGetSnapshotDirectory (), "s96", title); + S9xSetSoundMute (FALSE); + return (filename); +} +#endif + +bool8 S9xOpenSnapshotFile (const char *fname, bool8 read_only, STREAM *file) +{ + char filename [PATH_MAX + 1]; + char drive [_MAX_DRIVE + 1]; + char dir [_MAX_DIR + 1]; + char ext [_MAX_EXT + 1]; + + _splitpath (fname, drive, dir, filename, ext); + + if (*drive || *dir == '/' || + (*dir == '.' && (*(dir + 1) == '/' + ))) + { + strcpy (filename, fname); + if (!*ext) + strcat (filename, ".s96"); + } + else + { + strcpy (filename, S9xGetSnapshotDirectory ()); + strcat (filename, SLASH_STR); + strcat (filename, fname); + if (!*ext) + strcat (filename, ".s96"); + } + +#ifdef ZLIB + if (read_only) + { + if ((*file = OPEN_STREAM (filename, "rb"))) + return (TRUE); + } + else + { + if ((*file = OPEN_STREAM (filename, "wb"))) + return (TRUE); + } +#else + char command [PATH_MAX]; + + if (read_only) + { + sprintf (command, "gzip -d <\"%s\"", filename); + if (*file = popen (command, "r")) + return (TRUE); + } + else + { + sprintf (command, "gzip --best >\"%s\"", filename); + if (*file = popen (command, "wb")) + return (TRUE); + } +#endif + return (FALSE); +} + +void S9xCloseSnapshotFile (STREAM file) +{ +#ifdef ZLIB + CLOSE_STREAM (file); +#else + pclose (file); +#endif +} + +#if 0 +bool8 S9xInitUpdate () +{ + return (TRUE); +} +#endif + +bool8 S9xDeinitUpdate (int Width, int Height,bool8 sixnocount) +{ +//puts("SWAP"); +#ifndef USE_GL + SDL_Flip(screen); +#else + videogl_flip(SDL_TRUE); +#endif + return(TRUE); +} + + +// #define now() SDL_GetTicks() + +void _makepath (char *path, const char *, const char *dir, + const char *fname, const char *ext) +{ + if (dir && *dir) + { + strcpy (path, dir); + strcat (path, "/"); + } + else + *path = 0; + strcat (path, fname); + if (ext && *ext) + { + strcat (path, "."); + strcat (path, ext); + } +} + +void _splitpath (const char *path, char *drive, char *dir, char *fname, + char *ext) +{ + *drive = 0; + + char *slash = (char *)strrchr (path, '/'); + if (!slash) + slash = (char *)strrchr (path, '\\'); + + char *dot = (char *)strrchr (path, '.'); + + if (dot && slash && dot < slash) + dot = NULL; + + if (!slash) + { + strcpy (dir, ""); + strcpy (fname, path); + if (dot) + { + *(fname + (dot - path)) = 0; + strcpy (ext, dot + 1); + } + else + strcpy (ext, ""); + } + else + { + strcpy (dir, path); + *(dir + (slash - path)) = 0; + strcpy (fname, slash + 1); + if (dot) + { + *(fname + (dot - slash) - 1) = 0; + strcpy (ext, dot + 1); + } + else + strcpy (ext, ""); + } +} + +/* +#ifndef _ZAURUS +void S9xToggleSoundChannel (int c) +{ + if (c == 8) + so.sound_switch = 255; + else + so.sound_switch ^= 1 << c; + S9xSetSoundControl (so.sound_switch); +} +#endif +*/ + +#ifdef DEBUG_FRAMESKIP +static unsigned snes4all_fskip_nframes=0; +static unsigned snes4all_fskip_skipped=0; +static double snes4all_fskip_framerate=0.0; +static unsigned snes4all_fskip_start_time=0; + +static void print_frameskip(void) +{ + double d=(((double)snes4all_fskip_skipped)*100.0)/((double)snes4all_fskip_nframes); + printf("%i frames, skipped %i (%.2f%%)\n",snes4all_fskip_nframes,snes4all_fskip_skipped,d); + printf("Framerate %.2f/%.2f\n", ((100.0-d)*snes4all_fskip_framerate)/100.0,snes4all_fskip_framerate); +} + +static void debug_reset_frameskip(void){ + snes4all_fskip_start_time=0; + snes4all_fskip_nframes=0; + snes4all_fskip_skipped=0; +} + +static void debug_frameskip(bool isframe) +{ + static Uint32 start_numframes=0; + static Uint32 nveces=0; + + if (!isframe) + snes4all_fskip_skipped++; + snes4all_fskip_nframes++; + if (!snes4all_fskip_start_time) + { + snes4all_fskip_start_time=SDL_GetTicks(); + start_numframes=snes4all_fskip_nframes; + snes4all_fskip_framerate=0.0; + } + else + { + Uint32 now=SDL_GetTicks(); + if (now-snes4all_fskip_start_time>=1000) + { + if (snes4all_fskip_framerate!=0.0) + snes4all_fskip_framerate=((snes4all_fskip_framerate*((double)(nveces-1)))+((double)(snes4all_fskip_nframes-start_numframes)))/((double)nveces); + else { + snes4all_fskip_framerate=(double)(snes4all_fskip_nframes-start_numframes); + nveces=1; + } + snes4all_fskip_start_time=now; + start_numframes=snes4all_fskip_nframes; + nveces++; + } + } +#ifdef AUTO_DEBUG_FRAMESKIP + if (snes4all_fskip_nframes>=AUTO_DEBUG_FRAMESKIP) + { + print_frameskip(); +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit(0); + } +#endif + +} + +#else +#define debug_reset_frameskip() +#endif + +//bool8 backRenderThisFrame=TRUE; + +void S9xSyncSpeed () +{ +#ifndef USE_OLD_SYNC_SPEED + CPU.V_Counter = 0; + CMemory_FillRAM[0x213F]^=0x80; + PPU.RangeTimeOver = 0; + CPU.NMIActive = FALSE; + ICPU.Frame++; + PPU.HVBeamCounterLatched = 0; +#endif + if (snes4all_booting) { + snes4all_booting--; + if (!snes4all_booting) + snes4all_sound_enable=snes4all_sound_enable_real; + } + S9xProcessEvents (FALSE); +#if defined(AUTO_DEBUG_TILECACHE) && defined(DEBUG_TILECACHE) + { + static unsigned cu=0; + if (cu>=AUTO_DEBUG_TILECACHE) + { + print_tileche_eficience(); +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit(0); + } + cu++; + } +#endif + static Uint32 next1=0; +#ifdef USE_GL + { +// extern int videogl_cache_to_reseted; + if (videogl_cache_to_reseted) { + videogl_cache_to_reseted--; + if (!videogl_cache_to_reseted) + videogl_cache_reseted=1; + } + } +#endif + static int frames_before_skip=0; +// backRenderThisFrame=IPPU.RenderThisFrame; + if (/*!Settings.TurboMode &&*/ Settings.SkipFrames == AUTO_FRAMERATE) + { + Uint32 now=SDL_GetTicks(); + + if (!next1) + next1 = now; + + next1 += Settings.FrameTime; + + if ((now-AUTO_FRAMESKIP_DELAY)>next1) + { + IPPU.SkippedFrames++; + if (IPPU.SkippedFrames > MAX_FRAMESKIP) + { + IPPU.RenderThisFrame = TRUE; + IPPU.SkippedFrames = 0; + next1 = now + 2; + } + else + IPPU.RenderThisFrame = FALSE; + frames_before_skip=AUTO_FRAMESKIP_DELAY; + } + else + { + CHECK_SOUND (); + if ((now+AUTO_FRAMESKIP_DELAY) (now+AUTO_FRAMESKIP_DELAY)); + } +// next1=now; + } + IPPU.RenderThisFrame = TRUE; + IPPU.SkippedFrames = 0; + } + } + else + { +#ifdef DISPLAY_FRAMERATE + static Uint32 back=1000; + static Uint32 nframes=0; + Uint32 now=SDL_GetTicks(); + nframes++; + if (now-back>1000) { +//printf("%u, %u = %u\n",now,back,nframes); + snes4all_frames_per_second=nframes; + nframes=0; + back+=1000; + if (now>back) + back=now; + } +#endif + next1 = 0; + if (++IPPU.FrameSkip > (/*Settings.TurboMode ? Settings.TurboSkipFrames:*/Settings.SkipFrames)) + { + IPPU.FrameSkip = 0; + IPPU.SkippedFrames = 0; + IPPU.RenderThisFrame = TRUE; + } + else + { + IPPU.SkippedFrames++; + IPPU.RenderThisFrame = FALSE; + } + } +#ifdef DEBUG_FRAMESKIP + debug_frameskip(IPPU.RenderThisFrame); +#endif + S9xStartHDMA (); +} + + +#ifndef AUTO_EVENTS + +static void goMenu(void) +{ + int eret; +#ifdef USE_GL + videogl_cache_reseted=1; +#endif + snes4all_emulating=1; + _snes4all_sound_enable_=0; + while(!_snes4all_sound_enable_) + SDL_Delay(60); + snes4all_sound_enable=snes4all_sound_enable_real; +#ifdef DEBUG_TILECACHE + print_tileche_eficience(); +#endif +#ifdef DEBUG_FRAMESKIP + print_frameskip(); +#endif + rom_filename[0]=0; + sound_enable_music(); + init_text(0); + eret=run_mainMenu(); + quit_text(); + sound_disable_music(); + if(eret==2) { + S9xReset(); + if (snes4all_sound_enable==1) + snes4all_booting=200; + } + getChanges(); + if (rom_filename[0]) { + CMemory_LoadROM (rom_filename); + if (snes4all_sound_enable==1) { + snes4all_booting=200; + snes4all_sound_enable=2; + } + eret=2; + } + if(eret==2) { +#ifdef DREAMCAST + fs_ramdisk_shutdown(); + fs_ramdisk_init(); + reinit_sdcard(); + if (!sdcard_exists) + load_from_vmu((char *)S9xGetFilenameBase(".srm",1)); +#endif + CMemory_LoadSRAM (S9xGetFilename (".srm")); +#ifdef USE_MMU + set_mmu_mappings(); +#endif + } + SDL_FillRect(screen,NULL,0); + _snes4all_sound_enable_=snes4all_sound_enable; + if (savestate_state) { + snes4all_booting=0; + snes4all_sound_enable=snes4all_sound_enable_real; + } +} + +static void keyprocess(SDLKey key, SDL_bool pressed) +{ + uint32 val=0,which=0; + + switch(key) + { + case SDLK_RETURN: + which=0; + val=SNES_START_MASK; + break; + case SDLK_LCTRL: + which=0; + val=SNES_B_MASK; + break; + case SDLK_LALT: + which=0; + val=SNES_A_MASK; + break; + case SDLK_SPACE: + which=0; + val=SNES_X_MASK; + break; + case SDLK_LSHIFT: + which=0; + val=SNES_Y_MASK; + break; + case SDLK_TAB: + which=0; + val=SNES_TR_MASK; + break; + case SDLK_BACKSPACE: + which=0; + val=SNES_TL_MASK; + break; + case SDLK_LEFT: + which=0; + val=SNES_LEFT_MASK; + break; + case SDLK_RIGHT: + which=0; + val=SNES_RIGHT_MASK; + break; + case SDLK_UP: + which=0; + val=SNES_UP_MASK; + break; + case SDLK_DOWN: + which=0; + val=SNES_DOWN_MASK; + break; +#ifndef DREAMCAST + case SDLK_BACKSLASH: + which=0; + val=SNES_SELECT_MASK; + break; +#endif + + + case SDLK_z: + which=1; + val=SNES_START_MASK; + break; + case SDLK_e: + which=1; + val=SNES_B_MASK; + break; + case SDLK_q: + which=1; + val=SNES_A_MASK; + break; + case SDLK_x: + which=1; + val=SNES_X_MASK; + break; + case SDLK_c: + which=1; + val=SNES_Y_MASK; + break; + case SDLK_1: + which=1; + val=SNES_TR_MASK; + break; + case SDLK_2: + which=1; + val=SNES_TL_MASK; + break; + case SDLK_a: + which=1; + val=SNES_LEFT_MASK; + break; + case SDLK_d: + which=1; + val=SNES_RIGHT_MASK; + break; + case SDLK_w: + which=1; + val=SNES_UP_MASK; + break; + case SDLK_s: + which=1; + val=SNES_DOWN_MASK; + break; +#ifndef DREAMCAST + case SDLK_3: + which=1; + val=SNES_SELECT_MASK; + break; +#endif + + + + case SDLK_v: + which=2; + val=SNES_START_MASK; + break; + case SDLK_y: + which=2; + val=SNES_B_MASK; + break; + case SDLK_r: + which=2; + val=SNES_A_MASK; + break; + case SDLK_b: + which=2; + val=SNES_X_MASK; + break; + case SDLK_n: + which=2; + val=SNES_Y_MASK; + break; + case SDLK_4: + which=2; + val=SNES_TR_MASK; + break; + case SDLK_5: + which=2; + val=SNES_TL_MASK; + break; + case SDLK_f: + which=2; + val=SNES_LEFT_MASK; + break; + case SDLK_h: + which=2; + val=SNES_RIGHT_MASK; + break; + case SDLK_t: + which=2; + val=SNES_UP_MASK; + break; + case SDLK_g: + which=2; + val=SNES_DOWN_MASK; + break; +#ifndef DREAMCAST + case SDLK_7: + which=2; + val=SNES_SELECT_MASK; + break; +#endif + + + + case SDLK_m: + which=3; + val=SNES_START_MASK; + break; + case SDLK_o: + which=3; + val=SNES_B_MASK; + break; + case SDLK_u: + which=3; + val=SNES_A_MASK; + break; + case SDLK_COMMA: + which=3; + val=SNES_X_MASK; + break; + case SDLK_PERIOD: + which=3; + val=SNES_Y_MASK; + break; + case SDLK_8: + which=3; + val=SNES_TR_MASK; + break; + case SDLK_9: + which=3; + val=SNES_TL_MASK; + break; + case SDLK_j: + which=3; + val=SNES_LEFT_MASK; + break; + case SDLK_l: + which=3; + val=SNES_RIGHT_MASK; + break; + case SDLK_i: + which=3; + val=SNES_UP_MASK; + break; + case SDLK_k: + which=3; + val=SNES_DOWN_MASK; + break; +#ifndef DREAMCAST + case SDLK_0: + which=3; + val=SNES_SELECT_MASK; + break; +#endif + + default: + return; + } + + if (pressed) + joypad_val[which]|=val; + else + joypad_val[which]^=val; + +// printf("%s %s -> JOYPAD[%i]=0x%X\n",pressed?"Press":"Unpress", SDL_GetKeyName(key),which,joypad_val[which]); +} +#endif + +extern "C" +void S9xSaveStateProcess(void) { + extern int saveMenu_n_savestate; + char fname[256]; + char fnamebase[256]; + switch (saveMenu_n_savestate) { + case 1: strcpy(fname, S9xGetFilename(".1ssn")); strcpy(fnamebase, S9xGetFilenameBase(".1ssn",1)); break; + case 2: strcpy(fname, S9xGetFilename(".2ssn")); strcpy(fnamebase, S9xGetFilenameBase(".2ssn",1));break; + case 3: strcpy(fname, S9xGetFilename(".3ssn")); strcpy(fnamebase, S9xGetFilenameBase(".3ssn",1));break; + default: strcpy(fname, S9xGetFilename(".ssn")); strcpy(fnamebase, S9xGetFilenameBase(".ssn",1)); + } +#ifdef USE_GL + if (savestate_state&1) + S9xSetInfoString("Saving Savestate"); + else + S9xSetInfoString("Loading Savestate"); +#endif + if (savestate_state<0) { + if (savestate_state<-10) { + savestate_state+=10; + } else { + savestate_state=-savestate_state; + } + return; + } + _snes4all_sound_enable_=0; + while(!_snes4all_sound_enable_) + SDL_Delay(60); + if (savestate_state==1){ +#ifndef USE_GL + show_please_wait(" Saving state",screen); +#endif + int ret=S9xFreezeGame (fname); +#ifdef USE_GL + if (ret) + S9xSetInfoString("Savestate saved"); + else + S9xSetInfoString("Savestate save ERROR"); +#endif +#ifdef DREAMCAST + if (!sdcard_exists && ret) { + ret=save_to_vmu(fnamebase); +#ifdef USE_GL + if (!ret) + S9xSetInfoString("VMU Savestate save ERROR"); +#endif + } +#endif + } else if (savestate_state==2) { +#ifndef USE_GL + show_please_wait(" Loading state",screen); +#endif + int ret=1; +#ifdef DREAMCAST + if (!sdcard_exists) { + ret=load_from_vmu(fnamebase); +#ifdef USE_GL + if (!ret) + S9xSetInfoString("VMU Savestate load ERROR"); +#endif + } +#endif + if (ret) { + ret=S9xLoadSnapshot (fname); +#ifdef USE_GL + if (ret) + S9xSetInfoString("Savestate loaded"); + else + S9xSetInfoString("Savestate load ERROR"); +#endif + } + } + debug_reset_frameskip(); + _snes4all_sound_enable_=snes4all_sound_enable; + savestate_state=0; +} + +void S9xProcessEvents (bool8 block) +{ +#ifdef AUTO_LOADSAVESTATE + static int yet_loaded=0; + if (!yet_loaded) { + S9xLoadSnapshot (AUTO_LOADSAVESTATE); +//Settings.Transparency=0; + yet_loaded=1; + } +#endif +#ifdef AUTO_EVENTS + static unsigned cuenta=0; + +//printf("Event %i\n",cuenta); +#ifdef DEBUG_CPU + if (cuenta>=DEBUG_CPU) { + cpu_debugging=1; + printf("---- EVENT %i ----\n",cuenta); + } +#endif +#ifdef DEBUG_CPU_END + if (cuenta>=DEBUG_CPU_END) { +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit(0); + } +#endif + +/* JAMESPOND: +if (cuenta==10) joypad_val[0]|=SNES_START_MASK; +else if (cuenta==12) joypad_val[0]^=SNES_START_MASK; +else if (cuenta==15) joypad_val[0]|=SNES_Y_MASK; */ +if (cuenta==2) joypad_val[0]|=SNES_START_MASK; +else if (cuenta==4) joypad_val[0]^=SNES_START_MASK; +#if 0 + switch(cuenta&127) + { + case 3: + joypad_val[0]|=SNES_START_MASK; + break; + case 10: + joypad_val[0]^=SNES_START_MASK; + break; + } +#endif +#ifdef MAX_AUTO_EVENTS + if (cuenta>MAX_AUTO_EVENTS) + { +#ifdef PROFILER_SNES4ALL + snes4all_prof_show(); +#endif +#ifdef DEBUG_FRAMESKIP + print_frameskip(); +#endif +#ifdef DEBUG_TILECACHE + print_tileche_eficience(); +#endif +#ifdef USE_MMU + mmu_handle_quit(); +#endif + exit(0); + } +#endif + cuenta++; +#else +#ifndef DREAMCAST + uint32 num = 0; + static bool8 TURBO = FALSE; +#else + static bool8 start_holded = FALSE; +#endif + + SDL_Event event; + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_QUIT: + S9xExit(); + break; +#ifdef DREAMCAST + case SDL_JOYAXISMOTION: + if (savestate_state || savestate_tostate) break; + if (event.jaxis.axis==0) + { + if (start_holded) { + if (event.jaxis.value<-120) { +#ifdef USE_GL + savestate_tostate=-41; +#else + savestate_tostate=1; +#endif + keyprocess(SDLK_RETURN,SDL_FALSE); + start_holded=FALSE; + } else if (event.jaxis.value>120) { +#ifdef USE_GL + savestate_tostate=-42; +#else + savestate_tostate=2; +#endif + keyprocess(SDLK_RETURN,SDL_FALSE); + start_holded=FALSE; + } + } else { + if (event.jaxis.value<-120) + goMenu(); + } + } + else + if (event.jaxis.axis==1) + { + if (event.jaxis.value>100) + joypad_val[event.jaxis.which]|=SNES_SELECT_MASK; + else + joypad_val[event.jaxis.which]&=~SNES_SELECT_MASK; + } + break; +#endif + case SDL_KEYDOWN: + keyprocess(event.key.keysym.sym,SDL_TRUE); + +#ifdef DREAMCAST + if (event.key.keysym.sym==SDLK_RETURN) { + start_holded=TRUE; + savestate_tostate=savestate_state=0; + } +#else + if (event.key.keysym.sym == SDLK_ESCAPE) + S9xExit(); + else + if (event.key.keysym.sym == SDLK_F11) + goMenu(); + else + if (event.key.keysym.sym == SDLK_F12) + SDL_WM_ToggleFullScreen(screen); + else + if (event.key.keysym.sym == SDLK_PAGEUP) + { + if (!TURBO) { + TURBO = TRUE; + OldSkipFrame = Settings.SkipFrames; + Settings.SkipFrames = 10; + } + } + else + if (event.key.keysym.sym == SDLK_F1) PPU.BG_Forced ^= 1; + else if (event.key.keysym.sym == SDLK_F2) PPU.BG_Forced ^= 2; + else if (event.key.keysym.sym == SDLK_F3) PPU.BG_Forced ^= 4; + else if (event.key.keysym.sym == SDLK_F4) PPU.BG_Forced ^= 8; + else if (event.key.keysym.sym == SDLK_F5) PPU.BG_Forced ^= 16; + else if (event.key.keysym.sym == SDLK_F6) num = 1; + else if (event.key.keysym.sym == SDLK_F7) num = 2; + else if (event.key.keysym.sym == SDLK_F8) num = 3; + else if (event.key.keysym.sym == SDLK_F9) num = 4; + else if (event.key.keysym.sym == SDLK_F10) { + S9xReset(); + } + if (num) { + char fname[256], ext[8]; + sprintf(ext, ".00%d", num - 1); + strcpy(fname, S9xGetFilename (ext)); + if (event.key.keysym.mod & KMOD_SHIFT) + S9xFreezeGame (fname); + else + S9xLoadSnapshot (fname); + } +#endif + break; + case SDL_KEYUP: + keyprocess(event.key.keysym.sym,SDL_FALSE); +#ifdef DREAMCAST + if (event.key.keysym.sym==SDLK_RETURN) { + start_holded=FALSE; + savestate_state=savestate_tostate; + savestate_tostate=0; + } +#else + if (event.key.keysym.sym == SDLK_PAGEUP) + if (TURBO) { + TURBO = FALSE; + Settings.SkipFrames = OldSkipFrame; + } +#endif + break; + } + } +#endif +} + +#ifdef _ZAURUS +static long log2 (long num) +{ + long n = 0; + + while (num >>= 1) + n++; + + return (n); +} +#endif + +#ifdef SNES4ALL_PLAYBACK_RATE +static int Rates[8] = +{ + 0, 8192, 11025, 16500, 22050, 29300, 36600, 44000 +}; +#endif + +static int BufferSizes [8] = +{ + 0, 256, 256, 256, 512, 512, 1024, 1024 +}; + +#ifdef USE_MENU_MUSIC +static Mix_Chunk *sample_beep=NULL; +static Mix_Music *menu_music=NULL; +#endif + +void update_sdl_audio(void *userdata, Uint8 * stream, int len); +void sound_play_menu_music(void) +{ +#ifdef USE_MENU_MUSIC + if (menu_music) + { + Mix_PlayMusic(menu_music,-1); + Mix_VolumeMusic(MUSIC_VOLUME); + } +#endif +} + +void sound_play_beep(void) +{ +#ifdef USE_MENU_MUSIC + if (sample_beep) + Mix_PlayChannel(0,sample_beep,0); +#endif +} + +void sound_enable_music(void) +{ +#ifdef USE_MENU_MUSIC + SDL_PauseAudio(1); +#ifdef DREAMCAST + SDL_DC_RestoreSoundBuffer(); +#endif + Mix_HookMusic(NULL,NULL); + SDL_PauseAudio(0); + Mix_VolumeMusic(MUSIC_VOLUME); +#endif +} + +void sound_disable_music(void) +{ +#ifdef USE_MENU_MUSIC + SDL_PauseAudio(1); + Mix_HookMusic(&update_sdl_audio,NULL); + SDL_PauseAudio(0); +#endif +} + + +bool8 S9xOpenSoundDevice (int mode, bool8 stereo, int buffer_size) +{ +#ifdef SNES4ALL_STEREO + so.stereo = stereo; +#endif +#ifdef SNES4ALL_PLAYBACK_RATE + so.playback_rate = Rates[mode & 0x07]; +#endif + S9xSetPlaybackRate (PLAYBACK_RATE); + + if (buffer_size == 0) + buffer_size = BufferSizes [mode & 7]; + if (buffer_size > MAX_BUFFER_SIZE / 4) + buffer_size = MAX_BUFFER_SIZE / 4; + so.buffer_size=buffer_size; +#ifdef USE_MENU_MUSIC + Mix_OpenAudio(PLAYBACK_RATE,AUDIO_S16, SOUND_STEREO?2:1,so.buffer_size); + sample_beep=Mix_LoadWAV(DATA_PREFIX "beep.wav"); + menu_music=Mix_LoadMUS(DATA_PREFIX "music.mod"); +#else + SDL_AudioSpec fmt; + fmt.freq = PLAYBACK_RATE; + fmt.format = AUDIO_S16; + fmt.channels = SOUND_STEREO?2:1; + fmt.samples = so.buffer_size; + fmt.callback = update_sdl_audio; + if ( SDL_OpenAudio(&fmt, NULL) < 0 ) + return (FALSE); + _snes4all_sound_enable_=0; + SDL_PauseAudio(0); +#endif + return (TRUE); +} + +static uint8 Buf[MAX_BUFFER_SIZE*2]; + +#define FIXED_POINT 0x10000 +#define FIXED_POINT_SHIFT 16 +#define FIXED_POINT_REMAINDER 0xffff + +void S9xGenerateSound () +{ +//puts("/"); +#ifndef NOSOUND + if (_snes4all_sound_enable_<3) + return; + int buffer_size = so.buffer_size; + int bytes_so_far = (so.samples_mixed_so_far << 1); + if (bytes_so_far >= buffer_size) + return; + + + so.err_counter += ERR_RATE; + if (so.err_counter >= FIXED_POINT) + { + int sample_count = so.err_counter >> FIXED_POINT_SHIFT; + int byte_offset; + + so.err_counter &= FIXED_POINT_REMAINDER; +#ifdef SNES4ALL_STEREO + if (so.stereo) + sample_count <<= 1; +#endif + byte_offset = bytes_so_far + so.play_position; + +//unsigned ndo=0; + do + { +// printf("do%i\n",ndo++); + int sc = sample_count; + int byte_count = sample_count; + byte_count <<= 1; + + if ((byte_offset & SOUND_BUFFER_SIZE_MASK) + byte_count > SOUND_BUFFER_SIZE) + { + sc = SOUND_BUFFER_SIZE - (byte_offset & SOUND_BUFFER_SIZE_MASK); + byte_count = sc; + sc >>= 1; + } + if (bytes_so_far + byte_count > buffer_size) + { + byte_count = buffer_size - bytes_so_far; + if (byte_count == 0) + break; + sc = byte_count; + sc >>= 1; + } +#ifdef USE_MIXSMAPLES0 + S9xMixSamplesO (Buf, sc, byte_offset & SOUND_BUFFER_SIZE_MASK); +#else + S9xMixSamples (Buf + (byte_offset & SOUND_BUFFER_SIZE_MASK), sc); +#endif + so.samples_mixed_so_far += sc; + sample_count -= sc; + bytes_so_far = (so.samples_mixed_so_far << 1); + byte_offset += byte_count; + } while (sample_count > 0); + } +#endif +// puts("\\"); +} + + +void update_sdl_audio(void *userdata, Uint8 * stream, int len) +{ +#ifndef NOSOUND + if (_snes4all_sound_enable_<=0) { +#ifdef DREAMCAST + SDL_DC_RestoreSoundBuffer(); +#endif + bzero(stream,len); + _snes4all_sound_enable_=-1; + return; + } + int sample_count = len>>1; + if (so.samples_mixed_so_far < sample_count) + { + int byte_offset = so.play_position + (so.samples_mixed_so_far << 1); +#ifdef USE_MIXSMAPLES0 + S9xMixSamplesO (Buf, sample_count - so.samples_mixed_so_far, byte_offset & SOUND_BUFFER_SIZE_MASK); +#else + S9xMixSamples (Buf+(byte_offset & SOUND_BUFFER_SIZE_MASK), sample_count - so.samples_mixed_so_far); +#endif + so.samples_mixed_so_far = 0; + } + else + so.samples_mixed_so_far -= sample_count; + + +// if (!so.mute_sound) +#ifndef DREAMCAST + memcpy(stream,Buf+so.play_position,len); +#else + SDL_DC_SetSoundBuffer(Buf+so.play_position); +#endif + so.play_position = (so.play_position + len) & SOUND_BUFFER_SIZE_MASK; +#endif +} + + +uint32 S9xReadJoypad (int which1) +{ + return joypad_val[which1]; +} + +#if 0 +static int S9xCompareSDD1IndexEntries (const void *p1, const void *p2) +{ + return (*(uint32 *) p1 - *(uint32 *) p2); +} +#endif + +void S9xLoadSDD1Data () +{ + char filename [_MAX_PATH + 1]; +#if 0 + char index [_MAX_PATH + 1]; + char data [_MAX_PATH + 1]; + char patch [_MAX_PATH + 1]; +#endif + + CMemory_FreeSDD1Data (); + + strcpy (filename, S9xGetSnapshotDirectory ()); + + Settings.SDD1Pack=FALSE; + if (strncmp (CMemory_ROMName, "Star Ocean", 10) == 0){ + /*if(SDD1_pack) strcpy (filename, SDD1_pack);*/ +#ifdef SDD1_DECOMP + /*else*/ Settings.SDD1Pack=TRUE; +#else + strcat (filename, "/socnsdd1"); +#endif + } else if(strncmp(CMemory_ROMName, "STREET FIGHTER ALPHA2", 21)==0){ + /*if(SDD1_pack) strcpy (filename, SDD1_pack);*/ +#ifdef SDD1_DECOMP + /*else*/ Settings.SDD1Pack=TRUE; +#else + strcat (filename, "/sfa2sdd1"); +#endif + } else { + /*if(SDD1_pack) strcpy (filename, SDD1_pack);*/ +#ifdef SDD1_DECOMP + /*else*/ Settings.SDD1Pack=TRUE; +#else + S9xMessage(S9X_WARNING, S9X_ROM_INFO, "WARNING: No default SDD1 pack for this ROM"); +#endif + } + +#if 0 + if(Settings.SDD1Pack) return; + + DIR *dir = opendir (filename); + + index [0] = 0; + data [0] = 0; + patch [0] = 0; + + if (dir) + { + struct dirent *d; + + while ((d = readdir (dir))) + { + if (strcasecmp (d->d_name, "SDD1GFX.IDX") == 0) + { + strcpy (index, filename); + strcat (index, "/"); + strcat (index, d->d_name); + } + else + if (strcasecmp (d->d_name, "SDD1GFX.DAT") == 0) + { + strcpy (data, filename); + strcat (data, "/"); + strcat (data, d->d_name); + } + if (strcasecmp (d->d_name, "SDD1GFX.PAT") == 0) + { + strcpy (patch, filename); + strcat (patch, "/"); + strcat (patch, d->d_name); + } + } + closedir (dir); + + if (strlen (index) && strlen (data)) + { + FILE *fs = fopen (index, "rb"); + int len = 0; + + if (fs) + { + // Index is stored as a sequence of entries, each entry being + // 12 bytes consisting of: + // 4 byte key: (24bit address & 0xfffff * 16) | translated block + // 4 byte ROM offset + // 4 byte length + fseek (fs, 0, SEEK_END); + len = ftell (fs); + rewind (fs); + CMemory_SDD1Index = (uint8 *) malloc (len); + fread (CMemory_SDD1Index, 1, len, fs); + fclose (fs); + CMemory_SDD1Entries = len / 12; + + if (!(fs = fopen (data, "rb"))) + { + free ((char *) CMemory_SDD1Index); + CMemory_SDD1Index = NULL; + CMemory_SDD1Entries = 0; + } + else + { + fseek (fs, 0, SEEK_END); + len = ftell (fs); + rewind (fs); + CMemory_SDD1Data = (uint8 *) malloc (len); + fread (CMemory_SDD1Data, 1, len, fs); + fclose (fs); + + if (strlen (patch) > 0 && + (fs = fopen (patch, "rb"))) + { + fclose (fs); + } +#ifdef MSB_FIRST + // Swap the byte order of the 32-bit value triplets on + // MSBFirst machines. + uint8 *ptr = CMemory_SDD1Index; + for (int i = 0; i < CMemory_SDD1Entries; i++, ptr += 12) + { + SWAP_DWORD ((*(uint32 *) (ptr + 0))); + SWAP_DWORD ((*(uint32 *) (ptr + 4))); + SWAP_DWORD ((*(uint32 *) (ptr + 8))); + } +#endif + qsort (CMemory_SDD1Index, CMemory_SDD1Entries, 12, + S9xCompareSDD1IndexEntries); + } + } + } + else + { + fprintf (stderr, "Decompressed data pack not found in '%s'.\n", + filename); + } + } +#endif +} + + diff --git a/src/sdl/save_icon.h b/src/sdl/save_icon.h new file mode 100644 index 0000000..c5690ed --- /dev/null +++ b/src/sdl/save_icon.h @@ -0,0 +1,39 @@ +static const unsigned short vmu_savestate_icon_pal[16] = { + 0xFFFF, 0xFAAA, 0xF569, 0xFCCC, 0xF46C, 0xF888, 0xFC77, 0xFF56, 0xF393, 0xF555, 0xF252, 0xF834, 0xF232, 0xF111, 0xFBA6, 0xFDD4, +}; + +static const unsigned char vmu_savestate_icon_data[512] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x44, 0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x44, 0x44, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x44, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x44, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x25, 0x44, 0x44, 0x44, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x44, 0x44, 0x03, 0x30, 0x33, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x44, 0x44, 0x03, 0x76, 0x67, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x44, 0x44, 0x60, 0x77, 0x77, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x44, 0x24, 0x70, 0x77, 0x77, 0x17, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, 0x71, 0x77, 0x77, 0x67, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x34, 0x76, 0x77, 0x77, 0x77, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x53, 0x88, 0x35, 0x00, 0x42, 0x02, 0x77, 0x77, 0x77, 0x77, 0x01, + 0x30, 0x11, 0x10, 0x11, 0x90, 0x8A, 0x88, 0xA8, 0x01, 0x22, 0x11, 0xBB, 0xB7, 0x7B, 0xB7, 0x09, + 0x53, 0x19, 0x15, 0x59, 0xA5, 0xAA, 0xAA, 0xAA, 0x3A, 0x55, 0x91, 0x51, 0xBB, 0x7B, 0xB7, 0x09, + 0x15, 0x99, 0x19, 0x11, 0xAC, 0xAA, 0xAA, 0xCA, 0x9A, 0x39, 0x15, 0x39, 0xB5, 0x7B, 0xB7, 0x05, + 0x93, 0x55, 0x55, 0x13, 0x8C, 0x8A, 0xA8, 0xAA, 0xAA, 0x19, 0x15, 0x35, 0xB5, 0x7B, 0x6B, 0x01, + 0x59, 0x55, 0x55, 0x51, 0x8C, 0x8A, 0xAA, 0xAA, 0xAA, 0x55, 0x51, 0x35, 0x19, 0x7B, 0x6B, 0x01, + 0x95, 0x55, 0x55, 0x95, 0xAC, 0xCA, 0xAA, 0xAC, 0xDA, 0x55, 0x11, 0x59, 0x15, 0xBB, 0xBC, 0xC9, + 0x51, 0x05, 0x15, 0x99, 0xC9, 0xAA, 0xA8, 0xAA, 0xCA, 0x99, 0x93, 0x55, 0x51, 0xBB, 0xBB, 0x55, + 0x00, 0x00, 0x00, 0x15, 0x99, 0xAA, 0x88, 0xAA, 0x9C, 0xE9, 0xEE, 0x3E, 0x00, 0x76, 0x37, 0x00, + 0x00, 0x00, 0x30, 0x9C, 0xC9, 0xDD, 0xCC, 0xDD, 0xEC, 0xFF, 0xFF, 0xFF, 0x0E, 0x76, 0x06, 0x00, + 0x00, 0x00, 0x90, 0x9C, 0xC9, 0xDD, 0xDD, 0xCC, 0xFC, 0xFF, 0xFF, 0xFF, 0x3F, 0x66, 0x00, 0x00, + 0x00, 0x00, 0x90, 0xC9, 0x99, 0xCC, 0xCC, 0xCC, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x50, 0x95, 0xC9, 0xCC, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x90, 0xC9, 0x9C, 0xC9, 0xCC, 0xDD, 0xFE, 0xFF, 0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0xD9, 0xDC, 0xCC, 0xCC, 0xDC, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x93, 0xDC, 0xDD, 0xDD, 0xC9, 0xE5, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0xDC, 0xDD, 0xCC, 0x01, 0xFE, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xD9, 0xDC, 0x00, 0x30, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, + }; + diff --git a/src/sdl/sdl.cpp b/src/sdl/sdl.cpp new file mode 100644 index 0000000..f37859f --- /dev/null +++ b/src/sdl/sdl.cpp @@ -0,0 +1,473 @@ +/* + * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + * + * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and + * Jerremy Koot (jkoot@snes9x.com) + * + * Super FX C emulator code + * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and + * Gary Henderson. + * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_. + * + * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson. + * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_. + * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com). + * + * DOS port code contains the works of other authors. See headers in + * individual files. + * + * Snes9x homepage: http://www.snes9x.com + * + * Permission to use, copy, modify and distribute Snes9x in both binary and + * source form, for non-commercial purposes, is hereby granted without fee, + * providing that this license information and copyright notice appear with + * all copies and any derived work. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event shall the authors be held liable for any damages + * arising from the use of this software. + * + * Snes9x is freeware for PERSONAL USE only. Commercial users should + * seek permission of the copyright holders first. Commercial use includes + * charging money for Snes9x or software derived from Snes9x. + * + * The copyright holders request that bug fixes and improvements to the code + * should be forwarded to them so everyone can benefit from the modifications + * in future versions. + * + * Super NES and Super Nintendo Entertainment System are trademarks of + * Nintendo Co., Limited and its subsidiary companies. + */ +#ifdef DREAMCAST +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#ifdef DREAMCAST +#include +#endif + +#include "snes9x.h" +#include "memmap.h" +#include "debug.h" +#include "ppu.h" +#include "snapshot.h" +#include "gfx.h" +#include "display.h" +#include "apu.h" +#include "keydef.h" + +#include "snes4all.h" +#include "videogl.h" + +#define COUNT(a) (sizeof(a) / sizeof(a[0])) + +SDL_Surface *screen, *gfxscreen; +#if 0 +uint16 *RGBconvert; +#endif +extern uint32 cl, cs; + +#if 0 +int S9xMinCommandLineArgs () +{ + return (2); +} + +void S9xGraphicsMode () +{ +} + +void S9xTextMode () +{ +} +#endif + +#ifdef DREAMCAST +#include +extern "C" { void fs_sdcard_shutdown(void); void fs_sdcard_init(void); int fs_sdcard_unmount(void); int fs_sdcard_mount(void); void sci_init(void); } + +int sdcard_exists=0; +void reinit_sdcard(void) +{ + static uint32 last=(uint32)-5000; + uint32 now=(((unsigned long long)timer_us_gettime64())>>10); + if (now-last>5000) { + char *dir="/sd/snes4all"; + DIR *d=NULL; + fs_sdcard_shutdown(); + timer_spin_sleep(111); + fs_sdcard_init(); + timer_spin_sleep(111); + fs_mkdir(dir); + d=opendir(dir); + sdcard_exists=(d!=NULL); + if (d) + closedir(d); + last=now; + } +} +#else +#define reinit_sdcard() +#endif + +void S9xInitDisplay (int /*argc*/, char ** /*argv*/) +{ + Uint32 flags=SDL_HWSURFACE|SDL_DOUBLEBUF; +#if defined(DREAMCAST) && defined(NORES256) + flags|=SDL_FULLSCREEN; +#endif +#if defined(DREAMCAST) && ( defined(DEBUG_FRAMESKIP) || defined(AUTO_EVENTS) || defined(AUTOLOAD) || defined(DEBUG_TILECACHE) || defined(PROFILER_SNES4ALL) ) + SDL_DC_ShowAskHz(SDL_FALSE); +#endif + if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_JOYSTICK) < 0 ) + { + printf("Could not initialize SDL(%s)\n", SDL_GetError()); + S9xExit(); + } +#if defined(DREAMCAST) && defined(DEBUG_FRAMESKIP) + SDL_DC_ShowAskHz(SDL_FALSE); +#endif +#ifndef USE_GL +#if defined(DREAMCAST) && !defined(NORES256) + SDL_DC_SetVideoDriver(SDL_DC_TEXTURED_VIDEO); + screen = SDL_SetVideoMode(SNES4ALL_SCREEN_WIDTH, SNES4ALL_SCREEN_WIDTH, SNES4ALL_SCREEN_DEPTH, flags); + SDL_DC_SetWindow(SNES4ALL_SCREEN_WIDTH, SNES4ALL_SCREEN_HEIGHT); +#else + screen = SDL_SetVideoMode(SNES4ALL_SCREEN_WIDTH, SNES4ALL_SCREEN_HEIGHT, SNES4ALL_SCREEN_DEPTH, flags); +#endif + if (screen == NULL) +#else + if (!videogl_init()) +#endif + { + printf("Couldn't set video mode: %s\n", SDL_GetError()); + S9xExit(); + } +#ifndef DREAMCAST + atexit(SDL_Quit); +#else + SDL_JoystickEventState(SDL_ENABLE); + SDL_JoystickOpen(0); + SDL_JoystickOpen(1); + SDL_JoystickOpen(2); + SDL_JoystickOpen(3); + SDL_DC_EmulateKeyboard(SDL_TRUE); +#endif + GFX.Screen = (uint8 *)screen->pixels +#ifdef NORES256 + + 64 +#endif + ; + GFX.Pitch = SNES4ALL_SCREEN_PITCH; + GFX.SubScreen = (uint8 *)calloc(512 * 480, SNES4ALL_SCREEN_DEPTH_BYTES); + GFX.ZBuffer = (uint8 *)calloc(512 * 480, SNES4ALL_SCREEN_DEPTH_BYTES); + GFX.SubZBuffer = (uint8 *)calloc(512 * 480, SNES4ALL_SCREEN_DEPTH_BYTES); + +#if 0 + RGBconvert = (uint16 *)malloc(65536 * SNES4ALL_SCREEN_DEPTH_BYTES); + if (!RGBconvert) + { +// OutOfMemory(); + S9xExit(); + } + for (uint32 i = 0; i < 65536; i++) + ((uint16 *)(RGBconvert))[i] = ((i >> 11) << 10) | ((((i >> 5) & 63) >> 1) << 5) | (i & 31); +#endif + reinit_sdcard(); +} + +void S9xDeinitDisplay () +{ +// SDL_FreeSurface(gfxscreen); + SDL_FreeSurface(screen); + free(GFX.SubScreen); + free(GFX.ZBuffer); + free(GFX.SubZBuffer); +} + +#if 0 +void S9xSetPalette () +{ +} + +void S9xSetTitle (const char * /*title*/) +{ +} + +const char *S9xSelectFilename (const char *def, const char *dir1, + const char *ext1, const char *title) +{ + static char path [PATH_MAX]; + char buffer [PATH_MAX]; + + S9xTextMode (); + printf ("\n%s (default: %s): ", title, def); + fflush (stdout); + if (fgets (buffer, sizeof (buffer) - 1, stdin)) + { + char *p = buffer; + while (isspace (*p) || *p == '\n') + p++; + if (!*p) + { + strcpy (buffer, def); + p = buffer; + } + + char *q = strrchr (p, '\n'); + if (q) + *q = 0; + + char fname [PATH_MAX]; + char drive [_MAX_DRIVE]; + char dir [_MAX_DIR]; + char ext [_MAX_EXT]; + + _splitpath (p, drive, dir, fname, ext); + _makepath (path, drive, *dir ? dir : dir1, fname, *ext ? ext : ext1); + S9xGraphicsMode (); + return (path); + } + S9xGraphicsMode (); + return (NULL); +} + +void S9xParseDisplayArg (char **argv, int &ind, int) +{ +} + +void S9xExtraUsage () +{ +} + +bool8 S9xReadMousePosition (int /* which1 */, int &/* x */, int & /* y */, + uint32 & /* buttons */) +{ + return (FALSE); +} + +bool8 S9xReadSuperScopePosition (int & /* x */, int & /* y */, + uint32 & /* buttons */) +{ + return (FALSE); +} + +bool JustifierOffscreen() +{ + return false; +} + +void JustifierButtons(uint32 justifiers) +{ +} +#endif + +void S9xMessage (int /* type */, int /* number */, const char *message) +{ +#ifdef USE_GL + S9xSetInfoString(message); +#endif +#ifndef DREAMCAST + fprintf (stderr, "%s\n", message); +#endif +} + + +START_EXTERN_C +uint8 snes9x_clear_change_log = 0; +END_EXTERN_C + +const char *S9xGetFilenameInc (const char *e) +{ + static char filename [_MAX_PATH + 1]; + char drive [_MAX_DRIVE + 1]; + char dir [_MAX_DIR + 1]; + char fname [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + char *ptr; + struct stat buf; + + if (strlen (S9xGetSnapshotDirectory())) + { + _splitpath (CMemory_ROMFilename, drive, dir, fname, ext); + strcpy (filename, S9xGetSnapshotDirectory()); + strcat (filename, "/"); + strcat (filename, fname); + ptr = filename + strlen (filename); + strcat (filename, "00/"); + strcat (filename, e); + } + else + { + _splitpath (CMemory_ROMFilename, drive, dir, fname, ext); + strcat (fname, "00/"); + _makepath (filename, drive, dir, fname, e); + ptr = strstr (filename, "00/"); + } + + do + { + if (++*(ptr + 2) > '9') + { + *(ptr + 2) = '0'; + if (++*(ptr + 1) > '9') + { + *(ptr + 1) = '0'; + if (++*ptr > '9') + break; + } + } + } while( stat(filename, &buf) == 0 ); + + return (filename); +} + +#if 0 +START_EXTERN_C +char* osd_GetPackDir() +{ + static char filename[_MAX_PATH]; + memset(filename, 0, _MAX_PATH); + + if(strlen(S9xGetSnapshotDirectory())!=0) + strcpy (filename, S9xGetSnapshotDirectory()); + else + { + char dir [_MAX_DIR + 1]; + char drive [_MAX_DRIVE + 1]; + char name [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + _splitpath(CMemory_ROMFilename, drive, dir, name, ext); + _makepath(filename, drive, dir, NULL, NULL); + } + + if(!strncmp((char*)&CMemory_ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) + { + if (getenv("SPL4PACK")) + return getenv("SPL4PACK"); + else + strcat(filename, "/SPL4-SP7"); + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "MOMOTETSU HAPPY ",21)) + { + if (getenv("MDHPACK")) + return getenv("MDHPACK"); + else + strcat(filename, "/SMHT-SP7"); + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) + { + if (getenv("FEOEZPACK")) + return getenv("FEOEZPACK"); + else + strcat(filename, "/FEOEZSP7"); + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) + { + if (getenv("SJNSPACK")) + return getenv("SJNSPACK"); + else + strcat(filename, "/SJUMPSP7"); + } else strcat(filename, "/MISC-SP7"); + return filename; +} +END_EXTERN_C +#endif + + + +#ifdef PROFILER_SNES4ALL + +static unsigned snes4all_prof_total_initial=0; +unsigned snes4all_prof_total=0; +static char *snes4all_prof_msg[SNES4ALL_PROFILER_MAX]; +unsigned long long snes4all_prof_initial[SNES4ALL_PROFILER_MAX]; +unsigned long long snes4all_prof_sum[SNES4ALL_PROFILER_MAX]; +unsigned long long snes4all_prof_executed[SNES4ALL_PROFILER_MAX]; +int snes4all_prof_started[SNES4ALL_PROFILER_MAX]; + + +void snes4all_prof_init(void) +{ + unsigned i; +#ifndef DREAMCAST + unsigned long long s=SDL_GetTicks(); +#else + unsigned long long s=timer_us_gettime64(); +#endif + for(i=0;i=0;i--) + snes4all_prof_end(i); + + double toper=0; +#ifndef DREAMCAST + unsigned long long to=SDL_GetTicks()-snes4all_prof_total_initial; +#else + unsigned long long to=snes4all_prof_sum[0]+snes4all_prof_sum[1]; + for(i=0;ito) + snes4all_prof_sum[i]=0; +#endif + + puts("\n\n\n\n"); + puts("--------------------------------------------"); + for(i=0;i Ticks=%i -> %iK veces\n",snes4all_prof_msg[i],percent,((unsigned)t0),(unsigned)(snes4all_prof_executed[i]>>10)); + } +// printf("TOTAL: %.2f%% -> Ticks=%i\n",toper,to); + puts("--------------------------------------------"); fflush(stdout); +} +#endif + +/* extern "C" { +unsigned mirame(unsigned dato) +{ + if (!dato) goto salta; + asm("nop;nop;"); return 1; +salta: + asm("nop;nop;"); return 0; +} +}*/ diff --git a/src/sdl/soundux.cpp b/src/sdl/soundux.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/sdl/vgl.h b/src/sdl/vgl.h new file mode 100644 index 0000000..c9a2133 --- /dev/null +++ b/src/sdl/vgl.h @@ -0,0 +1,540 @@ +static float vgl_tx0[]={ + 0.000, 1.000, 0.000, 1.000, + 0.000, 0.875, 0.000, 0.875, + 0.000, 0.750, 0.000, 0.750, + 0.000, 0.625, 0.000, 0.625, + 0.000, 0.500, 0.000, 0.500, + 0.000, 0.375, 0.000, 0.375, + 0.000, 0.250, 0.000, 0.250, + 0.000, 0.125, 0.000, 0.125, +}; + +static float vgl_tx1[]={ + 1.000, 0.000, 1.000, 0.000, + 0.875, 0.000, 0.875, 0.000, + 0.750, 0.000, 0.750, 0.000, + 0.625, 0.000, 0.625, 0.000, + 0.500, 0.000, 0.500, 0.000, + 0.375, 0.000, 0.375, 0.000, + 0.250, 0.000, 0.250, 0.000, + 0.125, 0.000, 0.125, 0.000, +}; + +static float vgl_ty0[]={ +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +0.000, 0.000, 1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, +0.125, 0.125, 1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, +0.250, 0.250, 1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, +0.375, 0.375, 1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, +0.500, 0.500, 1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, +0.625, 0.625, 1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, +0.750, 0.750, 1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, +0.875, 0.875, 1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, +1.000, 1.000, 2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, +1.125, 1.125, 2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, +1.250, 1.250, 2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, +1.375, 1.375, 2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, +1.500, 1.500, 2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, +1.625, 1.625, 2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, +1.750, 1.750, 2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, +1.875, 1.875, 2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, +}; + +static float vgl_ty1[]={ +0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, +0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, +0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, 0.250, +0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, 0.375, +0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, 0.500, +0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, +0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, 0.750, +0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, 0.875, +1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, +1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, +1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, 1.250, +1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, 1.375, +1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, +1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, 1.625, +1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, 1.750, +1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, 1.875, +0.125, 0.125, 0.000, 0.000, 0.109, 0.109, 0.000, 0.000, 0.094, 0.094, 0.000, 0.000, 0.078, 0.078, 0.000, 0.000, 0.062, 0.062, 0.000, 0.000, 0.047, 0.047, 0.000, 0.000, 0.031, 0.031, 0.000, 0.000, 0.016, 0.016, 0.000, 0.000, +0.250, 0.250, 0.125, 0.125, 0.234, 0.234, 0.125, 0.125, 0.219, 0.219, 0.125, 0.125, 0.203, 0.203, 0.125, 0.125, 0.188, 0.188, 0.125, 0.125, 0.172, 0.172, 0.125, 0.125, 0.156, 0.156, 0.125, 0.125, 0.141, 0.141, 0.125, 0.125, +0.375, 0.375, 0.250, 0.250, 0.359, 0.359, 0.250, 0.250, 0.344, 0.344, 0.250, 0.250, 0.328, 0.328, 0.250, 0.250, 0.312, 0.312, 0.250, 0.250, 0.297, 0.297, 0.250, 0.250, 0.281, 0.281, 0.250, 0.250, 0.266, 0.266, 0.250, 0.250, +0.500, 0.500, 0.375, 0.375, 0.484, 0.484, 0.375, 0.375, 0.469, 0.469, 0.375, 0.375, 0.453, 0.453, 0.375, 0.375, 0.438, 0.438, 0.375, 0.375, 0.422, 0.422, 0.375, 0.375, 0.406, 0.406, 0.375, 0.375, 0.391, 0.391, 0.375, 0.375, +0.625, 0.625, 0.500, 0.500, 0.609, 0.609, 0.500, 0.500, 0.594, 0.594, 0.500, 0.500, 0.578, 0.578, 0.500, 0.500, 0.562, 0.562, 0.500, 0.500, 0.547, 0.547, 0.500, 0.500, 0.531, 0.531, 0.500, 0.500, 0.516, 0.516, 0.500, 0.500, +0.750, 0.750, 0.625, 0.625, 0.734, 0.734, 0.625, 0.625, 0.719, 0.719, 0.625, 0.625, 0.703, 0.703, 0.625, 0.625, 0.688, 0.688, 0.625, 0.625, 0.672, 0.672, 0.625, 0.625, 0.656, 0.656, 0.625, 0.625, 0.641, 0.641, 0.625, 0.625, +0.875, 0.875, 0.750, 0.750, 0.859, 0.859, 0.750, 0.750, 0.844, 0.844, 0.750, 0.750, 0.828, 0.828, 0.750, 0.750, 0.812, 0.812, 0.750, 0.750, 0.797, 0.797, 0.750, 0.750, 0.781, 0.781, 0.750, 0.750, 0.766, 0.766, 0.750, 0.750, +1.000, 1.000, 0.875, 0.875, 0.984, 0.984, 0.875, 0.875, 0.969, 0.969, 0.875, 0.875, 0.953, 0.953, 0.875, 0.875, 0.938, 0.938, 0.875, 0.875, 0.922, 0.922, 0.875, 0.875, 0.906, 0.906, 0.875, 0.875, 0.891, 0.891, 0.875, 0.875, +1.125, 1.125, 1.000, 1.000, 1.109, 1.109, 1.000, 1.000, 1.094, 1.094, 1.000, 1.000, 1.078, 1.078, 1.000, 1.000, 1.062, 1.062, 1.000, 1.000, 1.047, 1.047, 1.000, 1.000, 1.031, 1.031, 1.000, 1.000, 1.016, 1.016, 1.000, 1.000, +1.250, 1.250, 1.125, 1.125, 1.234, 1.234, 1.125, 1.125, 1.219, 1.219, 1.125, 1.125, 1.203, 1.203, 1.125, 1.125, 1.188, 1.188, 1.125, 1.125, 1.172, 1.172, 1.125, 1.125, 1.156, 1.156, 1.125, 1.125, 1.141, 1.141, 1.125, 1.125, +1.375, 1.375, 1.250, 1.250, 1.359, 1.359, 1.250, 1.250, 1.344, 1.344, 1.250, 1.250, 1.328, 1.328, 1.250, 1.250, 1.312, 1.312, 1.250, 1.250, 1.297, 1.297, 1.250, 1.250, 1.281, 1.281, 1.250, 1.250, 1.266, 1.266, 1.250, 1.250, +1.500, 1.500, 1.375, 1.375, 1.484, 1.484, 1.375, 1.375, 1.469, 1.469, 1.375, 1.375, 1.453, 1.453, 1.375, 1.375, 1.438, 1.438, 1.375, 1.375, 1.422, 1.422, 1.375, 1.375, 1.406, 1.406, 1.375, 1.375, 1.391, 1.391, 1.375, 1.375, +1.625, 1.625, 1.500, 1.500, 1.609, 1.609, 1.500, 1.500, 1.594, 1.594, 1.500, 1.500, 1.578, 1.578, 1.500, 1.500, 1.562, 1.562, 1.500, 1.500, 1.547, 1.547, 1.500, 1.500, 1.531, 1.531, 1.500, 1.500, 1.516, 1.516, 1.500, 1.500, +1.750, 1.750, 1.625, 1.625, 1.734, 1.734, 1.625, 1.625, 1.719, 1.719, 1.625, 1.625, 1.703, 1.703, 1.625, 1.625, 1.688, 1.688, 1.625, 1.625, 1.672, 1.672, 1.625, 1.625, 1.656, 1.656, 1.625, 1.625, 1.641, 1.641, 1.625, 1.625, +1.875, 1.875, 1.750, 1.750, 1.859, 1.859, 1.750, 1.750, 1.844, 1.844, 1.750, 1.750, 1.828, 1.828, 1.750, 1.750, 1.812, 1.812, 1.750, 1.750, 1.797, 1.797, 1.750, 1.750, 1.781, 1.781, 1.750, 1.750, 1.766, 1.766, 1.750, 1.750, +2.000, 2.000, 1.875, 1.875, 1.984, 1.984, 1.875, 1.875, 1.969, 1.969, 1.875, 1.875, 1.953, 1.953, 1.875, 1.875, 1.938, 1.938, 1.875, 1.875, 1.922, 1.922, 1.875, 1.875, 1.906, 1.906, 1.875, 1.875, 1.891, 1.891, 1.875, 1.875, +0.250, 0.250, 0.000, 0.000, 0.219, 0.219, 0.000, 0.000, 0.188, 0.188, 0.000, 0.000, 0.156, 0.156, 0.000, 0.000, 0.125, 0.125, 0.000, 0.000, 0.094, 0.094, 0.000, 0.000, 0.062, 0.062, 0.000, 0.000, 0.031, 0.031, 0.000, 0.000, +0.375, 0.375, 0.125, 0.125, 0.344, 0.344, 0.125, 0.125, 0.312, 0.312, 0.125, 0.125, 0.281, 0.281, 0.125, 0.125, 0.250, 0.250, 0.125, 0.125, 0.219, 0.219, 0.125, 0.125, 0.188, 0.188, 0.125, 0.125, 0.156, 0.156, 0.125, 0.125, +0.500, 0.500, 0.250, 0.250, 0.469, 0.469, 0.250, 0.250, 0.438, 0.438, 0.250, 0.250, 0.406, 0.406, 0.250, 0.250, 0.375, 0.375, 0.250, 0.250, 0.344, 0.344, 0.250, 0.250, 0.312, 0.312, 0.250, 0.250, 0.281, 0.281, 0.250, 0.250, +0.625, 0.625, 0.375, 0.375, 0.594, 0.594, 0.375, 0.375, 0.562, 0.562, 0.375, 0.375, 0.531, 0.531, 0.375, 0.375, 0.500, 0.500, 0.375, 0.375, 0.469, 0.469, 0.375, 0.375, 0.438, 0.438, 0.375, 0.375, 0.406, 0.406, 0.375, 0.375, +0.750, 0.750, 0.500, 0.500, 0.719, 0.719, 0.500, 0.500, 0.688, 0.688, 0.500, 0.500, 0.656, 0.656, 0.500, 0.500, 0.625, 0.625, 0.500, 0.500, 0.594, 0.594, 0.500, 0.500, 0.562, 0.562, 0.500, 0.500, 0.531, 0.531, 0.500, 0.500, +0.875, 0.875, 0.625, 0.625, 0.844, 0.844, 0.625, 0.625, 0.812, 0.812, 0.625, 0.625, 0.781, 0.781, 0.625, 0.625, 0.750, 0.750, 0.625, 0.625, 0.719, 0.719, 0.625, 0.625, 0.688, 0.688, 0.625, 0.625, 0.656, 0.656, 0.625, 0.625, +1.000, 1.000, 0.750, 0.750, 0.969, 0.969, 0.750, 0.750, 0.938, 0.938, 0.750, 0.750, 0.906, 0.906, 0.750, 0.750, 0.875, 0.875, 0.750, 0.750, 0.844, 0.844, 0.750, 0.750, 0.812, 0.812, 0.750, 0.750, 0.781, 0.781, 0.750, 0.750, +1.125, 1.125, 0.875, 0.875, 1.094, 1.094, 0.875, 0.875, 1.062, 1.062, 0.875, 0.875, 1.031, 1.031, 0.875, 0.875, 1.000, 1.000, 0.875, 0.875, 0.969, 0.969, 0.875, 0.875, 0.938, 0.938, 0.875, 0.875, 0.906, 0.906, 0.875, 0.875, +1.250, 1.250, 1.000, 1.000, 1.219, 1.219, 1.000, 1.000, 1.188, 1.188, 1.000, 1.000, 1.156, 1.156, 1.000, 1.000, 1.125, 1.125, 1.000, 1.000, 1.094, 1.094, 1.000, 1.000, 1.062, 1.062, 1.000, 1.000, 1.031, 1.031, 1.000, 1.000, +1.375, 1.375, 1.125, 1.125, 1.344, 1.344, 1.125, 1.125, 1.312, 1.312, 1.125, 1.125, 1.281, 1.281, 1.125, 1.125, 1.250, 1.250, 1.125, 1.125, 1.219, 1.219, 1.125, 1.125, 1.188, 1.188, 1.125, 1.125, 1.156, 1.156, 1.125, 1.125, +1.500, 1.500, 1.250, 1.250, 1.469, 1.469, 1.250, 1.250, 1.438, 1.438, 1.250, 1.250, 1.406, 1.406, 1.250, 1.250, 1.375, 1.375, 1.250, 1.250, 1.344, 1.344, 1.250, 1.250, 1.312, 1.312, 1.250, 1.250, 1.281, 1.281, 1.250, 1.250, +1.625, 1.625, 1.375, 1.375, 1.594, 1.594, 1.375, 1.375, 1.562, 1.562, 1.375, 1.375, 1.531, 1.531, 1.375, 1.375, 1.500, 1.500, 1.375, 1.375, 1.469, 1.469, 1.375, 1.375, 1.438, 1.438, 1.375, 1.375, 1.406, 1.406, 1.375, 1.375, +1.750, 1.750, 1.500, 1.500, 1.719, 1.719, 1.500, 1.500, 1.688, 1.688, 1.500, 1.500, 1.656, 1.656, 1.500, 1.500, 1.625, 1.625, 1.500, 1.500, 1.594, 1.594, 1.500, 1.500, 1.562, 1.562, 1.500, 1.500, 1.531, 1.531, 1.500, 1.500, +1.875, 1.875, 1.625, 1.625, 1.844, 1.844, 1.625, 1.625, 1.812, 1.812, 1.625, 1.625, 1.781, 1.781, 1.625, 1.625, 1.750, 1.750, 1.625, 1.625, 1.719, 1.719, 1.625, 1.625, 1.688, 1.688, 1.625, 1.625, 1.656, 1.656, 1.625, 1.625, +2.000, 2.000, 1.750, 1.750, 1.969, 1.969, 1.750, 1.750, 1.938, 1.938, 1.750, 1.750, 1.906, 1.906, 1.750, 1.750, 1.875, 1.875, 1.750, 1.750, 1.844, 1.844, 1.750, 1.750, 1.812, 1.812, 1.750, 1.750, 1.781, 1.781, 1.750, 1.750, +2.125, 2.125, 1.875, 1.875, 2.094, 2.094, 1.875, 1.875, 2.062, 2.062, 1.875, 1.875, 2.031, 2.031, 1.875, 1.875, 2.000, 2.000, 1.875, 1.875, 1.969, 1.969, 1.875, 1.875, 1.938, 1.938, 1.875, 1.875, 1.906, 1.906, 1.875, 1.875, +0.375, 0.375, 0.000, 0.000, 0.328, 0.328, 0.000, 0.000, 0.281, 0.281, 0.000, 0.000, 0.234, 0.234, 0.000, 0.000, 0.188, 0.188, 0.000, 0.000, 0.141, 0.141, 0.000, 0.000, 0.094, 0.094, 0.000, 0.000, 0.047, 0.047, 0.000, 0.000, +0.500, 0.500, 0.125, 0.125, 0.453, 0.453, 0.125, 0.125, 0.406, 0.406, 0.125, 0.125, 0.359, 0.359, 0.125, 0.125, 0.312, 0.312, 0.125, 0.125, 0.266, 0.266, 0.125, 0.125, 0.219, 0.219, 0.125, 0.125, 0.172, 0.172, 0.125, 0.125, +0.625, 0.625, 0.250, 0.250, 0.578, 0.578, 0.250, 0.250, 0.531, 0.531, 0.250, 0.250, 0.484, 0.484, 0.250, 0.250, 0.438, 0.438, 0.250, 0.250, 0.391, 0.391, 0.250, 0.250, 0.344, 0.344, 0.250, 0.250, 0.297, 0.297, 0.250, 0.250, +0.750, 0.750, 0.375, 0.375, 0.703, 0.703, 0.375, 0.375, 0.656, 0.656, 0.375, 0.375, 0.609, 0.609, 0.375, 0.375, 0.562, 0.562, 0.375, 0.375, 0.516, 0.516, 0.375, 0.375, 0.469, 0.469, 0.375, 0.375, 0.422, 0.422, 0.375, 0.375, +0.875, 0.875, 0.500, 0.500, 0.828, 0.828, 0.500, 0.500, 0.781, 0.781, 0.500, 0.500, 0.734, 0.734, 0.500, 0.500, 0.688, 0.688, 0.500, 0.500, 0.641, 0.641, 0.500, 0.500, 0.594, 0.594, 0.500, 0.500, 0.547, 0.547, 0.500, 0.500, +1.000, 1.000, 0.625, 0.625, 0.953, 0.953, 0.625, 0.625, 0.906, 0.906, 0.625, 0.625, 0.859, 0.859, 0.625, 0.625, 0.812, 0.812, 0.625, 0.625, 0.766, 0.766, 0.625, 0.625, 0.719, 0.719, 0.625, 0.625, 0.672, 0.672, 0.625, 0.625, +1.125, 1.125, 0.750, 0.750, 1.078, 1.078, 0.750, 0.750, 1.031, 1.031, 0.750, 0.750, 0.984, 0.984, 0.750, 0.750, 0.938, 0.938, 0.750, 0.750, 0.891, 0.891, 0.750, 0.750, 0.844, 0.844, 0.750, 0.750, 0.797, 0.797, 0.750, 0.750, +1.250, 1.250, 0.875, 0.875, 1.203, 1.203, 0.875, 0.875, 1.156, 1.156, 0.875, 0.875, 1.109, 1.109, 0.875, 0.875, 1.062, 1.062, 0.875, 0.875, 1.016, 1.016, 0.875, 0.875, 0.969, 0.969, 0.875, 0.875, 0.922, 0.922, 0.875, 0.875, +1.375, 1.375, 1.000, 1.000, 1.328, 1.328, 1.000, 1.000, 1.281, 1.281, 1.000, 1.000, 1.234, 1.234, 1.000, 1.000, 1.188, 1.188, 1.000, 1.000, 1.141, 1.141, 1.000, 1.000, 1.094, 1.094, 1.000, 1.000, 1.047, 1.047, 1.000, 1.000, +1.500, 1.500, 1.125, 1.125, 1.453, 1.453, 1.125, 1.125, 1.406, 1.406, 1.125, 1.125, 1.359, 1.359, 1.125, 1.125, 1.312, 1.312, 1.125, 1.125, 1.266, 1.266, 1.125, 1.125, 1.219, 1.219, 1.125, 1.125, 1.172, 1.172, 1.125, 1.125, +1.625, 1.625, 1.250, 1.250, 1.578, 1.578, 1.250, 1.250, 1.531, 1.531, 1.250, 1.250, 1.484, 1.484, 1.250, 1.250, 1.438, 1.438, 1.250, 1.250, 1.391, 1.391, 1.250, 1.250, 1.344, 1.344, 1.250, 1.250, 1.297, 1.297, 1.250, 1.250, +1.750, 1.750, 1.375, 1.375, 1.703, 1.703, 1.375, 1.375, 1.656, 1.656, 1.375, 1.375, 1.609, 1.609, 1.375, 1.375, 1.562, 1.562, 1.375, 1.375, 1.516, 1.516, 1.375, 1.375, 1.469, 1.469, 1.375, 1.375, 1.422, 1.422, 1.375, 1.375, +1.875, 1.875, 1.500, 1.500, 1.828, 1.828, 1.500, 1.500, 1.781, 1.781, 1.500, 1.500, 1.734, 1.734, 1.500, 1.500, 1.688, 1.688, 1.500, 1.500, 1.641, 1.641, 1.500, 1.500, 1.594, 1.594, 1.500, 1.500, 1.547, 1.547, 1.500, 1.500, +2.000, 2.000, 1.625, 1.625, 1.953, 1.953, 1.625, 1.625, 1.906, 1.906, 1.625, 1.625, 1.859, 1.859, 1.625, 1.625, 1.812, 1.812, 1.625, 1.625, 1.766, 1.766, 1.625, 1.625, 1.719, 1.719, 1.625, 1.625, 1.672, 1.672, 1.625, 1.625, +2.125, 2.125, 1.750, 1.750, 2.078, 2.078, 1.750, 1.750, 2.031, 2.031, 1.750, 1.750, 1.984, 1.984, 1.750, 1.750, 1.938, 1.938, 1.750, 1.750, 1.891, 1.891, 1.750, 1.750, 1.844, 1.844, 1.750, 1.750, 1.797, 1.797, 1.750, 1.750, +2.250, 2.250, 1.875, 1.875, 2.203, 2.203, 1.875, 1.875, 2.156, 2.156, 1.875, 1.875, 2.109, 2.109, 1.875, 1.875, 2.062, 2.062, 1.875, 1.875, 2.016, 2.016, 1.875, 1.875, 1.969, 1.969, 1.875, 1.875, 1.922, 1.922, 1.875, 1.875, +0.500, 0.500, 0.000, 0.000, 0.438, 0.438, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.312, 0.312, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.188, 0.188, 0.000, 0.000, 0.125, 0.125, 0.000, 0.000, 0.062, 0.062, 0.000, 0.000, +0.625, 0.625, 0.125, 0.125, 0.562, 0.562, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.438, 0.438, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.312, 0.312, 0.125, 0.125, 0.250, 0.250, 0.125, 0.125, 0.188, 0.188, 0.125, 0.125, +0.750, 0.750, 0.250, 0.250, 0.688, 0.688, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.562, 0.562, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.438, 0.438, 0.250, 0.250, 0.375, 0.375, 0.250, 0.250, 0.312, 0.312, 0.250, 0.250, +0.875, 0.875, 0.375, 0.375, 0.812, 0.812, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.688, 0.688, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.562, 0.562, 0.375, 0.375, 0.500, 0.500, 0.375, 0.375, 0.438, 0.438, 0.375, 0.375, +1.000, 1.000, 0.500, 0.500, 0.938, 0.938, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.812, 0.812, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.688, 0.688, 0.500, 0.500, 0.625, 0.625, 0.500, 0.500, 0.562, 0.562, 0.500, 0.500, +1.125, 1.125, 0.625, 0.625, 1.062, 1.062, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.938, 0.938, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.812, 0.812, 0.625, 0.625, 0.750, 0.750, 0.625, 0.625, 0.688, 0.688, 0.625, 0.625, +1.250, 1.250, 0.750, 0.750, 1.188, 1.188, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.062, 1.062, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.938, 0.938, 0.750, 0.750, 0.875, 0.875, 0.750, 0.750, 0.812, 0.812, 0.750, 0.750, +1.375, 1.375, 0.875, 0.875, 1.312, 1.312, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.188, 1.188, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.062, 1.062, 0.875, 0.875, 1.000, 1.000, 0.875, 0.875, 0.938, 0.938, 0.875, 0.875, +1.500, 1.500, 1.000, 1.000, 1.438, 1.438, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.312, 1.312, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.188, 1.188, 1.000, 1.000, 1.125, 1.125, 1.000, 1.000, 1.062, 1.062, 1.000, 1.000, +1.625, 1.625, 1.125, 1.125, 1.562, 1.562, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.438, 1.438, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.312, 1.312, 1.125, 1.125, 1.250, 1.250, 1.125, 1.125, 1.188, 1.188, 1.125, 1.125, +1.750, 1.750, 1.250, 1.250, 1.688, 1.688, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.562, 1.562, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.438, 1.438, 1.250, 1.250, 1.375, 1.375, 1.250, 1.250, 1.312, 1.312, 1.250, 1.250, +1.875, 1.875, 1.375, 1.375, 1.812, 1.812, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.688, 1.688, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.562, 1.562, 1.375, 1.375, 1.500, 1.500, 1.375, 1.375, 1.438, 1.438, 1.375, 1.375, +2.000, 2.000, 1.500, 1.500, 1.938, 1.938, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.812, 1.812, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.688, 1.688, 1.500, 1.500, 1.625, 1.625, 1.500, 1.500, 1.562, 1.562, 1.500, 1.500, +2.125, 2.125, 1.625, 1.625, 2.062, 2.062, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.938, 1.938, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.812, 1.812, 1.625, 1.625, 1.750, 1.750, 1.625, 1.625, 1.688, 1.688, 1.625, 1.625, +2.250, 2.250, 1.750, 1.750, 2.188, 2.188, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.062, 2.062, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.938, 1.938, 1.750, 1.750, 1.875, 1.875, 1.750, 1.750, 1.812, 1.812, 1.750, 1.750, +2.375, 2.375, 1.875, 1.875, 2.312, 2.312, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.188, 2.188, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.062, 2.062, 1.875, 1.875, 2.000, 2.000, 1.875, 1.875, 1.938, 1.938, 1.875, 1.875, +0.625, 0.625, 0.000, 0.000, 0.547, 0.547, 0.000, 0.000, 0.469, 0.469, 0.000, 0.000, 0.391, 0.391, 0.000, 0.000, 0.312, 0.312, 0.000, 0.000, 0.234, 0.234, 0.000, 0.000, 0.156, 0.156, 0.000, 0.000, 0.078, 0.078, 0.000, 0.000, +0.750, 0.750, 0.125, 0.125, 0.672, 0.672, 0.125, 0.125, 0.594, 0.594, 0.125, 0.125, 0.516, 0.516, 0.125, 0.125, 0.438, 0.438, 0.125, 0.125, 0.359, 0.359, 0.125, 0.125, 0.281, 0.281, 0.125, 0.125, 0.203, 0.203, 0.125, 0.125, +0.875, 0.875, 0.250, 0.250, 0.797, 0.797, 0.250, 0.250, 0.719, 0.719, 0.250, 0.250, 0.641, 0.641, 0.250, 0.250, 0.562, 0.562, 0.250, 0.250, 0.484, 0.484, 0.250, 0.250, 0.406, 0.406, 0.250, 0.250, 0.328, 0.328, 0.250, 0.250, +1.000, 1.000, 0.375, 0.375, 0.922, 0.922, 0.375, 0.375, 0.844, 0.844, 0.375, 0.375, 0.766, 0.766, 0.375, 0.375, 0.688, 0.688, 0.375, 0.375, 0.609, 0.609, 0.375, 0.375, 0.531, 0.531, 0.375, 0.375, 0.453, 0.453, 0.375, 0.375, +1.125, 1.125, 0.500, 0.500, 1.047, 1.047, 0.500, 0.500, 0.969, 0.969, 0.500, 0.500, 0.891, 0.891, 0.500, 0.500, 0.812, 0.812, 0.500, 0.500, 0.734, 0.734, 0.500, 0.500, 0.656, 0.656, 0.500, 0.500, 0.578, 0.578, 0.500, 0.500, +1.250, 1.250, 0.625, 0.625, 1.172, 1.172, 0.625, 0.625, 1.094, 1.094, 0.625, 0.625, 1.016, 1.016, 0.625, 0.625, 0.938, 0.938, 0.625, 0.625, 0.859, 0.859, 0.625, 0.625, 0.781, 0.781, 0.625, 0.625, 0.703, 0.703, 0.625, 0.625, +1.375, 1.375, 0.750, 0.750, 1.297, 1.297, 0.750, 0.750, 1.219, 1.219, 0.750, 0.750, 1.141, 1.141, 0.750, 0.750, 1.062, 1.062, 0.750, 0.750, 0.984, 0.984, 0.750, 0.750, 0.906, 0.906, 0.750, 0.750, 0.828, 0.828, 0.750, 0.750, +1.500, 1.500, 0.875, 0.875, 1.422, 1.422, 0.875, 0.875, 1.344, 1.344, 0.875, 0.875, 1.266, 1.266, 0.875, 0.875, 1.188, 1.188, 0.875, 0.875, 1.109, 1.109, 0.875, 0.875, 1.031, 1.031, 0.875, 0.875, 0.953, 0.953, 0.875, 0.875, +1.625, 1.625, 1.000, 1.000, 1.547, 1.547, 1.000, 1.000, 1.469, 1.469, 1.000, 1.000, 1.391, 1.391, 1.000, 1.000, 1.312, 1.312, 1.000, 1.000, 1.234, 1.234, 1.000, 1.000, 1.156, 1.156, 1.000, 1.000, 1.078, 1.078, 1.000, 1.000, +1.750, 1.750, 1.125, 1.125, 1.672, 1.672, 1.125, 1.125, 1.594, 1.594, 1.125, 1.125, 1.516, 1.516, 1.125, 1.125, 1.438, 1.438, 1.125, 1.125, 1.359, 1.359, 1.125, 1.125, 1.281, 1.281, 1.125, 1.125, 1.203, 1.203, 1.125, 1.125, +1.875, 1.875, 1.250, 1.250, 1.797, 1.797, 1.250, 1.250, 1.719, 1.719, 1.250, 1.250, 1.641, 1.641, 1.250, 1.250, 1.562, 1.562, 1.250, 1.250, 1.484, 1.484, 1.250, 1.250, 1.406, 1.406, 1.250, 1.250, 1.328, 1.328, 1.250, 1.250, +2.000, 2.000, 1.375, 1.375, 1.922, 1.922, 1.375, 1.375, 1.844, 1.844, 1.375, 1.375, 1.766, 1.766, 1.375, 1.375, 1.688, 1.688, 1.375, 1.375, 1.609, 1.609, 1.375, 1.375, 1.531, 1.531, 1.375, 1.375, 1.453, 1.453, 1.375, 1.375, +2.125, 2.125, 1.500, 1.500, 2.047, 2.047, 1.500, 1.500, 1.969, 1.969, 1.500, 1.500, 1.891, 1.891, 1.500, 1.500, 1.812, 1.812, 1.500, 1.500, 1.734, 1.734, 1.500, 1.500, 1.656, 1.656, 1.500, 1.500, 1.578, 1.578, 1.500, 1.500, +2.250, 2.250, 1.625, 1.625, 2.172, 2.172, 1.625, 1.625, 2.094, 2.094, 1.625, 1.625, 2.016, 2.016, 1.625, 1.625, 1.938, 1.938, 1.625, 1.625, 1.859, 1.859, 1.625, 1.625, 1.781, 1.781, 1.625, 1.625, 1.703, 1.703, 1.625, 1.625, +2.375, 2.375, 1.750, 1.750, 2.297, 2.297, 1.750, 1.750, 2.219, 2.219, 1.750, 1.750, 2.141, 2.141, 1.750, 1.750, 2.062, 2.062, 1.750, 1.750, 1.984, 1.984, 1.750, 1.750, 1.906, 1.906, 1.750, 1.750, 1.828, 1.828, 1.750, 1.750, +2.500, 2.500, 1.875, 1.875, 2.422, 2.422, 1.875, 1.875, 2.344, 2.344, 1.875, 1.875, 2.266, 2.266, 1.875, 1.875, 2.188, 2.188, 1.875, 1.875, 2.109, 2.109, 1.875, 1.875, 2.031, 2.031, 1.875, 1.875, 1.953, 1.953, 1.875, 1.875, +0.750, 0.750, 0.000, 0.000, 0.656, 0.656, 0.000, 0.000, 0.562, 0.562, 0.000, 0.000, 0.469, 0.469, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.281, 0.281, 0.000, 0.000, 0.188, 0.188, 0.000, 0.000, 0.094, 0.094, 0.000, 0.000, +0.875, 0.875, 0.125, 0.125, 0.781, 0.781, 0.125, 0.125, 0.688, 0.688, 0.125, 0.125, 0.594, 0.594, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.406, 0.406, 0.125, 0.125, 0.312, 0.312, 0.125, 0.125, 0.219, 0.219, 0.125, 0.125, +1.000, 1.000, 0.250, 0.250, 0.906, 0.906, 0.250, 0.250, 0.812, 0.812, 0.250, 0.250, 0.719, 0.719, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.531, 0.531, 0.250, 0.250, 0.438, 0.438, 0.250, 0.250, 0.344, 0.344, 0.250, 0.250, +1.125, 1.125, 0.375, 0.375, 1.031, 1.031, 0.375, 0.375, 0.938, 0.938, 0.375, 0.375, 0.844, 0.844, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.656, 0.656, 0.375, 0.375, 0.562, 0.562, 0.375, 0.375, 0.469, 0.469, 0.375, 0.375, +1.250, 1.250, 0.500, 0.500, 1.156, 1.156, 0.500, 0.500, 1.062, 1.062, 0.500, 0.500, 0.969, 0.969, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.781, 0.781, 0.500, 0.500, 0.688, 0.688, 0.500, 0.500, 0.594, 0.594, 0.500, 0.500, +1.375, 1.375, 0.625, 0.625, 1.281, 1.281, 0.625, 0.625, 1.188, 1.188, 0.625, 0.625, 1.094, 1.094, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.906, 0.906, 0.625, 0.625, 0.812, 0.812, 0.625, 0.625, 0.719, 0.719, 0.625, 0.625, +1.500, 1.500, 0.750, 0.750, 1.406, 1.406, 0.750, 0.750, 1.312, 1.312, 0.750, 0.750, 1.219, 1.219, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.031, 1.031, 0.750, 0.750, 0.938, 0.938, 0.750, 0.750, 0.844, 0.844, 0.750, 0.750, +1.625, 1.625, 0.875, 0.875, 1.531, 1.531, 0.875, 0.875, 1.438, 1.438, 0.875, 0.875, 1.344, 1.344, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.156, 1.156, 0.875, 0.875, 1.062, 1.062, 0.875, 0.875, 0.969, 0.969, 0.875, 0.875, +1.750, 1.750, 1.000, 1.000, 1.656, 1.656, 1.000, 1.000, 1.562, 1.562, 1.000, 1.000, 1.469, 1.469, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.281, 1.281, 1.000, 1.000, 1.188, 1.188, 1.000, 1.000, 1.094, 1.094, 1.000, 1.000, +1.875, 1.875, 1.125, 1.125, 1.781, 1.781, 1.125, 1.125, 1.688, 1.688, 1.125, 1.125, 1.594, 1.594, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.406, 1.406, 1.125, 1.125, 1.312, 1.312, 1.125, 1.125, 1.219, 1.219, 1.125, 1.125, +2.000, 2.000, 1.250, 1.250, 1.906, 1.906, 1.250, 1.250, 1.812, 1.812, 1.250, 1.250, 1.719, 1.719, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.531, 1.531, 1.250, 1.250, 1.438, 1.438, 1.250, 1.250, 1.344, 1.344, 1.250, 1.250, +2.125, 2.125, 1.375, 1.375, 2.031, 2.031, 1.375, 1.375, 1.938, 1.938, 1.375, 1.375, 1.844, 1.844, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.656, 1.656, 1.375, 1.375, 1.562, 1.562, 1.375, 1.375, 1.469, 1.469, 1.375, 1.375, +2.250, 2.250, 1.500, 1.500, 2.156, 2.156, 1.500, 1.500, 2.062, 2.062, 1.500, 1.500, 1.969, 1.969, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.781, 1.781, 1.500, 1.500, 1.688, 1.688, 1.500, 1.500, 1.594, 1.594, 1.500, 1.500, +2.375, 2.375, 1.625, 1.625, 2.281, 2.281, 1.625, 1.625, 2.188, 2.188, 1.625, 1.625, 2.094, 2.094, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.906, 1.906, 1.625, 1.625, 1.812, 1.812, 1.625, 1.625, 1.719, 1.719, 1.625, 1.625, +2.500, 2.500, 1.750, 1.750, 2.406, 2.406, 1.750, 1.750, 2.312, 2.312, 1.750, 1.750, 2.219, 2.219, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.031, 2.031, 1.750, 1.750, 1.938, 1.938, 1.750, 1.750, 1.844, 1.844, 1.750, 1.750, +2.625, 2.625, 1.875, 1.875, 2.531, 2.531, 1.875, 1.875, 2.438, 2.438, 1.875, 1.875, 2.344, 2.344, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.156, 2.156, 1.875, 1.875, 2.062, 2.062, 1.875, 1.875, 1.969, 1.969, 1.875, 1.875, +0.875, 0.875, 0.000, 0.000, 0.766, 0.766, 0.000, 0.000, 0.656, 0.656, 0.000, 0.000, 0.547, 0.547, 0.000, 0.000, 0.438, 0.438, 0.000, 0.000, 0.328, 0.328, 0.000, 0.000, 0.219, 0.219, 0.000, 0.000, 0.109, 0.109, 0.000, 0.000, +1.000, 1.000, 0.125, 0.125, 0.891, 0.891, 0.125, 0.125, 0.781, 0.781, 0.125, 0.125, 0.672, 0.672, 0.125, 0.125, 0.562, 0.562, 0.125, 0.125, 0.453, 0.453, 0.125, 0.125, 0.344, 0.344, 0.125, 0.125, 0.234, 0.234, 0.125, 0.125, +1.125, 1.125, 0.250, 0.250, 1.016, 1.016, 0.250, 0.250, 0.906, 0.906, 0.250, 0.250, 0.797, 0.797, 0.250, 0.250, 0.688, 0.688, 0.250, 0.250, 0.578, 0.578, 0.250, 0.250, 0.469, 0.469, 0.250, 0.250, 0.359, 0.359, 0.250, 0.250, +1.250, 1.250, 0.375, 0.375, 1.141, 1.141, 0.375, 0.375, 1.031, 1.031, 0.375, 0.375, 0.922, 0.922, 0.375, 0.375, 0.812, 0.812, 0.375, 0.375, 0.703, 0.703, 0.375, 0.375, 0.594, 0.594, 0.375, 0.375, 0.484, 0.484, 0.375, 0.375, +1.375, 1.375, 0.500, 0.500, 1.266, 1.266, 0.500, 0.500, 1.156, 1.156, 0.500, 0.500, 1.047, 1.047, 0.500, 0.500, 0.938, 0.938, 0.500, 0.500, 0.828, 0.828, 0.500, 0.500, 0.719, 0.719, 0.500, 0.500, 0.609, 0.609, 0.500, 0.500, +1.500, 1.500, 0.625, 0.625, 1.391, 1.391, 0.625, 0.625, 1.281, 1.281, 0.625, 0.625, 1.172, 1.172, 0.625, 0.625, 1.062, 1.062, 0.625, 0.625, 0.953, 0.953, 0.625, 0.625, 0.844, 0.844, 0.625, 0.625, 0.734, 0.734, 0.625, 0.625, +1.625, 1.625, 0.750, 0.750, 1.516, 1.516, 0.750, 0.750, 1.406, 1.406, 0.750, 0.750, 1.297, 1.297, 0.750, 0.750, 1.188, 1.188, 0.750, 0.750, 1.078, 1.078, 0.750, 0.750, 0.969, 0.969, 0.750, 0.750, 0.859, 0.859, 0.750, 0.750, +1.750, 1.750, 0.875, 0.875, 1.641, 1.641, 0.875, 0.875, 1.531, 1.531, 0.875, 0.875, 1.422, 1.422, 0.875, 0.875, 1.312, 1.312, 0.875, 0.875, 1.203, 1.203, 0.875, 0.875, 1.094, 1.094, 0.875, 0.875, 0.984, 0.984, 0.875, 0.875, +1.875, 1.875, 1.000, 1.000, 1.766, 1.766, 1.000, 1.000, 1.656, 1.656, 1.000, 1.000, 1.547, 1.547, 1.000, 1.000, 1.438, 1.438, 1.000, 1.000, 1.328, 1.328, 1.000, 1.000, 1.219, 1.219, 1.000, 1.000, 1.109, 1.109, 1.000, 1.000, +2.000, 2.000, 1.125, 1.125, 1.891, 1.891, 1.125, 1.125, 1.781, 1.781, 1.125, 1.125, 1.672, 1.672, 1.125, 1.125, 1.562, 1.562, 1.125, 1.125, 1.453, 1.453, 1.125, 1.125, 1.344, 1.344, 1.125, 1.125, 1.234, 1.234, 1.125, 1.125, +2.125, 2.125, 1.250, 1.250, 2.016, 2.016, 1.250, 1.250, 1.906, 1.906, 1.250, 1.250, 1.797, 1.797, 1.250, 1.250, 1.688, 1.688, 1.250, 1.250, 1.578, 1.578, 1.250, 1.250, 1.469, 1.469, 1.250, 1.250, 1.359, 1.359, 1.250, 1.250, +2.250, 2.250, 1.375, 1.375, 2.141, 2.141, 1.375, 1.375, 2.031, 2.031, 1.375, 1.375, 1.922, 1.922, 1.375, 1.375, 1.812, 1.812, 1.375, 1.375, 1.703, 1.703, 1.375, 1.375, 1.594, 1.594, 1.375, 1.375, 1.484, 1.484, 1.375, 1.375, +2.375, 2.375, 1.500, 1.500, 2.266, 2.266, 1.500, 1.500, 2.156, 2.156, 1.500, 1.500, 2.047, 2.047, 1.500, 1.500, 1.938, 1.938, 1.500, 1.500, 1.828, 1.828, 1.500, 1.500, 1.719, 1.719, 1.500, 1.500, 1.609, 1.609, 1.500, 1.500, +2.500, 2.500, 1.625, 1.625, 2.391, 2.391, 1.625, 1.625, 2.281, 2.281, 1.625, 1.625, 2.172, 2.172, 1.625, 1.625, 2.062, 2.062, 1.625, 1.625, 1.953, 1.953, 1.625, 1.625, 1.844, 1.844, 1.625, 1.625, 1.734, 1.734, 1.625, 1.625, +2.625, 2.625, 1.750, 1.750, 2.516, 2.516, 1.750, 1.750, 2.406, 2.406, 1.750, 1.750, 2.297, 2.297, 1.750, 1.750, 2.188, 2.188, 1.750, 1.750, 2.078, 2.078, 1.750, 1.750, 1.969, 1.969, 1.750, 1.750, 1.859, 1.859, 1.750, 1.750, +2.750, 2.750, 1.875, 1.875, 2.641, 2.641, 1.875, 1.875, 2.531, 2.531, 1.875, 1.875, 2.422, 2.422, 1.875, 1.875, 2.312, 2.312, 1.875, 1.875, 2.203, 2.203, 1.875, 1.875, 2.094, 2.094, 1.875, 1.875, 1.984, 1.984, 1.875, 1.875, +1.000, 1.000, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.500, 0.500, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.250, 0.250, 0.000, 0.000, 0.125, 0.125, 0.000, 0.000, +1.125, 1.125, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.625, 0.625, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.375, 0.375, 0.125, 0.125, 0.250, 0.250, 0.125, 0.125, +1.250, 1.250, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.750, 0.750, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.500, 0.500, 0.250, 0.250, 0.375, 0.375, 0.250, 0.250, +1.375, 1.375, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.875, 0.875, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.625, 0.625, 0.375, 0.375, 0.500, 0.500, 0.375, 0.375, +1.500, 1.500, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 1.000, 1.000, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.750, 0.750, 0.500, 0.500, 0.625, 0.625, 0.500, 0.500, +1.625, 1.625, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.125, 1.125, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.875, 0.875, 0.625, 0.625, 0.750, 0.750, 0.625, 0.625, +1.750, 1.750, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.250, 1.250, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 1.000, 1.000, 0.750, 0.750, 0.875, 0.875, 0.750, 0.750, +1.875, 1.875, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.375, 1.375, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.125, 1.125, 0.875, 0.875, 1.000, 1.000, 0.875, 0.875, +2.000, 2.000, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.500, 1.500, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.250, 1.250, 1.000, 1.000, 1.125, 1.125, 1.000, 1.000, +2.125, 2.125, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.625, 1.625, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.375, 1.375, 1.125, 1.125, 1.250, 1.250, 1.125, 1.125, +2.250, 2.250, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.750, 1.750, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.500, 1.500, 1.250, 1.250, 1.375, 1.375, 1.250, 1.250, +2.375, 2.375, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.875, 1.875, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.625, 1.625, 1.375, 1.375, 1.500, 1.500, 1.375, 1.375, +2.500, 2.500, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 2.000, 2.000, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.750, 1.750, 1.500, 1.500, 1.625, 1.625, 1.500, 1.500, +2.625, 2.625, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.125, 2.125, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.875, 1.875, 1.625, 1.625, 1.750, 1.750, 1.625, 1.625, +2.750, 2.750, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.250, 2.250, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 2.000, 2.000, 1.750, 1.750, 1.875, 1.875, 1.750, 1.750, +2.875, 2.875, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.375, 2.375, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.125, 2.125, 1.875, 1.875, 2.000, 2.000, 1.875, 1.875, +1.125, 1.125, 0.000, 0.000, 0.984, 0.984, 0.000, 0.000, 0.844, 0.844, 0.000, 0.000, 0.703, 0.703, 0.000, 0.000, 0.562, 0.562, 0.000, 0.000, 0.422, 0.422, 0.000, 0.000, 0.281, 0.281, 0.000, 0.000, 0.141, 0.141, 0.000, 0.000, +1.250, 1.250, 0.125, 0.125, 1.109, 1.109, 0.125, 0.125, 0.969, 0.969, 0.125, 0.125, 0.828, 0.828, 0.125, 0.125, 0.688, 0.688, 0.125, 0.125, 0.547, 0.547, 0.125, 0.125, 0.406, 0.406, 0.125, 0.125, 0.266, 0.266, 0.125, 0.125, +1.375, 1.375, 0.250, 0.250, 1.234, 1.234, 0.250, 0.250, 1.094, 1.094, 0.250, 0.250, 0.953, 0.953, 0.250, 0.250, 0.812, 0.812, 0.250, 0.250, 0.672, 0.672, 0.250, 0.250, 0.531, 0.531, 0.250, 0.250, 0.391, 0.391, 0.250, 0.250, +1.500, 1.500, 0.375, 0.375, 1.359, 1.359, 0.375, 0.375, 1.219, 1.219, 0.375, 0.375, 1.078, 1.078, 0.375, 0.375, 0.938, 0.938, 0.375, 0.375, 0.797, 0.797, 0.375, 0.375, 0.656, 0.656, 0.375, 0.375, 0.516, 0.516, 0.375, 0.375, +1.625, 1.625, 0.500, 0.500, 1.484, 1.484, 0.500, 0.500, 1.344, 1.344, 0.500, 0.500, 1.203, 1.203, 0.500, 0.500, 1.062, 1.062, 0.500, 0.500, 0.922, 0.922, 0.500, 0.500, 0.781, 0.781, 0.500, 0.500, 0.641, 0.641, 0.500, 0.500, +1.750, 1.750, 0.625, 0.625, 1.609, 1.609, 0.625, 0.625, 1.469, 1.469, 0.625, 0.625, 1.328, 1.328, 0.625, 0.625, 1.188, 1.188, 0.625, 0.625, 1.047, 1.047, 0.625, 0.625, 0.906, 0.906, 0.625, 0.625, 0.766, 0.766, 0.625, 0.625, +1.875, 1.875, 0.750, 0.750, 1.734, 1.734, 0.750, 0.750, 1.594, 1.594, 0.750, 0.750, 1.453, 1.453, 0.750, 0.750, 1.312, 1.312, 0.750, 0.750, 1.172, 1.172, 0.750, 0.750, 1.031, 1.031, 0.750, 0.750, 0.891, 0.891, 0.750, 0.750, +2.000, 2.000, 0.875, 0.875, 1.859, 1.859, 0.875, 0.875, 1.719, 1.719, 0.875, 0.875, 1.578, 1.578, 0.875, 0.875, 1.438, 1.438, 0.875, 0.875, 1.297, 1.297, 0.875, 0.875, 1.156, 1.156, 0.875, 0.875, 1.016, 1.016, 0.875, 0.875, +2.125, 2.125, 1.000, 1.000, 1.984, 1.984, 1.000, 1.000, 1.844, 1.844, 1.000, 1.000, 1.703, 1.703, 1.000, 1.000, 1.562, 1.562, 1.000, 1.000, 1.422, 1.422, 1.000, 1.000, 1.281, 1.281, 1.000, 1.000, 1.141, 1.141, 1.000, 1.000, +2.250, 2.250, 1.125, 1.125, 2.109, 2.109, 1.125, 1.125, 1.969, 1.969, 1.125, 1.125, 1.828, 1.828, 1.125, 1.125, 1.688, 1.688, 1.125, 1.125, 1.547, 1.547, 1.125, 1.125, 1.406, 1.406, 1.125, 1.125, 1.266, 1.266, 1.125, 1.125, +2.375, 2.375, 1.250, 1.250, 2.234, 2.234, 1.250, 1.250, 2.094, 2.094, 1.250, 1.250, 1.953, 1.953, 1.250, 1.250, 1.812, 1.812, 1.250, 1.250, 1.672, 1.672, 1.250, 1.250, 1.531, 1.531, 1.250, 1.250, 1.391, 1.391, 1.250, 1.250, +2.500, 2.500, 1.375, 1.375, 2.359, 2.359, 1.375, 1.375, 2.219, 2.219, 1.375, 1.375, 2.078, 2.078, 1.375, 1.375, 1.938, 1.938, 1.375, 1.375, 1.797, 1.797, 1.375, 1.375, 1.656, 1.656, 1.375, 1.375, 1.516, 1.516, 1.375, 1.375, +2.625, 2.625, 1.500, 1.500, 2.484, 2.484, 1.500, 1.500, 2.344, 2.344, 1.500, 1.500, 2.203, 2.203, 1.500, 1.500, 2.062, 2.062, 1.500, 1.500, 1.922, 1.922, 1.500, 1.500, 1.781, 1.781, 1.500, 1.500, 1.641, 1.641, 1.500, 1.500, +2.750, 2.750, 1.625, 1.625, 2.609, 2.609, 1.625, 1.625, 2.469, 2.469, 1.625, 1.625, 2.328, 2.328, 1.625, 1.625, 2.188, 2.188, 1.625, 1.625, 2.047, 2.047, 1.625, 1.625, 1.906, 1.906, 1.625, 1.625, 1.766, 1.766, 1.625, 1.625, +2.875, 2.875, 1.750, 1.750, 2.734, 2.734, 1.750, 1.750, 2.594, 2.594, 1.750, 1.750, 2.453, 2.453, 1.750, 1.750, 2.312, 2.312, 1.750, 1.750, 2.172, 2.172, 1.750, 1.750, 2.031, 2.031, 1.750, 1.750, 1.891, 1.891, 1.750, 1.750, +3.000, 3.000, 1.875, 1.875, 2.859, 2.859, 1.875, 1.875, 2.719, 2.719, 1.875, 1.875, 2.578, 2.578, 1.875, 1.875, 2.438, 2.438, 1.875, 1.875, 2.297, 2.297, 1.875, 1.875, 2.156, 2.156, 1.875, 1.875, 2.016, 2.016, 1.875, 1.875, +1.250, 1.250, 0.000, 0.000, 1.094, 1.094, 0.000, 0.000, 0.938, 0.938, 0.000, 0.000, 0.781, 0.781, 0.000, 0.000, 0.625, 0.625, 0.000, 0.000, 0.469, 0.469, 0.000, 0.000, 0.312, 0.312, 0.000, 0.000, 0.156, 0.156, 0.000, 0.000, +1.375, 1.375, 0.125, 0.125, 1.219, 1.219, 0.125, 0.125, 1.062, 1.062, 0.125, 0.125, 0.906, 0.906, 0.125, 0.125, 0.750, 0.750, 0.125, 0.125, 0.594, 0.594, 0.125, 0.125, 0.438, 0.438, 0.125, 0.125, 0.281, 0.281, 0.125, 0.125, +1.500, 1.500, 0.250, 0.250, 1.344, 1.344, 0.250, 0.250, 1.188, 1.188, 0.250, 0.250, 1.031, 1.031, 0.250, 0.250, 0.875, 0.875, 0.250, 0.250, 0.719, 0.719, 0.250, 0.250, 0.562, 0.562, 0.250, 0.250, 0.406, 0.406, 0.250, 0.250, +1.625, 1.625, 0.375, 0.375, 1.469, 1.469, 0.375, 0.375, 1.312, 1.312, 0.375, 0.375, 1.156, 1.156, 0.375, 0.375, 1.000, 1.000, 0.375, 0.375, 0.844, 0.844, 0.375, 0.375, 0.688, 0.688, 0.375, 0.375, 0.531, 0.531, 0.375, 0.375, +1.750, 1.750, 0.500, 0.500, 1.594, 1.594, 0.500, 0.500, 1.438, 1.438, 0.500, 0.500, 1.281, 1.281, 0.500, 0.500, 1.125, 1.125, 0.500, 0.500, 0.969, 0.969, 0.500, 0.500, 0.812, 0.812, 0.500, 0.500, 0.656, 0.656, 0.500, 0.500, +1.875, 1.875, 0.625, 0.625, 1.719, 1.719, 0.625, 0.625, 1.562, 1.562, 0.625, 0.625, 1.406, 1.406, 0.625, 0.625, 1.250, 1.250, 0.625, 0.625, 1.094, 1.094, 0.625, 0.625, 0.938, 0.938, 0.625, 0.625, 0.781, 0.781, 0.625, 0.625, +2.000, 2.000, 0.750, 0.750, 1.844, 1.844, 0.750, 0.750, 1.688, 1.688, 0.750, 0.750, 1.531, 1.531, 0.750, 0.750, 1.375, 1.375, 0.750, 0.750, 1.219, 1.219, 0.750, 0.750, 1.062, 1.062, 0.750, 0.750, 0.906, 0.906, 0.750, 0.750, +2.125, 2.125, 0.875, 0.875, 1.969, 1.969, 0.875, 0.875, 1.812, 1.812, 0.875, 0.875, 1.656, 1.656, 0.875, 0.875, 1.500, 1.500, 0.875, 0.875, 1.344, 1.344, 0.875, 0.875, 1.188, 1.188, 0.875, 0.875, 1.031, 1.031, 0.875, 0.875, +2.250, 2.250, 1.000, 1.000, 2.094, 2.094, 1.000, 1.000, 1.938, 1.938, 1.000, 1.000, 1.781, 1.781, 1.000, 1.000, 1.625, 1.625, 1.000, 1.000, 1.469, 1.469, 1.000, 1.000, 1.312, 1.312, 1.000, 1.000, 1.156, 1.156, 1.000, 1.000, +2.375, 2.375, 1.125, 1.125, 2.219, 2.219, 1.125, 1.125, 2.062, 2.062, 1.125, 1.125, 1.906, 1.906, 1.125, 1.125, 1.750, 1.750, 1.125, 1.125, 1.594, 1.594, 1.125, 1.125, 1.438, 1.438, 1.125, 1.125, 1.281, 1.281, 1.125, 1.125, +2.500, 2.500, 1.250, 1.250, 2.344, 2.344, 1.250, 1.250, 2.188, 2.188, 1.250, 1.250, 2.031, 2.031, 1.250, 1.250, 1.875, 1.875, 1.250, 1.250, 1.719, 1.719, 1.250, 1.250, 1.562, 1.562, 1.250, 1.250, 1.406, 1.406, 1.250, 1.250, +2.625, 2.625, 1.375, 1.375, 2.469, 2.469, 1.375, 1.375, 2.312, 2.312, 1.375, 1.375, 2.156, 2.156, 1.375, 1.375, 2.000, 2.000, 1.375, 1.375, 1.844, 1.844, 1.375, 1.375, 1.688, 1.688, 1.375, 1.375, 1.531, 1.531, 1.375, 1.375, +2.750, 2.750, 1.500, 1.500, 2.594, 2.594, 1.500, 1.500, 2.438, 2.438, 1.500, 1.500, 2.281, 2.281, 1.500, 1.500, 2.125, 2.125, 1.500, 1.500, 1.969, 1.969, 1.500, 1.500, 1.812, 1.812, 1.500, 1.500, 1.656, 1.656, 1.500, 1.500, +2.875, 2.875, 1.625, 1.625, 2.719, 2.719, 1.625, 1.625, 2.562, 2.562, 1.625, 1.625, 2.406, 2.406, 1.625, 1.625, 2.250, 2.250, 1.625, 1.625, 2.094, 2.094, 1.625, 1.625, 1.938, 1.938, 1.625, 1.625, 1.781, 1.781, 1.625, 1.625, +3.000, 3.000, 1.750, 1.750, 2.844, 2.844, 1.750, 1.750, 2.688, 2.688, 1.750, 1.750, 2.531, 2.531, 1.750, 1.750, 2.375, 2.375, 1.750, 1.750, 2.219, 2.219, 1.750, 1.750, 2.062, 2.062, 1.750, 1.750, 1.906, 1.906, 1.750, 1.750, +3.125, 3.125, 1.875, 1.875, 2.969, 2.969, 1.875, 1.875, 2.812, 2.812, 1.875, 1.875, 2.656, 2.656, 1.875, 1.875, 2.500, 2.500, 1.875, 1.875, 2.344, 2.344, 1.875, 1.875, 2.188, 2.188, 1.875, 1.875, 2.031, 2.031, 1.875, 1.875, +1.375, 1.375, 0.000, 0.000, 1.203, 1.203, 0.000, 0.000, 1.031, 1.031, 0.000, 0.000, 0.859, 0.859, 0.000, 0.000, 0.688, 0.688, 0.000, 0.000, 0.516, 0.516, 0.000, 0.000, 0.344, 0.344, 0.000, 0.000, 0.172, 0.172, 0.000, 0.000, +1.500, 1.500, 0.125, 0.125, 1.328, 1.328, 0.125, 0.125, 1.156, 1.156, 0.125, 0.125, 0.984, 0.984, 0.125, 0.125, 0.812, 0.812, 0.125, 0.125, 0.641, 0.641, 0.125, 0.125, 0.469, 0.469, 0.125, 0.125, 0.297, 0.297, 0.125, 0.125, +1.625, 1.625, 0.250, 0.250, 1.453, 1.453, 0.250, 0.250, 1.281, 1.281, 0.250, 0.250, 1.109, 1.109, 0.250, 0.250, 0.938, 0.938, 0.250, 0.250, 0.766, 0.766, 0.250, 0.250, 0.594, 0.594, 0.250, 0.250, 0.422, 0.422, 0.250, 0.250, +1.750, 1.750, 0.375, 0.375, 1.578, 1.578, 0.375, 0.375, 1.406, 1.406, 0.375, 0.375, 1.234, 1.234, 0.375, 0.375, 1.062, 1.062, 0.375, 0.375, 0.891, 0.891, 0.375, 0.375, 0.719, 0.719, 0.375, 0.375, 0.547, 0.547, 0.375, 0.375, +1.875, 1.875, 0.500, 0.500, 1.703, 1.703, 0.500, 0.500, 1.531, 1.531, 0.500, 0.500, 1.359, 1.359, 0.500, 0.500, 1.188, 1.188, 0.500, 0.500, 1.016, 1.016, 0.500, 0.500, 0.844, 0.844, 0.500, 0.500, 0.672, 0.672, 0.500, 0.500, +2.000, 2.000, 0.625, 0.625, 1.828, 1.828, 0.625, 0.625, 1.656, 1.656, 0.625, 0.625, 1.484, 1.484, 0.625, 0.625, 1.312, 1.312, 0.625, 0.625, 1.141, 1.141, 0.625, 0.625, 0.969, 0.969, 0.625, 0.625, 0.797, 0.797, 0.625, 0.625, +2.125, 2.125, 0.750, 0.750, 1.953, 1.953, 0.750, 0.750, 1.781, 1.781, 0.750, 0.750, 1.609, 1.609, 0.750, 0.750, 1.438, 1.438, 0.750, 0.750, 1.266, 1.266, 0.750, 0.750, 1.094, 1.094, 0.750, 0.750, 0.922, 0.922, 0.750, 0.750, +2.250, 2.250, 0.875, 0.875, 2.078, 2.078, 0.875, 0.875, 1.906, 1.906, 0.875, 0.875, 1.734, 1.734, 0.875, 0.875, 1.562, 1.562, 0.875, 0.875, 1.391, 1.391, 0.875, 0.875, 1.219, 1.219, 0.875, 0.875, 1.047, 1.047, 0.875, 0.875, +2.375, 2.375, 1.000, 1.000, 2.203, 2.203, 1.000, 1.000, 2.031, 2.031, 1.000, 1.000, 1.859, 1.859, 1.000, 1.000, 1.688, 1.688, 1.000, 1.000, 1.516, 1.516, 1.000, 1.000, 1.344, 1.344, 1.000, 1.000, 1.172, 1.172, 1.000, 1.000, +2.500, 2.500, 1.125, 1.125, 2.328, 2.328, 1.125, 1.125, 2.156, 2.156, 1.125, 1.125, 1.984, 1.984, 1.125, 1.125, 1.812, 1.812, 1.125, 1.125, 1.641, 1.641, 1.125, 1.125, 1.469, 1.469, 1.125, 1.125, 1.297, 1.297, 1.125, 1.125, +2.625, 2.625, 1.250, 1.250, 2.453, 2.453, 1.250, 1.250, 2.281, 2.281, 1.250, 1.250, 2.109, 2.109, 1.250, 1.250, 1.938, 1.938, 1.250, 1.250, 1.766, 1.766, 1.250, 1.250, 1.594, 1.594, 1.250, 1.250, 1.422, 1.422, 1.250, 1.250, +2.750, 2.750, 1.375, 1.375, 2.578, 2.578, 1.375, 1.375, 2.406, 2.406, 1.375, 1.375, 2.234, 2.234, 1.375, 1.375, 2.062, 2.062, 1.375, 1.375, 1.891, 1.891, 1.375, 1.375, 1.719, 1.719, 1.375, 1.375, 1.547, 1.547, 1.375, 1.375, +2.875, 2.875, 1.500, 1.500, 2.703, 2.703, 1.500, 1.500, 2.531, 2.531, 1.500, 1.500, 2.359, 2.359, 1.500, 1.500, 2.188, 2.188, 1.500, 1.500, 2.016, 2.016, 1.500, 1.500, 1.844, 1.844, 1.500, 1.500, 1.672, 1.672, 1.500, 1.500, +3.000, 3.000, 1.625, 1.625, 2.828, 2.828, 1.625, 1.625, 2.656, 2.656, 1.625, 1.625, 2.484, 2.484, 1.625, 1.625, 2.312, 2.312, 1.625, 1.625, 2.141, 2.141, 1.625, 1.625, 1.969, 1.969, 1.625, 1.625, 1.797, 1.797, 1.625, 1.625, +3.125, 3.125, 1.750, 1.750, 2.953, 2.953, 1.750, 1.750, 2.781, 2.781, 1.750, 1.750, 2.609, 2.609, 1.750, 1.750, 2.438, 2.438, 1.750, 1.750, 2.266, 2.266, 1.750, 1.750, 2.094, 2.094, 1.750, 1.750, 1.922, 1.922, 1.750, 1.750, +3.250, 3.250, 1.875, 1.875, 3.078, 3.078, 1.875, 1.875, 2.906, 2.906, 1.875, 1.875, 2.734, 2.734, 1.875, 1.875, 2.562, 2.562, 1.875, 1.875, 2.391, 2.391, 1.875, 1.875, 2.219, 2.219, 1.875, 1.875, 2.047, 2.047, 1.875, 1.875, +1.500, 1.500, 0.000, 0.000, 1.312, 1.312, 0.000, 0.000, 1.125, 1.125, 0.000, 0.000, 0.938, 0.938, 0.000, 0.000, 0.750, 0.750, 0.000, 0.000, 0.562, 0.562, 0.000, 0.000, 0.375, 0.375, 0.000, 0.000, 0.188, 0.188, 0.000, 0.000, +1.625, 1.625, 0.125, 0.125, 1.438, 1.438, 0.125, 0.125, 1.250, 1.250, 0.125, 0.125, 1.062, 1.062, 0.125, 0.125, 0.875, 0.875, 0.125, 0.125, 0.688, 0.688, 0.125, 0.125, 0.500, 0.500, 0.125, 0.125, 0.312, 0.312, 0.125, 0.125, +1.750, 1.750, 0.250, 0.250, 1.562, 1.562, 0.250, 0.250, 1.375, 1.375, 0.250, 0.250, 1.188, 1.188, 0.250, 0.250, 1.000, 1.000, 0.250, 0.250, 0.812, 0.812, 0.250, 0.250, 0.625, 0.625, 0.250, 0.250, 0.438, 0.438, 0.250, 0.250, +1.875, 1.875, 0.375, 0.375, 1.688, 1.688, 0.375, 0.375, 1.500, 1.500, 0.375, 0.375, 1.312, 1.312, 0.375, 0.375, 1.125, 1.125, 0.375, 0.375, 0.938, 0.938, 0.375, 0.375, 0.750, 0.750, 0.375, 0.375, 0.562, 0.562, 0.375, 0.375, +2.000, 2.000, 0.500, 0.500, 1.812, 1.812, 0.500, 0.500, 1.625, 1.625, 0.500, 0.500, 1.438, 1.438, 0.500, 0.500, 1.250, 1.250, 0.500, 0.500, 1.062, 1.062, 0.500, 0.500, 0.875, 0.875, 0.500, 0.500, 0.688, 0.688, 0.500, 0.500, +2.125, 2.125, 0.625, 0.625, 1.938, 1.938, 0.625, 0.625, 1.750, 1.750, 0.625, 0.625, 1.562, 1.562, 0.625, 0.625, 1.375, 1.375, 0.625, 0.625, 1.188, 1.188, 0.625, 0.625, 1.000, 1.000, 0.625, 0.625, 0.812, 0.812, 0.625, 0.625, +2.250, 2.250, 0.750, 0.750, 2.062, 2.062, 0.750, 0.750, 1.875, 1.875, 0.750, 0.750, 1.688, 1.688, 0.750, 0.750, 1.500, 1.500, 0.750, 0.750, 1.312, 1.312, 0.750, 0.750, 1.125, 1.125, 0.750, 0.750, 0.938, 0.938, 0.750, 0.750, +2.375, 2.375, 0.875, 0.875, 2.188, 2.188, 0.875, 0.875, 2.000, 2.000, 0.875, 0.875, 1.812, 1.812, 0.875, 0.875, 1.625, 1.625, 0.875, 0.875, 1.438, 1.438, 0.875, 0.875, 1.250, 1.250, 0.875, 0.875, 1.062, 1.062, 0.875, 0.875, +2.500, 2.500, 1.000, 1.000, 2.312, 2.312, 1.000, 1.000, 2.125, 2.125, 1.000, 1.000, 1.938, 1.938, 1.000, 1.000, 1.750, 1.750, 1.000, 1.000, 1.562, 1.562, 1.000, 1.000, 1.375, 1.375, 1.000, 1.000, 1.188, 1.188, 1.000, 1.000, +2.625, 2.625, 1.125, 1.125, 2.438, 2.438, 1.125, 1.125, 2.250, 2.250, 1.125, 1.125, 2.062, 2.062, 1.125, 1.125, 1.875, 1.875, 1.125, 1.125, 1.688, 1.688, 1.125, 1.125, 1.500, 1.500, 1.125, 1.125, 1.312, 1.312, 1.125, 1.125, +2.750, 2.750, 1.250, 1.250, 2.562, 2.562, 1.250, 1.250, 2.375, 2.375, 1.250, 1.250, 2.188, 2.188, 1.250, 1.250, 2.000, 2.000, 1.250, 1.250, 1.812, 1.812, 1.250, 1.250, 1.625, 1.625, 1.250, 1.250, 1.438, 1.438, 1.250, 1.250, +2.875, 2.875, 1.375, 1.375, 2.688, 2.688, 1.375, 1.375, 2.500, 2.500, 1.375, 1.375, 2.312, 2.312, 1.375, 1.375, 2.125, 2.125, 1.375, 1.375, 1.938, 1.938, 1.375, 1.375, 1.750, 1.750, 1.375, 1.375, 1.562, 1.562, 1.375, 1.375, +3.000, 3.000, 1.500, 1.500, 2.812, 2.812, 1.500, 1.500, 2.625, 2.625, 1.500, 1.500, 2.438, 2.438, 1.500, 1.500, 2.250, 2.250, 1.500, 1.500, 2.062, 2.062, 1.500, 1.500, 1.875, 1.875, 1.500, 1.500, 1.688, 1.688, 1.500, 1.500, +3.125, 3.125, 1.625, 1.625, 2.938, 2.938, 1.625, 1.625, 2.750, 2.750, 1.625, 1.625, 2.562, 2.562, 1.625, 1.625, 2.375, 2.375, 1.625, 1.625, 2.188, 2.188, 1.625, 1.625, 2.000, 2.000, 1.625, 1.625, 1.812, 1.812, 1.625, 1.625, +3.250, 3.250, 1.750, 1.750, 3.062, 3.062, 1.750, 1.750, 2.875, 2.875, 1.750, 1.750, 2.688, 2.688, 1.750, 1.750, 2.500, 2.500, 1.750, 1.750, 2.312, 2.312, 1.750, 1.750, 2.125, 2.125, 1.750, 1.750, 1.938, 1.938, 1.750, 1.750, +3.375, 3.375, 1.875, 1.875, 3.188, 3.188, 1.875, 1.875, 3.000, 3.000, 1.875, 1.875, 2.812, 2.812, 1.875, 1.875, 2.625, 2.625, 1.875, 1.875, 2.438, 2.438, 1.875, 1.875, 2.250, 2.250, 1.875, 1.875, 2.062, 2.062, 1.875, 1.875, +1.625, 1.625, 0.000, 0.000, 1.422, 1.422, 0.000, 0.000, 1.219, 1.219, 0.000, 0.000, 1.016, 1.016, 0.000, 0.000, 0.812, 0.812, 0.000, 0.000, 0.609, 0.609, 0.000, 0.000, 0.406, 0.406, 0.000, 0.000, 0.203, 0.203, 0.000, 0.000, +1.750, 1.750, 0.125, 0.125, 1.547, 1.547, 0.125, 0.125, 1.344, 1.344, 0.125, 0.125, 1.141, 1.141, 0.125, 0.125, 0.938, 0.938, 0.125, 0.125, 0.734, 0.734, 0.125, 0.125, 0.531, 0.531, 0.125, 0.125, 0.328, 0.328, 0.125, 0.125, +1.875, 1.875, 0.250, 0.250, 1.672, 1.672, 0.250, 0.250, 1.469, 1.469, 0.250, 0.250, 1.266, 1.266, 0.250, 0.250, 1.062, 1.062, 0.250, 0.250, 0.859, 0.859, 0.250, 0.250, 0.656, 0.656, 0.250, 0.250, 0.453, 0.453, 0.250, 0.250, +2.000, 2.000, 0.375, 0.375, 1.797, 1.797, 0.375, 0.375, 1.594, 1.594, 0.375, 0.375, 1.391, 1.391, 0.375, 0.375, 1.188, 1.188, 0.375, 0.375, 0.984, 0.984, 0.375, 0.375, 0.781, 0.781, 0.375, 0.375, 0.578, 0.578, 0.375, 0.375, +2.125, 2.125, 0.500, 0.500, 1.922, 1.922, 0.500, 0.500, 1.719, 1.719, 0.500, 0.500, 1.516, 1.516, 0.500, 0.500, 1.312, 1.312, 0.500, 0.500, 1.109, 1.109, 0.500, 0.500, 0.906, 0.906, 0.500, 0.500, 0.703, 0.703, 0.500, 0.500, +2.250, 2.250, 0.625, 0.625, 2.047, 2.047, 0.625, 0.625, 1.844, 1.844, 0.625, 0.625, 1.641, 1.641, 0.625, 0.625, 1.438, 1.438, 0.625, 0.625, 1.234, 1.234, 0.625, 0.625, 1.031, 1.031, 0.625, 0.625, 0.828, 0.828, 0.625, 0.625, +2.375, 2.375, 0.750, 0.750, 2.172, 2.172, 0.750, 0.750, 1.969, 1.969, 0.750, 0.750, 1.766, 1.766, 0.750, 0.750, 1.562, 1.562, 0.750, 0.750, 1.359, 1.359, 0.750, 0.750, 1.156, 1.156, 0.750, 0.750, 0.953, 0.953, 0.750, 0.750, +2.500, 2.500, 0.875, 0.875, 2.297, 2.297, 0.875, 0.875, 2.094, 2.094, 0.875, 0.875, 1.891, 1.891, 0.875, 0.875, 1.688, 1.688, 0.875, 0.875, 1.484, 1.484, 0.875, 0.875, 1.281, 1.281, 0.875, 0.875, 1.078, 1.078, 0.875, 0.875, +2.625, 2.625, 1.000, 1.000, 2.422, 2.422, 1.000, 1.000, 2.219, 2.219, 1.000, 1.000, 2.016, 2.016, 1.000, 1.000, 1.812, 1.812, 1.000, 1.000, 1.609, 1.609, 1.000, 1.000, 1.406, 1.406, 1.000, 1.000, 1.203, 1.203, 1.000, 1.000, +2.750, 2.750, 1.125, 1.125, 2.547, 2.547, 1.125, 1.125, 2.344, 2.344, 1.125, 1.125, 2.141, 2.141, 1.125, 1.125, 1.938, 1.938, 1.125, 1.125, 1.734, 1.734, 1.125, 1.125, 1.531, 1.531, 1.125, 1.125, 1.328, 1.328, 1.125, 1.125, +2.875, 2.875, 1.250, 1.250, 2.672, 2.672, 1.250, 1.250, 2.469, 2.469, 1.250, 1.250, 2.266, 2.266, 1.250, 1.250, 2.062, 2.062, 1.250, 1.250, 1.859, 1.859, 1.250, 1.250, 1.656, 1.656, 1.250, 1.250, 1.453, 1.453, 1.250, 1.250, +3.000, 3.000, 1.375, 1.375, 2.797, 2.797, 1.375, 1.375, 2.594, 2.594, 1.375, 1.375, 2.391, 2.391, 1.375, 1.375, 2.188, 2.188, 1.375, 1.375, 1.984, 1.984, 1.375, 1.375, 1.781, 1.781, 1.375, 1.375, 1.578, 1.578, 1.375, 1.375, +3.125, 3.125, 1.500, 1.500, 2.922, 2.922, 1.500, 1.500, 2.719, 2.719, 1.500, 1.500, 2.516, 2.516, 1.500, 1.500, 2.312, 2.312, 1.500, 1.500, 2.109, 2.109, 1.500, 1.500, 1.906, 1.906, 1.500, 1.500, 1.703, 1.703, 1.500, 1.500, +3.250, 3.250, 1.625, 1.625, 3.047, 3.047, 1.625, 1.625, 2.844, 2.844, 1.625, 1.625, 2.641, 2.641, 1.625, 1.625, 2.438, 2.438, 1.625, 1.625, 2.234, 2.234, 1.625, 1.625, 2.031, 2.031, 1.625, 1.625, 1.828, 1.828, 1.625, 1.625, +3.375, 3.375, 1.750, 1.750, 3.172, 3.172, 1.750, 1.750, 2.969, 2.969, 1.750, 1.750, 2.766, 2.766, 1.750, 1.750, 2.562, 2.562, 1.750, 1.750, 2.359, 2.359, 1.750, 1.750, 2.156, 2.156, 1.750, 1.750, 1.953, 1.953, 1.750, 1.750, +3.500, 3.500, 1.875, 1.875, 3.297, 3.297, 1.875, 1.875, 3.094, 3.094, 1.875, 1.875, 2.891, 2.891, 1.875, 1.875, 2.688, 2.688, 1.875, 1.875, 2.484, 2.484, 1.875, 1.875, 2.281, 2.281, 1.875, 1.875, 2.078, 2.078, 1.875, 1.875, +1.750, 1.750, 0.000, 0.000, 1.531, 1.531, 0.000, 0.000, 1.312, 1.312, 0.000, 0.000, 1.094, 1.094, 0.000, 0.000, 0.875, 0.875, 0.000, 0.000, 0.656, 0.656, 0.000, 0.000, 0.438, 0.438, 0.000, 0.000, 0.219, 0.219, 0.000, 0.000, +1.875, 1.875, 0.125, 0.125, 1.656, 1.656, 0.125, 0.125, 1.438, 1.438, 0.125, 0.125, 1.219, 1.219, 0.125, 0.125, 1.000, 1.000, 0.125, 0.125, 0.781, 0.781, 0.125, 0.125, 0.562, 0.562, 0.125, 0.125, 0.344, 0.344, 0.125, 0.125, +2.000, 2.000, 0.250, 0.250, 1.781, 1.781, 0.250, 0.250, 1.562, 1.562, 0.250, 0.250, 1.344, 1.344, 0.250, 0.250, 1.125, 1.125, 0.250, 0.250, 0.906, 0.906, 0.250, 0.250, 0.688, 0.688, 0.250, 0.250, 0.469, 0.469, 0.250, 0.250, +2.125, 2.125, 0.375, 0.375, 1.906, 1.906, 0.375, 0.375, 1.688, 1.688, 0.375, 0.375, 1.469, 1.469, 0.375, 0.375, 1.250, 1.250, 0.375, 0.375, 1.031, 1.031, 0.375, 0.375, 0.812, 0.812, 0.375, 0.375, 0.594, 0.594, 0.375, 0.375, +2.250, 2.250, 0.500, 0.500, 2.031, 2.031, 0.500, 0.500, 1.812, 1.812, 0.500, 0.500, 1.594, 1.594, 0.500, 0.500, 1.375, 1.375, 0.500, 0.500, 1.156, 1.156, 0.500, 0.500, 0.938, 0.938, 0.500, 0.500, 0.719, 0.719, 0.500, 0.500, +2.375, 2.375, 0.625, 0.625, 2.156, 2.156, 0.625, 0.625, 1.938, 1.938, 0.625, 0.625, 1.719, 1.719, 0.625, 0.625, 1.500, 1.500, 0.625, 0.625, 1.281, 1.281, 0.625, 0.625, 1.062, 1.062, 0.625, 0.625, 0.844, 0.844, 0.625, 0.625, +2.500, 2.500, 0.750, 0.750, 2.281, 2.281, 0.750, 0.750, 2.062, 2.062, 0.750, 0.750, 1.844, 1.844, 0.750, 0.750, 1.625, 1.625, 0.750, 0.750, 1.406, 1.406, 0.750, 0.750, 1.188, 1.188, 0.750, 0.750, 0.969, 0.969, 0.750, 0.750, +2.625, 2.625, 0.875, 0.875, 2.406, 2.406, 0.875, 0.875, 2.188, 2.188, 0.875, 0.875, 1.969, 1.969, 0.875, 0.875, 1.750, 1.750, 0.875, 0.875, 1.531, 1.531, 0.875, 0.875, 1.312, 1.312, 0.875, 0.875, 1.094, 1.094, 0.875, 0.875, +2.750, 2.750, 1.000, 1.000, 2.531, 2.531, 1.000, 1.000, 2.312, 2.312, 1.000, 1.000, 2.094, 2.094, 1.000, 1.000, 1.875, 1.875, 1.000, 1.000, 1.656, 1.656, 1.000, 1.000, 1.438, 1.438, 1.000, 1.000, 1.219, 1.219, 1.000, 1.000, +2.875, 2.875, 1.125, 1.125, 2.656, 2.656, 1.125, 1.125, 2.438, 2.438, 1.125, 1.125, 2.219, 2.219, 1.125, 1.125, 2.000, 2.000, 1.125, 1.125, 1.781, 1.781, 1.125, 1.125, 1.562, 1.562, 1.125, 1.125, 1.344, 1.344, 1.125, 1.125, +3.000, 3.000, 1.250, 1.250, 2.781, 2.781, 1.250, 1.250, 2.562, 2.562, 1.250, 1.250, 2.344, 2.344, 1.250, 1.250, 2.125, 2.125, 1.250, 1.250, 1.906, 1.906, 1.250, 1.250, 1.688, 1.688, 1.250, 1.250, 1.469, 1.469, 1.250, 1.250, +3.125, 3.125, 1.375, 1.375, 2.906, 2.906, 1.375, 1.375, 2.688, 2.688, 1.375, 1.375, 2.469, 2.469, 1.375, 1.375, 2.250, 2.250, 1.375, 1.375, 2.031, 2.031, 1.375, 1.375, 1.812, 1.812, 1.375, 1.375, 1.594, 1.594, 1.375, 1.375, +3.250, 3.250, 1.500, 1.500, 3.031, 3.031, 1.500, 1.500, 2.812, 2.812, 1.500, 1.500, 2.594, 2.594, 1.500, 1.500, 2.375, 2.375, 1.500, 1.500, 2.156, 2.156, 1.500, 1.500, 1.938, 1.938, 1.500, 1.500, 1.719, 1.719, 1.500, 1.500, +3.375, 3.375, 1.625, 1.625, 3.156, 3.156, 1.625, 1.625, 2.938, 2.938, 1.625, 1.625, 2.719, 2.719, 1.625, 1.625, 2.500, 2.500, 1.625, 1.625, 2.281, 2.281, 1.625, 1.625, 2.062, 2.062, 1.625, 1.625, 1.844, 1.844, 1.625, 1.625, +3.500, 3.500, 1.750, 1.750, 3.281, 3.281, 1.750, 1.750, 3.062, 3.062, 1.750, 1.750, 2.844, 2.844, 1.750, 1.750, 2.625, 2.625, 1.750, 1.750, 2.406, 2.406, 1.750, 1.750, 2.188, 2.188, 1.750, 1.750, 1.969, 1.969, 1.750, 1.750, +3.625, 3.625, 1.875, 1.875, 3.406, 3.406, 1.875, 1.875, 3.188, 3.188, 1.875, 1.875, 2.969, 2.969, 1.875, 1.875, 2.750, 2.750, 1.875, 1.875, 2.531, 2.531, 1.875, 1.875, 2.312, 2.312, 1.875, 1.875, 2.094, 2.094, 1.875, 1.875, +1.875, 1.875, 0.000, 0.000, 1.641, 1.641, 0.000, 0.000, 1.406, 1.406, 0.000, 0.000, 1.172, 1.172, 0.000, 0.000, 0.938, 0.938, 0.000, 0.000, 0.703, 0.703, 0.000, 0.000, 0.469, 0.469, 0.000, 0.000, 0.234, 0.234, 0.000, 0.000, +2.000, 2.000, 0.125, 0.125, 1.766, 1.766, 0.125, 0.125, 1.531, 1.531, 0.125, 0.125, 1.297, 1.297, 0.125, 0.125, 1.062, 1.062, 0.125, 0.125, 0.828, 0.828, 0.125, 0.125, 0.594, 0.594, 0.125, 0.125, 0.359, 0.359, 0.125, 0.125, +2.125, 2.125, 0.250, 0.250, 1.891, 1.891, 0.250, 0.250, 1.656, 1.656, 0.250, 0.250, 1.422, 1.422, 0.250, 0.250, 1.188, 1.188, 0.250, 0.250, 0.953, 0.953, 0.250, 0.250, 0.719, 0.719, 0.250, 0.250, 0.484, 0.484, 0.250, 0.250, +2.250, 2.250, 0.375, 0.375, 2.016, 2.016, 0.375, 0.375, 1.781, 1.781, 0.375, 0.375, 1.547, 1.547, 0.375, 0.375, 1.312, 1.312, 0.375, 0.375, 1.078, 1.078, 0.375, 0.375, 0.844, 0.844, 0.375, 0.375, 0.609, 0.609, 0.375, 0.375, +2.375, 2.375, 0.500, 0.500, 2.141, 2.141, 0.500, 0.500, 1.906, 1.906, 0.500, 0.500, 1.672, 1.672, 0.500, 0.500, 1.438, 1.438, 0.500, 0.500, 1.203, 1.203, 0.500, 0.500, 0.969, 0.969, 0.500, 0.500, 0.734, 0.734, 0.500, 0.500, +2.500, 2.500, 0.625, 0.625, 2.266, 2.266, 0.625, 0.625, 2.031, 2.031, 0.625, 0.625, 1.797, 1.797, 0.625, 0.625, 1.562, 1.562, 0.625, 0.625, 1.328, 1.328, 0.625, 0.625, 1.094, 1.094, 0.625, 0.625, 0.859, 0.859, 0.625, 0.625, +2.625, 2.625, 0.750, 0.750, 2.391, 2.391, 0.750, 0.750, 2.156, 2.156, 0.750, 0.750, 1.922, 1.922, 0.750, 0.750, 1.688, 1.688, 0.750, 0.750, 1.453, 1.453, 0.750, 0.750, 1.219, 1.219, 0.750, 0.750, 0.984, 0.984, 0.750, 0.750, +2.750, 2.750, 0.875, 0.875, 2.516, 2.516, 0.875, 0.875, 2.281, 2.281, 0.875, 0.875, 2.047, 2.047, 0.875, 0.875, 1.812, 1.812, 0.875, 0.875, 1.578, 1.578, 0.875, 0.875, 1.344, 1.344, 0.875, 0.875, 1.109, 1.109, 0.875, 0.875, +2.875, 2.875, 1.000, 1.000, 2.641, 2.641, 1.000, 1.000, 2.406, 2.406, 1.000, 1.000, 2.172, 2.172, 1.000, 1.000, 1.938, 1.938, 1.000, 1.000, 1.703, 1.703, 1.000, 1.000, 1.469, 1.469, 1.000, 1.000, 1.234, 1.234, 1.000, 1.000, +3.000, 3.000, 1.125, 1.125, 2.766, 2.766, 1.125, 1.125, 2.531, 2.531, 1.125, 1.125, 2.297, 2.297, 1.125, 1.125, 2.062, 2.062, 1.125, 1.125, 1.828, 1.828, 1.125, 1.125, 1.594, 1.594, 1.125, 1.125, 1.359, 1.359, 1.125, 1.125, +3.125, 3.125, 1.250, 1.250, 2.891, 2.891, 1.250, 1.250, 2.656, 2.656, 1.250, 1.250, 2.422, 2.422, 1.250, 1.250, 2.188, 2.188, 1.250, 1.250, 1.953, 1.953, 1.250, 1.250, 1.719, 1.719, 1.250, 1.250, 1.484, 1.484, 1.250, 1.250, +3.250, 3.250, 1.375, 1.375, 3.016, 3.016, 1.375, 1.375, 2.781, 2.781, 1.375, 1.375, 2.547, 2.547, 1.375, 1.375, 2.312, 2.312, 1.375, 1.375, 2.078, 2.078, 1.375, 1.375, 1.844, 1.844, 1.375, 1.375, 1.609, 1.609, 1.375, 1.375, +3.375, 3.375, 1.500, 1.500, 3.141, 3.141, 1.500, 1.500, 2.906, 2.906, 1.500, 1.500, 2.672, 2.672, 1.500, 1.500, 2.438, 2.438, 1.500, 1.500, 2.203, 2.203, 1.500, 1.500, 1.969, 1.969, 1.500, 1.500, 1.734, 1.734, 1.500, 1.500, +3.500, 3.500, 1.625, 1.625, 3.266, 3.266, 1.625, 1.625, 3.031, 3.031, 1.625, 1.625, 2.797, 2.797, 1.625, 1.625, 2.562, 2.562, 1.625, 1.625, 2.328, 2.328, 1.625, 1.625, 2.094, 2.094, 1.625, 1.625, 1.859, 1.859, 1.625, 1.625, +3.625, 3.625, 1.750, 1.750, 3.391, 3.391, 1.750, 1.750, 3.156, 3.156, 1.750, 1.750, 2.922, 2.922, 1.750, 1.750, 2.688, 2.688, 1.750, 1.750, 2.453, 2.453, 1.750, 1.750, 2.219, 2.219, 1.750, 1.750, 1.984, 1.984, 1.750, 1.750, +3.750, 3.750, 1.875, 1.875, 3.516, 3.516, 1.875, 1.875, 3.281, 3.281, 1.875, 1.875, 3.047, 3.047, 1.875, 1.875, 2.812, 2.812, 1.875, 1.875, 2.578, 2.578, 1.875, 1.875, 2.344, 2.344, 1.875, 1.875, 2.109, 2.109, 1.875, 1.875, +}; + diff --git a/src/sdl/videogl.cpp b/src/sdl/videogl.cpp new file mode 100644 index 0000000..3da16e0 --- /dev/null +++ b/src/sdl/videogl.cpp @@ -0,0 +1,1179 @@ +#if 0 +def DREAMCAST +#include"dc/pvr.h" +#include +#endif +#include "snes4all.h" +#include "videogl.h" + +#if defined(DREAMCAST) && defined(USE_OPC_ASM) +extern unsigned videogl_changed_colors_back; +extern int videogl_info_enabled; +extern int videogl_back_no_tiles; +extern void *videogl_info_buffer; +extern void *videogl_black_buffer; +extern void *videogl_background_buffer; +extern void *videogl_addfix_buffer; +extern void *videogl_sub_buffer; +extern unsigned char videogl_changed_color[256]; +extern unsigned short videogl_actual_color[256]; +#else +int videogl_back_no_tiles=0; +int videogl_cache_reseted=1; +int videogl_cache_to_reseted=0; +unsigned char videogl_first_brightness=0; +unsigned char videogl_brightness=0; +unsigned short *videogl_cache=NULL; +unsigned videogl_tiles=0; +unsigned char videogl_min_z=255; +unsigned char videogl_max_z=0; +int videogl_hw_render=-1; +unsigned videogl_changed_colors=0; +unsigned videogl_changed_colors_back=0; +unsigned videogl_screen_endY=0; +struct ClipData *videogl_clip=NULL; +int videogl_clip_enabled=0; +int videogl_used_screen=0; +int videogl_used_addfix=0; +int videogl_addfix_x0=0; +int videogl_addfix_y0=256; +int videogl_addfix_x1=256; +int videogl_addfix_y1=0; +int videogl_used_sub=0; +unsigned short videogl_sub_color=0x8000; +int videogl_sub_x0=0; +int videogl_sub_y0=256; +int videogl_sub_x1=256; +int videogl_sub_y1=0; +int videogl_8bit_tiles=0; +void *videogl_info_buffer=NULL; +void *videogl_black_buffer=NULL; +void *videogl_background_buffer=NULL; +void *videogl_addfix_buffer=NULL; +void *videogl_sub_buffer=NULL; +void *videogl_screen_buffer=NULL; +GLint videogl_screen_texture=0; +SDL_Surface *videogl_screen=NULL; +float videogl_z=0.0; +int videogl_fps_enabled=0; +void *videogl_fps_buffer=NULL; +int videogl_info_enabled=0; +unsigned char videogl_changed_color[256]; +unsigned short videogl_actual_color[256]; +unsigned short videogl_tiles_z[256]; +unsigned short videogl_cached[VIDEO_GL_MAX_TEX]; +unsigned short videogl_background_color[VIDEO_GL_RASTER]; +unsigned short videogl_addfix_color[VIDEO_GL_RASTER]; +#ifndef USE_VIDEOGL_DIRECT_SLOT +unsigned videogl_cache_slot_last=0; +unsigned short videogl_cache_slot[VIDEO_GL_MAX_TEX]; +unsigned short videogl_cache_tile_slot[VIDEO_GL_MAX_TEX]; +#endif +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET +unsigned short videogl_selective[256]; +unsigned short videogl_selective_cache[VIDEO_GL_SELECTIVE_MAX_CACHE*256]; +#endif +videogl_tile_list_t videogl_tile[VIDEO_GL_MAX_TEX]; +#endif + +#ifndef DREAMCAST +GLint videogl_info_texture=0; +GLint videogl_fps_texture=0; +GLint videogl_black_texture=0; +GLint videogl_background_texture=0; +GLint videogl_addfix_texture=0; +GLint videogl_sub_texture=0; +GLint videogl_tex[VIDEO_GL_MAX_TEX]; +#else +static pvr_poly_hdr_t videogl_polyhdr; +extern pvr_poly_cxt_t gl_poly_cxt; +#define DREAMCAST_FAST_TILE_PER_TEXTURE +#define DREAMCAST_USE_DMA_FOR_SCREEN +#endif + +#define PREPARE_TILE(WIDTH,HEIGHT,BLEND_SRC,BLEND_DST) \ + gl_poly_cxt.txr.filter= PVR_FILTER_TRILINEAR2 /*SNES4ALL_FILTER_NONE*/; \ + gl_poly_cxt.gen.alpha = PVR_ALPHA_DISABLE; \ + gl_poly_cxt.txr.alpha = PVR_TXRALPHA_ENABLE; \ + gl_poly_cxt.blend.src = (BLEND_SRC); \ + gl_poly_cxt.blend.dst = (BLEND_DST); \ + gl_poly_cxt.gen.culling = PVR_CULLING_NONE; \ + gl_poly_cxt.txr.width = WIDTH; \ + gl_poly_cxt.txr.height = HEIGHT; \ + gl_poly_cxt.txr.format = GL_ARGB1555 +#define PUT_VERTEX(X,Y,TX,TY,Z,CMD) \ + { \ + pvr_vertex_t *vert=pvr_dr_target(dr_state); \ + vert->argb = 0xffffffff; \ + vert->oargb = 0xff000000; \ + vert->flags = CMD; \ + vert->x = X; \ + vert->y = Y; \ + vert->z = Z; \ + vert->u = TX; \ + vert->v = TY; \ + pvr_dr_commit(vert); \ + } +#define PUT_TILE(X0,Y0,X1,Y1,TX0,TY0,TX1,TY1,Z) \ + { \ + static pvr_dr_state_t dr_state; \ + pvr_dr_init(dr_state); \ + PUT_VERTEX(X0,Y0,TX0,TY0,Z,PVR_CMD_VERTEX) \ + PUT_VERTEX(X1,Y0,TX1,TY0,Z,PVR_CMD_VERTEX) \ + PUT_VERTEX(X0,Y1,TX0,TY1,Z,PVR_CMD_VERTEX) \ + PUT_VERTEX(X1,Y1,TX1,TY1,Z,PVR_CMD_VERTEX_EOL) \ + } + +#ifdef USE_VGL_TABLE +#ifdef USE_VGL_LARGE_TABLE +#include "vgl.h" +#else +static float _vgl_tx0[]={ + 0.000, 1.000, 0.000, 1.000, + 0.000, 0.875, 0.000, 0.875, + 0.000, 0.750, 0.000, 0.750, + 0.000, 0.625, 0.000, 0.625, + 0.000, 0.500, 0.000, 0.500, + 0.000, 0.375, 0.000, 0.375, + 0.000, 0.250, 0.000, 0.250, + 0.000, 0.125, 0.000, 0.125, +}; + +static float _vgl_tx1[]={ + 1.000, 0.000, 1.000, 0.000, + 0.875, 0.000, 0.875, 0.000, + 0.750, 0.000, 0.750, 0.000, + 0.625, 0.000, 0.625, 0.000, + 0.500, 0.000, 0.500, 0.000, + 0.375, 0.000, 0.375, 0.000, + 0.250, 0.000, 0.250, 0.000, + 0.125, 0.000, 0.125, 0.000, +}; +static float _vgl_ty0[]={ + 0.000, 0.000, 1.000, 1.000, + 0.000, 0.000, 0.875, 0.875, + 0.000, 0.000, 0.750, 0.750, + 0.000, 0.000, 0.625, 0.625, + 0.000, 0.000, 0.500, 0.500, + 0.000, 0.000, 0.375, 0.375, + 0.000, 0.000, 0.250, 0.250, + 0.000, 0.000, 0.125, 0.125, +}; +static float _vgl_ty1[]={ + 1.000, 1.000, 0.000, 0.000, + 0.875, 0.875, 0.000, 0.000, + 0.750, 0.750, 0.000, 0.000, + 0.625, 0.625, 0.000, 0.000, + 0.500, 0.500, 0.000, 0.000, + 0.375, 0.375, 0.000, 0.000, + 0.250, 0.250, 0.000, 0.000, + 0.125, 0.125, 0.000, 0.000, +}; +#endif +#endif + +#if defined(DISPLAY_FRAMERATE) && !defined(DEBUG_FRAMESKIP) +static void videogl_draw_fps(void) { + if (videogl_fps_enabled) { + videogl_fps_enabled=0; +#ifndef DREAMCAST + glEnable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D, videogl_fps_texture); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 64, 8, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, videogl_fps_buffer); + loadTextureParams(SNES4ALL_FILTER_NONE); + glBegin(GL_QUADS); + glTexCoord2f(0.0,0.0); + glVertex3f(0.0,0.0,videogl_z); + glTexCoord2f(1.0,0.0); + glVertex3f(64.0,0,videogl_z); + glTexCoord2f(1.0,1.0); + glVertex3f(64.0,8.0,videogl_z); + glTexCoord2f(0.0,1.0); + glVertex3f(0.0,8.0,videogl_z); + glEnd(); +#else + float x0 = 0.0; + float y0 = 0.0; + float x1 = 64.0*(640.0f/256.0f); + float y1 = 8.0*(480.0f/240.0f); + float tx0 = 0.0; + float ty0 = 0.0; + float tx1 = 1.0; + float ty1 = 1.0; + PREPARE_TILE(64,8 ,PVR_BLEND_SRCALPHA, PVR_BLEND_INVSRCALPHA); + static pvr_poly_hdr_t polyhdr; + gl_poly_cxt.txr.base =(unsigned short *)videogl_fps_buffer; + pvr_poly_compile(&polyhdr, &gl_poly_cxt); + pvr_prim(&polyhdr, sizeof(pvr_poly_hdr_t)); + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#endif + videogl_z+=VIDEO_GL_TILE_Z_INC; + } +} +#else +#define videogl_draw_fps() +#endif + +static void videogl_draw_info(void) { +#ifndef DREAMCAST + glEnable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D, videogl_info_texture); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 8, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, videogl_info_buffer); + loadTextureParams(SNES4ALL_FILTER_NONE); + glBegin(GL_QUADS); + glTexCoord2f(0.0,0.0); + glVertex3f(0.0,232.0,videogl_z); + glTexCoord2f(1.0,0.0); + glVertex3f(256.0,232.0,videogl_z); + glTexCoord2f(1.0,1.0); + glVertex3f(256.0,240.0,videogl_z); + glTexCoord2f(0.0,1.0); + glVertex3f(0.0,240.0,videogl_z); + glEnd(); +#else + float x0 = 0.0f; + float y0 = 228.0f*(480.0f/240.0f); + float x1 = 256.0f*(640.0f/256.0f); + float y1 = 236.0f*(480.0f/240.0f); + float tx0 = 0.0f; + float ty0 = 0.0f; + float tx1 = 1.0f; + float ty1 = 1.0f; + PREPARE_TILE(256,8 ,PVR_BLEND_SRCALPHA, PVR_BLEND_INVSRCALPHA); + static pvr_poly_hdr_t polyhdr; + gl_poly_cxt.txr.base =(unsigned short *)videogl_info_buffer; + pvr_poly_compile(&polyhdr, &gl_poly_cxt); + pvr_prim(&polyhdr, sizeof(pvr_poly_hdr_t)); + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#endif + videogl_z+=VIDEO_GL_TILE_Z_INC; +} + +static void videogl_draw_screen(void) { +#ifndef DREAMCAST + if (videogl_hw_render) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D,videogl_screen_texture); + loadTextureParams(SNES4ALL_FILTER_NONE); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, videogl_screen_buffer); + float x1=0.0,y1=0.0,x2=256.0,y2=256.0;//274.0; + glBegin(GL_QUADS); + glTexCoord2f(0.0,0.0); + glVertex3f(x1,y1,videogl_z); + glTexCoord2f(1.0,0.0); + glVertex3f(x2,y1,videogl_z); + glTexCoord2f(1.0,1.0); + glVertex3f(x2,y2,videogl_z); + glTexCoord2f(0.0,1.0); + glVertex3f(x1,y2,videogl_z); + glEnd(); + if (!videogl_hw_render) + glEnable(GL_BLEND); +#else + float x0 = 0.0; + float y0 = 0.0; + float x1 = 256.0*(640.0f/256.0f); + float y1 = /*274.0*/256.0*(480.0f/240.0f); + float tx0 = 0.0; + float ty0 = 0.0; + float tx1 = 1.0; + float ty1 = 1.0; +#ifndef DREAMCAST_USE_DMA_FOR_SCREEN + if (!videogl_screen_endY) + sq_cpy(videogl_screen_buffer,GFX.Screen,240*256*2); + else + sq_cpy(videogl_screen_buffer,GFX.Screen,videogl_screen_endY*256*2); +#else +// while (!pvr_dma_ready()); + if (!videogl_screen_endY) { + dcache_flush_range(((uint32)GFX.Screen)+180*256*2,60*256*2); + pvr_txr_load_dma(GFX.Screen,videogl_screen_buffer,240*256*2,-1,NULL,NULL); + }else if (videogl_screen_endY>60) { + dcache_flush_range(((uint32)GFX.Screen)+(videogl_screen_endY-60)*256*2,60*256*2); + pvr_txr_load_dma(GFX.Screen,videogl_screen_buffer,videogl_screen_endY*256*2,-1,NULL,NULL); + }else { + dcache_flush_range(((uint32)GFX.Screen),(videogl_screen_endY)*256*2); + pvr_txr_load_dma(GFX.Screen,videogl_screen_buffer,videogl_screen_endY*256*2,-1,NULL,NULL); + } + videogl_screen_endY=0; +#endif + PREPARE_TILE(256,256 ,videogl_hw_render?PVR_BLEND_SRCALPHA:PVR_BLEND_ONE, videogl_hw_render?PVR_BLEND_INVSRCALPHA:PVR_BLEND_ZERO); + static pvr_poly_hdr_t polyhdr; + gl_poly_cxt.txr.base =(unsigned short *)videogl_screen_buffer; + pvr_poly_compile(&polyhdr, &gl_poly_cxt); + pvr_prim(&polyhdr, sizeof(pvr_poly_hdr_t)); + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#endif + videogl_z+=VIDEO_GL_TILE_Z_INC; +} + + +static void videogl_draw_black(int _x0, int _y0, int _x1, int _y1){ +#ifndef DREAMCAST + glDisable(GL_BLEND); + glBindTexture(GL_TEXTURE_2D,videogl_black_texture); + loadTextureParams(SNES4ALL_FILTER_NONE); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, videogl_black_buffer); + float x0=_x0,y0=_y0,x1=_x1,y1=_y1; + glBegin(GL_QUADS); + glTexCoord2f(0.0,0.0); + glVertex3f(x0,y0,videogl_z); + glTexCoord2f(1.0,0.0); + glVertex3f(x1,y0,videogl_z); + glTexCoord2f(1.0,1.0); + glVertex3f(x1,y1,videogl_z); + glTexCoord2f(0.0,1.0); + glVertex3f(x0,y1,videogl_z); + glEnd(); +#else + float x0 = ((float)_x0)*(640.0f/256.0f); + float y0 = ((float)_y0)*(480.0f/240.0f); + float x1 = ((float)_x1)*(640.0f/256.0f); + float y1 = ((float)_y1)*(480.0f/240.0f); + float tx0 = 0.0; + float ty0 = 0.0; + float tx1 = 1.0; + float ty1 = 1.0; + PREPARE_TILE(8,8 ,PVR_BLEND_ONE, PVR_BLEND_ZERO); //SRCALPHA, PVR_BLEND_INVSRCALPHA); + static pvr_poly_hdr_t polyhdr; + gl_poly_cxt.txr.base =(unsigned short *)videogl_black_buffer; + pvr_poly_compile(&polyhdr, &gl_poly_cxt); + pvr_prim(&polyhdr, sizeof(pvr_poly_hdr_t)); + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#endif + videogl_z+=VIDEO_GL_TILE_Z_INC; +} + +#if 0 +static void videogl_draw_sub(void){ + static unsigned short back_col=0x8000; + if (videogl_sub_color!=back_col) { + back_col=videogl_sub_color; + for(int i=0;i<8*8;i++) + ((unsigned short*)(videogl_sub_buffer))[i]=back_col; + } +//printf("draw_sub %.4X (%i %i %i %i)\n",videogl_sub_color,videogl_sub_x0,videogl_sub_y0, videogl_sub_x1,videogl_sub_y1); +#ifndef DREAMCAST +// glDisable(GL_BLEND); + glEnable(GL_BLEND); + glBlendFunc(GL_ZERO, GL_ONE); + glBindTexture(GL_TEXTURE_2D,videogl_sub_texture); + loadTextureParams(SNES4ALL_FILTER_NONE); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, videogl_sub_buffer); + float x1=videogl_sub_x0, y1=videogl_sub_y0, x2=videogl_sub_x1, y2=videogl_sub_y1; + glBegin(GL_QUADS); + glTexCoord2f(0.0,0.0); + glVertex3f(x1,y1,videogl_z); + glTexCoord2f(1.0,0.0); + glVertex3f(x2,y1,videogl_z); + glTexCoord2f(1.0,1.0); + glVertex3f(x2,y2,videogl_z); + glTexCoord2f(0.0,1.0); + glVertex3f(x1,y2,videogl_z); + glEnd(); +#else + float x0 = ((float)videogl_sub_x0)*(640.0f/256.0f); + float y0 = ((float)videogl_sub_y0)*(480.0f/240.0f); + float x1 = ((float)videogl_sub_x1)*(640.0f/256.0f); + float y1 = ((float)videogl_sub_y1)*(480.0f/240.0f); + float tx0 = 0.0; + float ty0 = 0.0; + float tx1 = 1.0; + float ty1 = 1.0; + PREPARE_TILE(8,8 ,PVR_BLEND_ONE, PVR_BLEND_ZERO); + static pvr_poly_hdr_t polyhdr; + gl_poly_cxt.txr.base =(unsigned short *)videogl_sub_buffer; + pvr_poly_compile(&polyhdr, &gl_poly_cxt); + pvr_prim(&polyhdr, sizeof(pvr_poly_hdr_t)); + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#endif + + videogl_z+=VIDEO_GL_TILE_Z_INC; +} +#endif + +static void videogl_draw_background(void){ +#ifndef DREAMCAST + for(unsigned i=0;i>26)<<2)&0x1c; + QACR1 = ((((unsigned int)videogl_background_buffer)>>26)<<2)&0x1c; +#else + unsigned int *d = (unsigned int *)(void *) + ((0xe0000000 | (((unsigned long)videogl_background_buffer) & 0x03ffffe0))|((((unsigned)videogl_background_buffer)>>3)&0x3800000)); +#endif + for(unsigned m=0;m>26)<<2)&0x1c; + QACR1 = ((((unsigned int)videogl_addfix_buffer)>>26)<<2)&0x1c; +#else + unsigned int *d = (unsigned int *)(void *) + ((0xe0000000 | (((unsigned long)videogl_addfix_buffer) & 0x03ffffe0))|((((unsigned)videogl_background_buffer)>>3)&0x3800000)); +#endif + for(unsigned m=0;mtile>VIDEO_GL_MAX_TEX) printf("TILE %i> %i\n",tile->tile,VIDEO_GL_MAX_TEX); +#ifdef USE_VGL_TABLE +#ifndef USE_VGL_LARGE_TABLE + const float tx0=_vgl_tx0[tile->flip]; + const float tx1=_vgl_tx1[tile->flip]; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + const float ty0=_vgl_ty0[tile->flip]+((1.0/8.0)*(tile->clipy)); + const float ty1=((_vgl_ty1[tile->flip]/8.0)*(tile->y1))+((1.0/8.0)*(tile->clipy)); +#else + const float ty0=_vgl_ty0[tile->flip]+((1.0/8.0)*(tile->clipy&0xf)); + const float ty1=((_vgl_ty1[tile->flip]/8.0)*(tile->clipy>>4))+((1.0/8.0)*(tile->clipy&0xf)); +#endif +#else + const float tx0=vgl_tx0[tile->flip]; + const float tx1=vgl_tx1[tile->flip]; + const float ty0=vgl_ty0[((unsigned)tile->flip)+(((unsigned)tile->clipy)<<5)]; + const float ty1=vgl_ty1[((unsigned)tile->flip)+(((unsigned)tile->clipy)<<5)]; +#endif +#else + float tx0, tx1, ty0, ty1; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + switch(tile->flip) { +#else + switch(tile->flip&3) { +#endif + case 0: + tx0=0.000; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tx1=1.000-(0.125*(tile->mosaic)); + ty1=(((1.000-(0.125*(tile->mosaic)))/8.0)*(tile->y1))+(0.125*(tile->clipy)); + ty0=0.000+(0.125*(tile->clipy)); +#else + tx1=1.000-(0.125*(tile->flip>>2)); + ty1=(((1.000-(0.125*(tile->flip>>2)))/8.0)*(tile->clipy>>4))+(0.125*(tile->clipy&0xf)); + ty0=0.000+(0.125*(tile->clipy&0xf)); +#endif + break; + case 1: +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tx0=1.000-(0.125*(tile->mosaic)); + ty1=(((1.000-(0.125*(tile->mosaic)))/8.0)*(tile->y1))+(0.125*(tile->clipy)); + ty0=0.000+(0.125*(tile->clipy)); +#else + tx0=1.000-(0.125*(tile->flip>>2)); + ty1=(((1.000-(0.125*(tile->flip>>2)))/8.0)*(tile->clipy>>4))+(0.125*(tile->clipy&0xf)); + ty0=0.000+(0.125*(tile->clipy&0xf)); +#endif + tx1=0.000; + break; + case 2: + tx0=0.000; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tx1=1.000-(0.125*(tile->mosaic)); + ty0=1.000-(0.125*(tile->mosaic))+(0.125*(tile->clipy)); + ty1=0.000+(0.125*(tile->clipy)); +#else + tx1=1.000-(0.125*(tile->flip>>2)); + ty0=1.000-(0.125*(tile->flip>>2))+(0.125*(tile->clipy&0xf)); + ty1=0.000+(0.125*(tile->clipy&0xf)); +#endif + break; + default: +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tx0=1.000-(0.125*(tile->mosaic)); + ty0=1.000-(0.125*(tile->mosaic))+(0.125*(tile->clipy)); + ty1=0.000+(0.125*(tile->clipy)); +#else + tx0=1.000-(0.125*(tile->flip>>2)); + ty0=1.000-(0.125*(tile->flip>>2))+(0.125*(tile->clipy&0xf)); + ty1=0.000+(0.125*(tile->clipy&0xf)); +#endif + tx1=0.000; + } +#endif +#ifdef DREAMCAST +#ifdef USE_VIDEOGL_EXTEND_TILELIST + const float x0=((float)((tile->x)-(tile->clipx)))*(640.0f/256.0f); +#else + const float x0=((float)((tile->x)-(tile->clipx&0x7)))*(640.0f/256.0f); +#endif + const float y0=((float)(tile->y))*(480.0f/240.0f); + const float x1=x0+(8.0*(640.0f/256.0f)); +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + const float y1=(y0+((tile->y1))*(480.0f/240.0f)); +#else + const float y1=(y0+((tile->clipy>>4))*(480.0f/240.0f)); +#endif +#else +#ifdef USE_VIDEOGL_EXTEND_TILELIST + float x0 = ((tile->x)-(tile->clipx)); +#else + float x0 = ((tile->x)-(tile->clipx&0x7)); +#endif + float y0 = (tile->y); //-(tile->clipy&0xf)); + float x1 = x0 + 8.0; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + float y1 = y0 + (tile->y1); +#else + float y1 = y0 + (tile->clipy>>4); +#endif +#endif +#ifdef USE_VIDEOGL_DIRECT_SLOT + const void *txr_buf=(unsigned short *)(((unsigned)videogl_cache)+(tile->tile*8*8*2)); +#else + const void *txr_buf=(unsigned short *)(((unsigned)videogl_cache)+(videogl_cache_tile_slot[tile->tile]*8*8*2)); +#endif +//printf("draw x0=%f, y0=%f, x1=%f, y1=%f, ty0=%f, ty1=%f\n",(double)x0,(double)y0,(double)x1,(double)y1,(double)ty0,(double)ty1); +//printf("draw x=%i, y=%i, flip=%X, tile=%i, z=%f (%i)\n",tile->x,tile->y,tile->flip,tile->tile,videogl_z,tile->z); + +#ifndef DREAMCAST + glBindTexture(GL_TEXTURE_2D, videogl_tex[tile->tile]); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) glBlendFunc(GL_ONE,GL_ONE); +#else + if (tile->clipx&8) glBlendFunc(GL_ONE,GL_ONE); +#endif + loadTextureParams(SNES4ALL_FILTER_NONE); + glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, + GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, txr_buf); + glBegin(GL_QUADS); + glTexCoord2f(tx0,ty0); + glVertex3f(x0,y0,videogl_z); + glTexCoord2f(tx1,ty0); + glVertex3f(x1,y0,videogl_z); + glTexCoord2f(tx1,ty1); + glVertex3f(x1,y1,videogl_z); + glTexCoord2f(tx0,ty1); + glVertex3f(x0,y1,videogl_z); + glEnd(); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#else + if (tile->clipx&8) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#endif +#else +#ifndef DREAMCAST_FAST_TILE_PER_TEXTURE +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) {gl_poly_cxt.blend.src = PVR_BLEND_ONE;/*SRCALPHA;*/ gl_poly_cxt.blend.dst = PVR_BLEND_ONE; } +#else + if (tile->clipx&8) {gl_poly_cxt.blend.src = PVR_BLEND_ONE;/*SRCALPHA;*/ gl_poly_cxt.blend.dst = PVR_BLEND_ONE; } +#endif + gl_poly_cxt.txr.base = txr_buf; + pvr_poly_compile(&videogl_polyhdr, &gl_poly_cxt); + pvr_prim(&videogl_polyhdr, sizeof(pvr_poly_hdr_t)); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) { gl_poly_cxt.blend.src = PVR_BLEND_SRCALPHA; gl_poly_cxt.blend.dst = PVR_BLEND_INVSRCALPHA; } +#else + if (tile->clipx&8) { gl_poly_cxt.blend.src = PVR_BLEND_SRCALPHA; gl_poly_cxt.blend.dst = PVR_BLEND_INVSRCALPHA; } +#endif +#else + unsigned txr_base=(unsigned)txr_buf; + uint32 mode2=videogl_polyhdr.mode2; +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) videogl_polyhdr.mode2 = (mode2 & (~(PVR_TA_PM2_SRCBLEND_MASK|PVR_TA_PM2_DSTBLEND_MASK))) | (PVR_BLEND_ONE << PVR_TA_PM2_SRCBLEND_SHIFT) | (PVR_BLEND_ONE << PVR_TA_PM2_DSTBLEND_SHIFT); +#else + if (tile->clipx&8) videogl_polyhdr.mode2 = (mode2 & (~(PVR_TA_PM2_SRCBLEND_MASK|PVR_TA_PM2_DSTBLEND_MASK))) | (PVR_BLEND_ONE << PVR_TA_PM2_SRCBLEND_SHIFT) | (PVR_BLEND_ONE << PVR_TA_PM2_DSTBLEND_SHIFT); +#endif + txr_base = (txr_base & 0x00fffff8) >> 3; + videogl_polyhdr.mode3=(videogl_polyhdr.mode3&0xffe00000)|txr_base; + { + unsigned int *s = (unsigned int *)&videogl_polyhdr; +#ifndef USE_MMU + unsigned int *d = (unsigned int *)(void *) + (0xe0000000 | (((unsigned long)PVR_TA_INPUT) & 0x03ffffe0)); + QACR0 = ((((unsigned int)PVR_TA_INPUT)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)PVR_TA_INPUT)>>26)<<2)&0x1c; +#else + unsigned int *d = (unsigned int *)(void *) + ((0xe0000000 | (((unsigned long)PVR_TA_INPUT) & 0x03ffffe0))|((((unsigned)PVR_TA_INPUT)>>3)&0x3800000)); +#endif + unsigned n=sizeof(pvr_poly_hdr_t)>>5; + while(n--) { + asm("pref @%0" : : "r" (s + 8)); + d[0] = *(s++); d[1] = *(s++); d[2] = *(s++); d[3] = *(s++); + d[4] = *(s++); d[5] = *(s++); d[6] = *(s++); d[7] = *(s++); + asm("pref @%0" : : "r" (d)); + d += 8; + } + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + } +#endif + PUT_TILE(x0,y0,x1,y1,tx0,ty0,tx1,ty1,videogl_z) +#ifdef DREAMCAST_FAST_TILE_PER_TEXTURE +#ifdef USE_VIDEOGL_EXTEND_TILELIST + if (tile->add) videogl_polyhdr.mode2=mode2; +#else + if (tile->clipx&8) videogl_polyhdr.mode2=mode2; +#endif +#endif +#endif + videogl_z+=VIDEO_GL_TILE_Z_INC; +} + +static void videogl_draw_tiles(void) { +//printf("DRAW_TILES %i\n",videogl_tiles); +#ifdef DREAMCAST + PREPARE_TILE(8,8 ,PVR_BLEND_SRCALPHA, PVR_BLEND_INVSRCALPHA); +#ifdef DREAMCAST_FAST_TILE_PER_TEXTURE + pvr_poly_compile(&videogl_polyhdr, &gl_poly_cxt); +#endif +#else + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#endif + if (videogl_used_screen) { + if (videogl_min_z>videogl_used_screen) + videogl_min_z=videogl_used_screen; + if (videogl_max_z=0;--i) { + register const int imax=videogl_tiles; + for(int i=0;i>10)&0x1f)/31.0, + ((videogl_background_color[0]>>5)&0x1f)/31.0, + ((videogl_background_color[0]>>0)&0x1f)/31.0); + +#else + glClearColor( ((videogl_background_color[0]>>0)&0x1f)/31.0, + ((videogl_background_color[0]>>5)&0x1f)/31.0, + ((videogl_background_color[0]>>10)&0x1f)/31.0, + 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +#endif + videogl_draw_background(); + if (!videogl_hw_render || (!videogl_tiles && videogl_used_screen)) + videogl_draw_screen(); +#if 0 + if (videogl_used_sub) + videogl_draw_sub(); +#endif + if (videogl_used_addfix) + videogl_draw_addfix(); +#ifdef DREAMCAST +// glKosFinishList(); +#endif + if (videogl_hw_render && videogl_tiles && !videogl_back_no_tiles) + videogl_draw_tiles(); + else + if (videogl_tiles) + videogl_back_no_tiles=0; + if (PPU.ScreenHeight<240) + videogl_draw_black(0,PPU.ScreenHeight-(videogl_used_screen?1:0),256,240); + if (videogl_clip) { + for (unsigned i=0;iCount[videogl_clip_enabled];i++) { + unsigned Left=videogl_clip->Left[i][videogl_clip_enabled]; + unsigned Right=videogl_clip->Right[i][videogl_clip_enabled]; +//printf("CLIP %i %i\n",videogl_clip->Left[i][videogl_clip_enabled],videogl_clip->Right[i][videogl_clip_enabled]); + if (Right<=Left) continue; + if (Left) + videogl_draw_black(0,0,Left,240); + if (Right<256) + videogl_draw_black(Right,0,256,240); + } + } + videogl_draw_fps(); + if (videogl_info_enabled) { + videogl_draw_info(); + videogl_info_enabled=0; + } +#ifndef DREAMCAST + SDL_GL_SwapBuffers(); +#else +#ifdef DREAMCAST_USE_DMA_FOR_SCREEN +// while (!pvr_dma_ready()); +#endif + glKosFinishFrame(); +#endif + if (videogl_hw_render) { + if (videogl_changed_colors && !videogl_cache_to_reseted) { +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET +//unsigned destr=0, iter=0; + if (videogl_8bit_tiles /*|| videogl_tiles<900*/) { + videogl_changed_colors=0; + videogl_cache_to_reseted=4; + } else + for(unsigned j=0;(j<256)&&(videogl_changed_colors);j+=USE_VIDEOGL_SELECTIVE_CACHE_RESET) { + unsigned changed=0; + const unsigned imax=j+16; + for(unsigned i=j;i40) { + videogl_cache_reseted=1; + videogl_changed_colors_back=0; + }else + if (changed>1) { +//puts("RESET por changed>"); + videogl_cache_to_reseted=8; + videogl_changed_colors_back=0; + } else { + if (videogl_changed_colors_back){ + if (changed>videogl_changed_colors_back) { +//puts("RESET por changed!="); + videogl_changed_colors_back=0; + videogl_cache_to_reseted=8; + } + } else { + videogl_changed_colors_back=changed; + } + } + } else { + if (videogl_changed_colors_back>1 && !videogl_cache_to_reseted) + videogl_cache_to_reseted=8; + videogl_changed_colors_back=0; +#endif +//if (cambiados) printf("SELECTIVE %i\n",cambiados); + } + if (videogl_brightness!=videogl_first_brightness) { +//printf("FIX: videogl_brightness=%.2X, first=%.2X, PPU=%.2X\n",videogl_brightness,videogl_first_brightness,PPU.Brightness); + PPU.Brightness=videogl_first_brightness; + S9xFixColourBrightness(); + videogl_brightness=videogl_first_brightness; + videogl_cache_reseted=1; + } +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET + videogl_tiles=0; +#endif +//static unsigned nframe=0; +//nframe++; + if (videogl_cache_reseted) { +//static unsigned nreset=0; +//printf("RESET %i/%i!\n",nreset++,nframe); + videogl_cache_reseted=0; + videogl_cache_to_reseted=0; + videogl_changed_colors_back=0; + videogl_changed_colors=0; + ZeroMemory(&videogl_changed_color[0],sizeof(videogl_changed_color)); + memcpy((void *)&videogl_actual_color,(void *)&IPPU.ScreenColors[0],256*sizeof(unsigned short)); + ZeroMemory(&videogl_cached[0],sizeof(videogl_cached)); +#ifndef USE_VIDEOGL_DIRECT_SLOT + ZeroMemory(&videogl_cache_slot[0],sizeof(videogl_cache_slot)); + memset(&videogl_cache_tile_slot[0],-1,sizeof(videogl_cache_tile_slot)); +#endif +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET + ZeroMemory(&videogl_selective[0],sizeof(videogl_selective)); +#endif + } + } // videogl_hw_render + if (videogl_used_screen) { + videogl_used_screen=0; +// ZeroMemory(videogl_screen_buffer,sizeof(256*256*2)); + } + if (videogl_used_addfix) { + videogl_used_addfix=0; + videogl_addfix_y0=256; + videogl_addfix_y1=0; + } +#if 0 + if (videogl_used_sub) { + videogl_used_sub=0; + videogl_sub_y0=256; + videogl_sub_y1=0; + } +#endif + videogl_8bit_tiles=0; + videogl_clip=NULL; + videogl_clip_enabled=0; + videogl_max_z=0; + videogl_min_z=255; + } +//puts("SWAP"); +//SDL_Delay(333); +//static int pintado=0; if (pintado>1) {SDL_Event e; while(SDL_PollEvent(&e)) SDL_Delay(333); do{ while(SDL_PollEvent(&e)) if (e.type==SDL_QUIT || e.type==SDL_KEYDOWN) exit(0); SDL_Delay(333); }while(1);} else printf("---- FRAME %i ----\n",pintado); pintado++; +} + +static void videogl_init_cache(void) { + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + +#ifndef DREAMCAST + videogl_screen_buffer=malloc(SNES4ALL_SCREEN_PITCH*256); + videogl_cache=(unsigned short *)malloc(VIDEO_GL_MAX_TEX *8*8*2); + for(int i=0;i +#include +#include +#include +#include +#include +#include "save_icon.h" + +#define VMUFILE_PAD 128+512 +#define VMUDIR "/vmu/a1/" +#define RAMDIR "/ram/" + +static unsigned char *paquete=NULL; +static int paquete_size=0; + +#ifdef DEBUG_SAVESTATE +#include +static char ___getcwd[1024]; +#define currentdir() getcwd((char *)&___getcwd[0],1023) +#endif + +static void eliminate_file(char *filename) +{ +#ifdef DEBUG_SAVESTATE + printf("save: eliminate_file(%s) [%s]\n",filename,currentdir());fflush(stdout); +#endif + FILE *f=fopen(filename,"r"); + if (f) + { + fclose(f); + unlink(filename); + } +} + +static void prepare_save(void) +{ + if (paquete) + return; + char *str="SNES4ALL"; + vmu_pkg_t pkg; + memset(&pkg, 0, sizeof(pkg)); + strcpy(pkg.desc_short, str); + strcpy(pkg.desc_long, str); + strcpy(pkg.app_id, str); + pkg.icon_cnt = 1; + pkg.icon_anim_speed = 0; + pkg.eyecatch_type = VMUPKG_EC_NONE; + pkg.eyecatch_data = NULL; + pkg.data_len = 4; + pkg.data = (const uint8*)&pkg; + memcpy((void *)&pkg.icon_pal[0],(void *)&vmu_savestate_icon_pal,32); + pkg.icon_data = (const uint8*)&vmu_savestate_icon_data; + vmu_pkg_build(&pkg, &paquete, &paquete_size); + paquete_size-=4; +} + +static void rebuild_paquete(unsigned size, void* _data, FILE *f) +{ + extern char CMemory_ROMName []; + char *name=(char *)CMemory_ROMName; + unsigned char *data=(unsigned char *)_data; + unsigned short *crc=(unsigned short*) &paquete[0x46]; + unsigned *data_len=(unsigned *) &paquete[0x48]; + char *desc_long=(char *) &paquete[16]; + bzero(desc_long,32); + strncpy(desc_long,name,31); + *data_len=size; + int i, c, n = 0; + (*crc)=0; + for (i = 0; i < paquete_size; i++) + { + if (i0) { + void *buf=malloc(len); + strcpy(filename,VMUDIR); + strcat(filename,fname); + FILE *fo=fopen(filename,"rb"); +#ifdef DEBUG_SAVESTATE + printf("save: abrimos %s\n",filename); +#endif + unsigned libres=getFreeBlocks(); + fseek(fi,0,SEEK_SET); + int quitalo=fread(buf,1,len,fi); +#ifdef DEBUG_SAVESTATE + printf("save: leemos %i de origen (%.8X)\n",quitalo,calculachk(buf,len)); +#endif + prepare_save(); + ret=3; + if (fo) { + fseek(fi,0,SEEK_END); + long l=ftell(fi); +#ifdef DEBUG_SAVESTATE + printf("save: existe len=%i\n",l); +#endif + if (l%512) l+=512; + libres+=l/512; + fclose(fo); + } +#ifdef DEBUG_SAVESTATE + else + puts("save: no existe"); +#endif + if ((libres*512)>=(len+512+VMUFILE_PAD)){ + ret=3; + fo=fopen(filename,"wb"); +#ifdef DEBUG_SAVESTATE + printf("save: abrimos escritura %s\n",filename); +#endif + if (fo) { + ret=0; + rebuild_paquete(len, buf, fo); + fwrite((void *)&len,1,4,fo); + int quitar=fwrite(buf,1,len,fo); + fclose(fo); +#ifdef DEBUG_SAVESTATE + printf("save: escribimos %i + 4 + %i = %i (%.8X)\n",quitar,VMUFILE_PAD, VMUFILE_PAD+4+quitar,calculachk(buf,quitar)); +#endif + } + } + free(buf); + } + fclose(fi); + } +#ifdef DEBUG_SAVESTATE + printf("save_to_vmu - return %i\n",ret);fflush(stdout); +#endif + return ret; +} + +int load_from_vmu(char *fname) +{ +#ifdef DEBUG_SAVESTATE + printf("load_from_vmu '%s'\n",fname);fflush(stdout); +#endif + int ret=1; + char buf[1024]; + strcpy(buf,RAMDIR); + strcat(buf,fname); + FILE *fi=fopen(buf,"rb"); + if (fi) { + ret= -1; + fclose(fi); + } else { + strcpy(buf,VMUDIR); + strcat(buf,fname); + fi=fopen(buf,"rb"); +#ifdef DEBUG_SAVESTATE + printf("save: abrimos %s\n",buf); +#endif + if (fi) { + ret=2; + fseek(fi,0,SEEK_END); + long len=ftell(fi); +#ifdef DEBUG_SAVESTATE + printf("save: la longitud es %i\n",len); +#endif + if (len>VMUFILE_PAD) { + ret=3; + strcpy(buf,RAMDIR); + strcat(buf,fname); + FILE *fo=fopen(buf,"wb"); +#ifdef DEBUG_SAVESTATE + printf("save: abrimos %s\n",buf); +#endif + if (fo) { + fseek(fi,VMUFILE_PAD,SEEK_SET); + fread((void *)&len,1,4,fi); +#ifdef DEBUG_SAVESTATE + printf("save: Len real %i\n",len); +#endif + int procesados=0; + for(;len>0;len-=1024) + procesados+=fwrite((void *)buf,1,fread((void *)buf,1,1024,fi),fo); + ret=0; + fclose(fo); +#ifdef DEBUG_SAVESTATE + void *b=malloc(procesados); + strcpy(buf,RAMDIR); + strcat(buf,fname); + fo=fopen(buf,"rb"); + fread(b,1,procesados,fo); + fclose(fo); + printf("save: Proceados %i (%.8X)\n",procesados,calculachk(b,procesados)); + free(b); +#endif + } + } + fclose(fi); + } + } +#ifdef DEBUG_SAVESTATE + printf("load_from_vmu - return %i\n",ret);fflush(stdout); +#endif + return ret; +} diff --git a/src/server.cpp b/src/server.cpp new file mode 100644 index 0000000..28efdcb --- /dev/null +++ b/src/server.cpp @@ -0,0 +1,1303 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#ifdef NETPLAY_SUPPORT +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif + +#ifndef __WIN32__ +#include +#include +#endif + +#ifdef __WIN32__ + +#include +#include +#define ioctl ioctlsocket +#define close closesocket +#define read(a,b,c) recv(a, b, c, 0) +#define write(a,b,c) send(a, b, c, 0) +#define gettimeofday(a,b) S9xGetTimeOfDay (a) +#define exit(a) _endthread() +void S9xGetTimeOfDay (struct timeval *n); +#else + +#include +#include +#include +#include +#include +#include + +#ifdef __SVR4 +#include +#endif + +#endif // !__WIN32__ + +#include "snes9x.h" +#include "netplay.h" +#include "memmap.h" +#include "snapshot.h" + +#define NP_ONE_CLIENT 1 + +struct SNPServer NPServer; + +extern unsigned long START; + +void S9xNPSendToAllClients (uint8 *data, int len); +bool8 S9xNPLoadFreezeFile (const char *fname, uint8 *&data, uint32 &len); +void S9xNPSendFreezeFile (int c, uint8 *data, uint32 len); +void S9xNPNoClientReady (int start_index = NP_ONE_CLIENT); +void S9xNPRecomputePause (); +void S9xNPWaitForEmulationToComplete (); +void S9xNPSendROMImageToAllClients (); +bool8 S9xNPSendROMImageToClient (int client); +void S9xNPSendSRAMToClient (int c); +void S9xNPSendSRAMToAllClients (); +void S9xNPSyncClient (int); +void S9xNPSendROMLoadRequest (const char *filename); +void S9xNPSendFreezeFileToAllClients (const char *filename); +void S9xNPStopServer (); + +void S9xNPShutdownClient (int c, bool8 report_error = FALSE) +{ + if (NPServer.Clients [c].Connected) + { + NPServer.Clients [c].Connected = FALSE; + NPServer.Clients [c].SaidHello = FALSE; + + close (NPServer.Clients [c].Socket); +#ifdef NP_DEBUG + printf ("SERVER: Player %d disconnecting @%ld\n", c + 1, S9xGetMilliTime () - START); +#endif + if (report_error) + { + sprintf (NetPlay.ErrorMsg, + "Player %d on '%s' has disconnected.", c + 1, + NPServer.Clients [c].HostName); + S9xNPSetError (NetPlay.ErrorMsg); + } + + if (NPServer.Clients [c].HostName) + { + free ((char *) NPServer.Clients [c].HostName); + NPServer.Clients [c].HostName = NULL; + } + if (NPServer.Clients [c].ROMName) + { + free ((char *) NPServer.Clients [c].ROMName); + NPServer.Clients [c].ROMName = NULL; + } + if (NPServer.Clients [c].Who) + { + free ((char *) NPServer.Clients [c].Who); + NPServer.Clients [c].Who = NULL; + } + NPServer.Joypads [c] = 0; + NPServer.NumClients--; + S9xNPRecomputePause (); + } +} + +static bool8 S9xNPSGetData (int socket, uint8 *data, int length) +{ + int len = length; + uint8 *ptr = data; + + do + { + int num_bytes = len; + + // Read the data in small chunks, allowing this thread to spot an + // abort request from another thread. + if (num_bytes > 512) + num_bytes = 512; + + int got = read (socket, (char *) ptr, num_bytes); + if (got < 0) + { + if (errno == EINTR +#ifdef EAGAIN + || errno == EAGAIN +#endif +#ifdef EWOULDBLOCK + || errno == EWOULDBLOCK +#endif +#ifdef WSAEWOULDBLOCK + || errno == WSAEWOULDBLOCK +#endif + ) + continue; +#ifdef WSAEMSGSIZE + if (errno != WSAEMSGSIZE) + return (FALSE); + else + { + got = num_bytes; +#ifdef NP_DEBUG + printf ("SERVER: WSAEMSGSIZE, actual bytes %d while receiving data @%d\n", got, S9xGetMilliTime () - START); +#endif + } +#else + return (FALSE); +#endif + } + else + if (got == 0) + return (FALSE); + + len -= got; + ptr += got; + } while (len > 0); + + return (TRUE); +} + +static bool8 S9xNPSSendData (int fd, const uint8 *data, int length) +{ + int Percent = 0; + int len = length; + int chunk = length / 50; + + if (chunk < 1024) + chunk = 1024; + + do + { + int num_bytes = len; + + // Write the data in small chunks, allowing this thread to spot an + // abort request from another thread. + if (num_bytes > chunk) + num_bytes = chunk; + + int sent; + sent = write (fd, (char *) data, len); + + if (sent < 0) + { + if (errno == EINTR +#ifdef EAGAIN + || errno == EAGAIN +#endif +#ifdef EWOULDBLOCK + || errno == EWOULDBLOCK +#endif + ) + { +#ifdef NP_DEBUG + printf ("SERVER: EINTR, EAGAIN or EWOULDBLOCK while sending data @%ld\n", S9xGetMilliTime () - START); +#endif + continue; + } + return (FALSE); + } + else + if (sent == 0) + return (FALSE); + len -= sent; + data += sent; + if (length > 1024) + { + Percent = (uint8) (((length - len) * 100) / length); +#ifdef __WIN32__ + PostMessage (GUI.hWnd, WM_USER, Percent, Percent); + Sleep (0); +#endif + } + } while (len > 0); + + return (TRUE); +} + +void S9xNPSendHeartBeat () +{ + int len = 3; + uint8 data [3 + 4 * 5]; + uint8 *ptr = data; + int n; + + for (n = NP_MAX_CLIENTS - 1; n >= 0; n--) + { + if (NPServer.Clients [n].SaidHello) + break; + } + + if (n >= 0) + { + bool8 Paused = NPServer.Paused != 0; + + NPServer.FrameCount++; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = 0; // Individual client sequence number will get placed here + *ptr++ = NP_SERV_JOYPAD | (n << 6) | ((Paused != 0) << 5); + + WRITE_LONG (ptr, NPServer.FrameCount); + len += 4; + ptr += 4; + + int i; + + for (i = 0; i <= n; i++) + { + WRITE_LONG (ptr, NPServer.Joypads [i]); + len += 4; + ptr += 4; + } + + S9xNPSendToAllClients (data, len); + } +} + +void S9xNPSendToAllClients (uint8 *data, int len) +{ + int i; + + for (i = 0; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].SaidHello) + { + data [1] = NPServer.Clients [i].SendSequenceNum++; + if (!S9xNPSSendData (NPServer.Clients [i].Socket, data, len)) + S9xNPShutdownClient (i, TRUE); + } + } +} + +void S9xNPProcessClient (int c) +{ + uint8 header [7]; + uint8 *data; + uint32 len; + uint8 *ptr; + + if (!S9xNPSGetData (NPServer.Clients [c].Socket, header, 7)) + { + S9xNPSetWarning ("SERVER: Failed to get message header from client.\n"); + S9xNPShutdownClient (c, TRUE); + return; + } + if (header [0] != NP_CLNT_MAGIC) + { + S9xNPSetWarning ("SERVER: Bad header magic value received from client.\n"); + S9xNPShutdownClient (c, TRUE); + return; + } + + if (header [1] != NPServer.Clients [c].ReceiveSequenceNum) + { +#ifdef NP_DEBUG + printf ("SERVER: Messages lost from '%s', expected %d, got %d\n", + NPServer.Clients [c].HostName ? + NPServer.Clients [c].HostName : "Unknown", + NPServer.Clients [c].ReceiveSequenceNum, + header [1]); +#endif + sprintf (NetPlay.WarningMsg, + "SERVER: Messages lost from '%s', expected %d, got %d\n", + NPServer.Clients [c].HostName ? + NPServer.Clients [c].HostName : "Unknown", + NPServer.Clients [c].ReceiveSequenceNum, + header [1]); + NPServer.Clients [c].ReceiveSequenceNum = header [1] + 1; + S9xNPSetWarning (NetPlay.WarningMsg); + } + else + NPServer.Clients [c].ReceiveSequenceNum++; + + len = READ_LONG (&header [3]); + + switch (header [2] & 0x3f) + { + case NP_CLNT_HELLO: +#ifdef NP_DEBUG + printf ("SERVER: Got HELLO from client @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("Got HELLO from client...", TRUE); + if (len > 0x10000) + { + S9xNPSetWarning ("SERVER: Client HELLO message length error."); + S9xNPShutdownClient (c, TRUE); + return; + } + data = new uint8 [len - 7]; + if (!S9xNPSGetData (NPServer.Clients [c].Socket, data, len - 7)) + { + S9xNPSetWarning ("SERVER: Failed to get HELLO message content from client."); + S9xNPShutdownClient (c, TRUE); + return; + } + + if (NPServer.NumClients <= NP_ONE_CLIENT) + { + NPServer.FrameTime = READ_LONG (data); + strncpy (NPServer.ROMName, (char *) &data [4], 29); + NPServer.ROMName [29] = 0; + } + + NPServer.Clients [c].ROMName = strdup ((char *) &data [4]); +#ifdef NP_DEBUG + printf ("SERVER: Client is playing: %s, Frame Time: %d @%ld\n", data + 4, READ_LONG (data), S9xGetMilliTime () - START); +#endif + + NPServer.Clients [c].SendSequenceNum = 0; + + len = 7 + 1 + 1 + 4 + strlen (NPServer.ROMName) + 1; + + delete data; + ptr = data = new uint8 [len]; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = NPServer.Clients [c].SendSequenceNum++; + + if (NPServer.SendROMImageOnConnect && + NPServer.NumClients > NP_ONE_CLIENT) + *ptr++ = NP_SERV_HELLO | 0x80; + else + *ptr++ = NP_SERV_HELLO; + WRITE_LONG (ptr, len); + ptr += 4; + *ptr++ = NP_VERSION; + *ptr++ = c + 1; + WRITE_LONG (ptr, NPServer.FrameCount); + ptr += 4; + strcpy ((char *) ptr, NPServer.ROMName); + +#ifdef NP_DEBUG + printf ("SERVER: Sending welcome information to client @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("SERVER: Sending welcome information to new client...", TRUE); + if (!S9xNPSSendData (NPServer.Clients [c].Socket, data, len)) + { + S9xNPSetWarning ("SERVER: Failed to send welcome message to client."); + S9xNPShutdownClient (c, TRUE); + return; + } + delete data; +#ifdef NP_DEBUG + printf ("SERVER: Waiting for a response from the client @%ld...\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("SERVER: Waiting for a response from the client...", TRUE); + break; + + case NP_CLNT_LOADED_ROM: +#ifdef NP_DEBUG + printf ("SERVER: Client %d loaded requested ROM @%ld...\n", c, S9xGetMilliTime () - START); +#endif + NPServer.Clients [c].SaidHello = TRUE; + NPServer.Clients [c].Ready = FALSE; + NPServer.Clients [c].Paused = FALSE; + S9xNPRecomputePause (); + S9xNPWaitForEmulationToComplete (); + + if (NPServer.SyncByReset) + { + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); + } + else + S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); + break; + + case NP_CLNT_RECEIVED_ROM_IMAGE: +#ifdef NP_DEBUG + printf ("SERVER: Client %d received ROM image @%ld...\n", c, S9xGetMilliTime () - START); +#endif + NPServer.Clients [c].SaidHello = TRUE; + NPServer.Clients [c].Ready = FALSE; + NPServer.Clients [c].Paused = FALSE; + S9xNPRecomputePause (); + S9xNPWaitForEmulationToComplete (); + + if (NPServer.SyncByReset) + { + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); + } + else + S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); + + break; + + case NP_CLNT_WAITING_FOR_ROM_IMAGE: +#ifdef NP_DEBUG + printf ("SERVER: Client %d waiting for ROM image @%ld...\n", c, S9xGetMilliTime () - START); +#endif + NPServer.Clients [c].SaidHello = TRUE; + NPServer.Clients [c].Ready = FALSE; + NPServer.Clients [c].Paused = FALSE; + S9xNPRecomputePause (); + S9xNPSendROMImageToClient (c); + break; + + case NP_CLNT_READY: +#ifdef NP_DEBUG + printf ("SERVER: Client %d ready @%ld...\n", c, S9xGetMilliTime () - START); +#endif + if (NPServer.Clients [c].SaidHello) + { + NPServer.Clients [c].Paused = FALSE; + NPServer.Clients [c].Ready = TRUE; + + S9xNPRecomputePause (); + break; + } + NPServer.Clients [c].SaidHello = TRUE; + NPServer.Clients [c].Ready = TRUE; + NPServer.Clients [c].Paused = FALSE; + S9xNPRecomputePause (); + +//printf ("SERVER: SaidHello = TRUE, SeqNum = %d @%d\n", NPServer.Clients [c].SendSequenceNum, S9xGetMilliTime () - START); + if (NPServer.NumClients > NP_ONE_CLIENT) + { + if (!NPServer.SendROMImageOnConnect) + { + S9xNPWaitForEmulationToComplete (); + + if (NPServer.SyncByReset) + { + S9xNPServerAddTask (NP_SERVER_SEND_SRAM, (void *) c); + S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); + } + else + S9xNPServerAddTask (NP_SERVER_SYNC_CLIENT, (void *) c); + } + } + else + { + NPServer.Clients [c].Ready = TRUE; + S9xNPRecomputePause (); + } + break; + case NP_CLNT_JOYPAD: + NPServer.Joypads [c] = len; + break; + case NP_CLNT_PAUSE: +#ifdef NP_DEBUG + printf ("SERVER: Client %d Paused: %s @%ld\n", c, (header [2] & 0x80) ? "YES" : "NO", S9xGetMilliTime () - START); +#endif + NPServer.Clients [c].Paused = (header [2] & 0x80) != 0; + if (NPServer.Clients [c].Paused) + sprintf (NetPlay.WarningMsg, "SERVER: Client %d has paused.", c + 1); + else + sprintf (NetPlay.WarningMsg, "SERVER: Client %d has resumed.", c + 1); + S9xNPSetWarning (NetPlay.WarningMsg); + S9xNPRecomputePause (); + break; + } +} + +void S9xNPAcceptClient (int Listen, bool8 block) +{ + struct sockaddr_in remote_address; + struct linger val2; + struct hostent *host; + int new_fd; + int i; + +#ifdef NP_DEBUG + printf ("SERVER: attempting to accept new client connection @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("SERVER: Attempting to accept client connection...", TRUE); + memset (&remote_address, 0, sizeof (remote_address)); + ACCEPT_SIZE_T len = sizeof (remote_address); + + new_fd = accept (Listen, (struct sockaddr *)&remote_address, &len); + + S9xNPSetAction ("Setting socket options...", TRUE); + val2.l_onoff = 1; + val2.l_linger = 0; + if (setsockopt (new_fd, SOL_SOCKET, SO_LINGER, + (char *) &val2, sizeof (val2)) < 0) + { + S9xNPSetError ("Setting socket options failed."); + close (new_fd); + return; + } + + for (i = 0; i < NP_MAX_CLIENTS; i++) + { + if (!NPServer.Clients [i].Connected) + { + NPServer.NumClients++; + NPServer.Clients [i].Socket = new_fd; + NPServer.Clients [i].SendSequenceNum = 0; + NPServer.Clients [i].ReceiveSequenceNum = 0; + NPServer.Clients [i].Connected = TRUE; + NPServer.Clients [i].SaidHello = FALSE; + NPServer.Clients [i].Paused = FALSE; + NPServer.Clients [i].Ready = FALSE; + NPServer.Clients [i].ROMName = NULL; + NPServer.Clients [i].HostName = NULL; + NPServer.Clients [i].Who = NULL; + break; + } + } + + if (i >= NP_MAX_CLIENTS) + { + S9xNPSetError ("SERVER: Maximum number of NetPlay Clients have already connected."); + close (new_fd); + return; + } + + if (remote_address.sin_family == AF_INET) + { +#ifdef NP_DEBUG + printf ("SERVER: Looking up new client's hostname @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("SERVER: Looking up new client's hostname...", TRUE); + host = gethostbyaddr ((char *) &remote_address.sin_addr, + sizeof (remote_address.sin_addr), AF_INET); + + if (host) + { +#ifdef NP_DEBUG + printf ("SERVER: resolved new client's hostname (%s) @%ld\n", host->h_name, S9xGetMilliTime () - START); +#endif + sprintf (NetPlay.WarningMsg, "SERVER: Player %d on %s has connected.", i + 1, host->h_name); + NPServer.Clients [i].HostName = strdup (host->h_name); + } + else + { + char *ip = inet_ntoa (remote_address.sin_addr); + if (ip) + NPServer.Clients [i].HostName = strdup (ip); +#ifdef NP_DEBUG + printf ("SERVER: couldn't resolve new client's hostname (%s) @%ld\n", ip ? ip : "Unknown", S9xGetMilliTime () - START); +#endif + sprintf (NetPlay.WarningMsg, "SERVER: Player %d on %s has connected.", i + 1, ip ? ip : "Unknown"); + } + S9xNPSetWarning (NetPlay.WarningMsg); + } +#ifdef NP_DEBUG + printf ("SERVER: waiting for HELLO message from new client @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPSetAction ("SERVER: Waiting for HELLO message from new client..."); +} + +static bool8 server_continue = TRUE; + +static bool8 S9xNPServerInit (int port) +{ + struct sockaddr_in address; + int i; + int val; + + if (!S9xNPInitialise ()) + return (FALSE); + + for (i = 0; i < NP_MAX_CLIENTS; i++) + { + NPServer.Clients [i].SendSequenceNum = 0; + NPServer.Clients [i].ReceiveSequenceNum = 0; + NPServer.Clients [i].Connected = FALSE; + NPServer.Clients [i].SaidHello = FALSE; + NPServer.Clients [i].Paused = FALSE; + NPServer.Clients [i].Ready = FALSE; + NPServer.Clients [i].Socket = 0; + NPServer.Clients [i].ROMName = NULL; + NPServer.Clients [i].HostName = NULL; + NPServer.Clients [i].Who = NULL; + NPServer.Joypads [i] = 0; + } + + NPServer.NumClients = 0; + NPServer.FrameCount = 0; + +#ifdef NP_DEBUG + printf ("SERVER: Creating socket @%ld\n", S9xGetMilliTime () - START); +#endif + if ((NPServer.Socket = socket (AF_INET, SOCK_STREAM, 0)) < 0) + { + S9xNPSetError ("NetPlay Server: Can't create listening socket."); + return (FALSE); + } + + val = 1; + setsockopt (NPServer.Socket, SOL_SOCKET, SO_REUSEADDR, + (char *)&val, sizeof (val)); + + memset (&address, 0, sizeof (address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = htonl (INADDR_ANY); + address.sin_port = htons (port); + +#ifdef NP_DEBUG + printf ("SERVER: Binding socket to address and port @%ld\n", S9xGetMilliTime () - START); +#endif + if (bind (NPServer.Socket, (struct sockaddr *) &address, sizeof (address)) < 0) + { + S9xNPSetError ("NetPlay Server: Can't bind socket to port number.\nPort already in use?"); + return (FALSE); + } + +#ifdef NP_DEBUG + printf ("SERVER: Getting socket to listen @%ld\n", S9xGetMilliTime () - START); +#endif + if (listen (NPServer.Socket, NP_MAX_CLIENTS) < 0) + { + S9xNPSetError ("NetPlay Server: Can't get new socket to listen."); + return (FALSE); + } + +#ifdef NP_DEBUG + printf ("SERVER: Init complete @%ld\n", S9xGetMilliTime () - START); +#endif + return (TRUE); +} + +void S9xNPServerLoop (void *) +{ +#ifdef __WIN32__ + BOOL success = FALSE; +#else + bool8 success = FALSE; +#endif + + while (server_continue) + { + fd_set read_fds; + struct timeval timeout; + int res; + int i; + + int max_fd = NPServer.Socket; + +#ifdef __WIN32__ + Sleep (0); +#endif + + if (success && !Settings.Paused && !Settings.StopEmulation && + !Settings.ForcedPause && !NPServer.Paused) + { + S9xNPSendHeartBeat (); + } + + do + { + FD_ZERO (&read_fds); + FD_SET (NPServer.Socket, &read_fds); + for (i = 0; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].Connected) + { + FD_SET (NPServer.Clients [i].Socket, &read_fds); + if (NPServer.Clients [i].Socket > max_fd) + max_fd = NPServer.Clients [i].Socket; + } + } + + timeout.tv_sec = 0; + timeout.tv_usec = 1000; + res = select (max_fd + 1, &read_fds, NULL, NULL, &timeout); + + if (res > 0) + { + if (FD_ISSET (NPServer.Socket, &read_fds)) + S9xNPAcceptClient (NPServer.Socket, FALSE); + + for (i = 0; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].Connected && + FD_ISSET (NPServer.Clients [i].Socket, &read_fds)) + { + S9xNPProcessClient (i); + } + } + } + } while (res > 0); + +#ifdef __WIN32__ + success = WaitForSingleObject (GUI.ServerTimerSemaphore, 200) == WAIT_OBJECT_0; +#endif + + while (NPServer.TaskHead != NPServer.TaskTail) + { + void *task_data = NPServer.TaskQueue [NPServer.TaskHead].Data; + +#if defined(NP_DEBUG) && NP_DEBUG == 2 + printf ("SERVER: task %d @%ld\n", NPServer.TaskQueue [NPServer.TaskHead].Task, S9xGetMilliTime () - START); +#endif + + switch (NPServer.TaskQueue [NPServer.TaskHead].Task) + { + case NP_SERVER_SEND_ROM_IMAGE: + S9xNPSendROMImageToAllClients (); + break; + case NP_SERVER_SYNC_CLIENT: + NPServer.Clients [(int) task_data].Ready = FALSE; + S9xNPRecomputePause (); + S9xNPSyncClient ((int) task_data); + break; + case NP_SERVER_SYNC_ALL: + S9xNPSyncClients (); + break; + case NP_SERVER_SEND_FREEZE_FILE_ALL: + S9xNPSendFreezeFileToAllClients ((char *) task_data); + free ((char *) task_data); + break; + case NP_SERVER_SEND_ROM_LOAD_REQUEST_ALL: + S9xNPSendROMLoadRequest ((char *) task_data); + free ((char *) task_data); + break; + case NP_SERVER_RESET_ALL: + S9xNPNoClientReady (0); + S9xNPWaitForEmulationToComplete (); + S9xNPSetAction ("SERVER: Sending RESET to all clients...", TRUE); +#ifdef NP_DEBUG + printf ("SERVER: Sending RESET to all clients @%ld\n", S9xGetMilliTime () - START); +#endif + { + uint8 reset [7]; + uint8 *ptr; + + ptr = reset; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = 0; + *ptr++ = NP_SERV_RESET; + WRITE_LONG (ptr, NPServer.FrameCount); + S9xNPSendToAllClients (reset, 7); + } + break; + case NP_SERVER_SEND_SRAM: + NPServer.Clients [(int) task_data].Ready = FALSE; + S9xNPRecomputePause (); + S9xNPWaitForEmulationToComplete (); + S9xNPSendSRAMToClient ((int) task_data); + break; + + case NP_SERVER_SEND_SRAM_ALL: + S9xNPNoClientReady (); + S9xNPWaitForEmulationToComplete (); + S9xNPSendSRAMToAllClients (); + break; + + default: + S9xNPSetError ("SERVER: *** Unknown task ***\n"); + break; + } + NPServer.TaskHead = (NPServer.TaskHead + 1) % NP_MAX_TASKS; + } + } +#ifdef NP_DEBUG + printf ("SERVER: Server thread exiting @%ld\n", S9xGetMilliTime () - START); +#endif + S9xNPStopServer (); +} + +bool8 S9xNPStartServer (int port) +{ + static int p; + +#ifdef NP_DEBUG + printf ("SERVER: Starting server on port %d @%ld\n", port, S9xGetMilliTime () - START); +#endif + p = port; + server_continue = TRUE; + if (S9xNPServerInit (port)) +#ifdef __WIN32__ + return (_beginthread (S9xNPServerLoop, 0, &p) != ~0); +#else + return (TRUE); +#endif + + return (FALSE); +} + +void S9xNPStopServer () +{ +#ifdef NP_DEBUG + printf ("SERVER: Stopping server @%ld\n", S9xGetMilliTime () - START); +#endif + server_continue = FALSE; + close (NPServer.Socket); + + for (int i = 0; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].Connected) + { + close (NPServer.Clients [i].Socket); + NPServer.Clients [i].Connected = FALSE; + NPServer.Clients [i].SaidHello = FALSE; + } + } +} + +#ifdef __WIN32__ +void S9xGetTimeOfDay (struct timeval *n) +{ + unsigned long t = S9xGetMilliTime (); + + n->tv_sec = t / 1000; + n->tv_usec = (t % 1000) * 1000; +} +#endif + +void S9xNPSendROMImageToAllClients () +{ + S9xNPNoClientReady (); + S9xNPWaitForEmulationToComplete (); + + int c; + + for (c = NP_ONE_CLIENT; c < NP_MAX_CLIENTS; c++) + { + if (NPServer.Clients [c].SaidHello) + S9xNPSendROMImageToClient (c); + } + + if (NPServer.SyncByReset) + { + S9xNPServerAddTask (NP_SERVER_SEND_SRAM_ALL, 0); + S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); + } + else + S9xNPSyncClient (-1); +} + +bool8 S9xNPSendROMImageToClient (int c) +{ +#ifdef NP_DEBUG + printf ("SERVER: Sending ROM image to player %d @%ld\n", c + 1, S9xGetMilliTime () - START); +#endif + sprintf (NetPlay.ActionMsg, "Sending ROM image to player %d...", c + 1); + S9xNPSetAction (NetPlay.ActionMsg, TRUE); + + uint8 header [7 + 1 + 4]; + uint8 *ptr = header; + int len = sizeof (header) + Memory.CalculatedSize + + strlen (Memory.ROMFilename) + 1; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = NPServer.Clients [c].SendSequenceNum++; + *ptr++ = NP_SERV_ROM_IMAGE; + WRITE_LONG (ptr, len); + ptr += 4; + *ptr++ = Memory.HiROM; + WRITE_LONG (ptr, Memory.CalculatedSize); + + if (!S9xNPSSendData (NPServer.Clients [c].Socket, header, sizeof (header)) || + !S9xNPSSendData (NPServer.Clients [c].Socket, Memory.ROM, + Memory.CalculatedSize) || + !S9xNPSSendData (NPServer.Clients [c].Socket, (uint8 *) Memory.ROMFilename, + strlen (Memory.ROMFilename) + 1)) + { + S9xNPShutdownClient (c, TRUE); + return (FALSE); + } + return (TRUE); +} + +void S9xNPSyncClients () +{ + S9xNPNoClientReady (); + S9xNPSyncClient (-1); +} + +void S9xNPSyncClient (int client) +{ +#ifdef HAVE_MKSTEMP + char fname[] = "/tmp/snes9x_fztmpXXXXXX"; +#else + char fname [L_tmpnam]; +#endif + + S9xNPWaitForEmulationToComplete (); + + S9xNPSetAction ("SERVER: Freezing game...", TRUE); +#ifdef HAVE_MKSTEMP + if ( (mkstemp(fname) < 0) && S9xFreezeGame(fname) ) +#else + if ( tmpnam(fname) && S9xFreezeGame(fname) ) +#endif + { + uint8 *data; + uint32 len; + + S9xNPSetAction ("SERVER: Loading freeze file...", TRUE); + if (S9xNPLoadFreezeFile (fname, data, len)) + { + int c; + + if (client < 0) + { + for (c = NP_ONE_CLIENT; c < NP_MAX_CLIENTS; c++) + { + if (NPServer.Clients [c].SaidHello) + { + NPServer.Clients [client].Ready = FALSE; + S9xNPRecomputePause (); + S9xNPSendFreezeFile (c, data, len); + } + } + } + else + { + NPServer.Clients [client].Ready = FALSE; + S9xNPRecomputePause (); + S9xNPSendFreezeFile (client, data, len); + } + delete data; + } + remove (fname); + } +} + +bool8 S9xNPLoadFreezeFile (const char *fname, uint8 *&data, uint32 &len) +{ + FILE *ff; + + if ((ff = fopen (fname, "rb"))) + { + fseek (ff, 0, SEEK_END); + len = ftell (ff); + fseek (ff, 0, SEEK_SET); + + data = new uint8 [len]; + bool8 ok = (fread (data, 1, len, ff) == len); + fclose (ff); + + return (ok); + } + return (FALSE); +} + +void S9xNPSendFreezeFile (int c, uint8 *data, uint32 len) +{ +#ifdef NP_DEBUG + printf ("SERVER: Sending freeze file to player %d @%ld\n", c + 1, S9xGetMilliTime () - START); +#endif + + sprintf (NetPlay.ActionMsg, "SERVER: Sending freeze-file to player %d...", c + 1); + S9xNPSetAction (NetPlay.ActionMsg, TRUE); + uint8 header [7 + 4]; + uint8 *ptr = header; + + *ptr++ = NP_SERV_MAGIC; + *ptr++ = NPServer.Clients [c].SendSequenceNum++; + *ptr++ = NP_SERV_FREEZE_FILE; + WRITE_LONG (ptr, len + 7 + 4); + ptr += 4; + WRITE_LONG (ptr, NPServer.FrameCount); + + if (!S9xNPSSendData (NPServer.Clients [c].Socket, header, 7 + 4) || + !S9xNPSSendData (NPServer.Clients [c].Socket, data, len)) + { + S9xNPShutdownClient (c, TRUE); + } +} + +void S9xNPRecomputePause () +{ + int c; + + for (c = 0; c < NP_MAX_CLIENTS; c++) + { + if (NPServer.Clients [c].SaidHello && + (!NPServer.Clients [c].Ready || NPServer.Clients [c].Paused)) + { +#if defined(NP_DEBUG) && NP_DEBUG == 2 + printf ("SERVER: Paused because of client %d (%d,%d) @%ld\n", c, NPServer.Clients [c].Ready, NPServer.Clients [c].Paused, S9xGetMilliTime () - START); +#endif + NPServer.Paused = TRUE; + return; + } + } +#if defined(NP_DEBUG) && NP_DEBUG == 2 + printf ("SERVER: not paused @%ld\n", S9xGetMilliTime () - START); +#endif + NPServer.Paused = FALSE; +} + +void S9xNPNoClientReady (int start_index) +{ + int c; + + for (c = start_index; c < NP_MAX_CLIENTS; c++) + NPServer.Clients [c].Ready = FALSE; + S9xNPRecomputePause (); +} + +void S9xNPSendROMLoadRequest (const char *filename) +{ + S9xNPNoClientReady (); + + int len = 7 + strlen (filename) + 1; + uint8 *data = new uint8 [len]; + uint8 *ptr = data; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = 0; + *ptr++ = NP_SERV_LOAD_ROM; + WRITE_LONG (ptr, len); + ptr += 4; + strcpy ((char *) ptr, filename); + + for (int i = NP_ONE_CLIENT; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].SaidHello) + { +#ifdef NP_DEBUG + printf ("SERVER: Sending load ROM requesting to player %d @%ld\n", i + 1, S9xGetMilliTime () - START); +#endif + sprintf (NetPlay.WarningMsg, "SERVER: sending ROM load request to player %d...", i + 1); + S9xNPSetAction (NetPlay.WarningMsg, TRUE); + data [1] = NPServer.Clients [i].SendSequenceNum++; + if (!S9xNPSSendData (NPServer.Clients [i].Socket, data, len)) + { + S9xNPShutdownClient (i, TRUE); + } + } + } + delete data; +} + +void S9xNPSendSRAMToAllClients () +{ + int i; + + for (i = NP_ONE_CLIENT; i < NP_MAX_CLIENTS; i++) + { + if (NPServer.Clients [i].SaidHello) + S9xNPSendSRAMToClient (i); + } +} + +void S9xNPSendSRAMToClient (int c) +{ +#ifdef NP_DEBUG + printf ("SERVER: Sending S-RAM data to player %d @%ld\n", c + 1, S9xGetMilliTime () - START); +#endif + uint8 sram [7]; + int SRAMSize = Memory.SRAMSize ? + (1 << (Memory.SRAMSize + 3)) * 128 : 0; + if (SRAMSize > 0x10000) + SRAMSize = 0x10000; + int len = 7 + SRAMSize; + + sprintf (NetPlay.ActionMsg, "SERVER: Sending S-RAM to player %d...", c + 1); + S9xNPSetAction (NetPlay.ActionMsg, TRUE); + + uint8 *ptr = sram; + *ptr++ = NP_SERV_MAGIC; + *ptr++ = NPServer.Clients [c].SendSequenceNum++; + *ptr++ = NP_SERV_SRAM_DATA; + WRITE_LONG (ptr, len); + if (!S9xNPSSendData (NPServer.Clients [c].Socket, + sram, sizeof (sram)) || + (len > 7 && + !S9xNPSSendData (NPServer.Clients [c].Socket, + CMemory_SRAM, len - 7))) + { + S9xNPShutdownClient (c, TRUE); + } +} + +void S9xNPSendFreezeFileToAllClients (const char *filename) +{ + uint8 *data; + uint32 len; + + if (NPServer.NumClients > NP_ONE_CLIENT && S9xNPLoadFreezeFile (filename, data, len)) + { + S9xNPNoClientReady (); + + for (int c = NP_ONE_CLIENT; c < NP_MAX_CLIENTS; c++) + { + if (NPServer.Clients [c].SaidHello) + S9xNPSendFreezeFile (c, data, len); + } + delete data; + } +} + +void S9xNPServerAddTask (uint32 task, void *data) +{ + NPServer.TaskQueue [NPServer.TaskTail].Task = task; + NPServer.TaskQueue [NPServer.TaskTail].Data = data; + + NPServer.TaskTail = (NPServer.TaskTail + 1) % NP_MAX_TASKS; +} + +void S9xNPReset () +{ + S9xNPNoClientReady (0); + S9xNPServerAddTask (NP_SERVER_RESET_ALL, 0); +} + +void S9xNPWaitForEmulationToComplete () +{ +#ifdef NP_DEBUG + printf ("SERVER: WaitForEmulationToComplete start @%ld\n", S9xGetMilliTime () - START); +#endif + + while (!NetPlay.PendingWait4Sync && NetPlay.Connected && + !Settings.ForcedPause && !Settings.StopEmulation && + !Settings.Paused) + { +#ifdef __WIN32__ + Sleep (40); +#endif + } +#ifdef NP_DEBUG + printf ("SERVER: WaitForEmulationToComplete end @%ld\n", S9xGetMilliTime () - START); +#endif +} + +void S9xNPServerQueueSyncAll () +{ + if (Settings.NetPlay && Settings.NetPlayServer && + NPServer.NumClients > NP_ONE_CLIENT) + { + S9xNPNoClientReady (); + S9xNPDiscardHeartbeats (); + S9xNPServerAddTask (NP_SERVER_SYNC_ALL, 0); + } +} + +void S9xNPServerQueueSendingROMImage () +{ + if (Settings.NetPlay && Settings.NetPlayServer && + NPServer.NumClients > NP_ONE_CLIENT) + { + S9xNPNoClientReady (); + S9xNPDiscardHeartbeats (); + S9xNPServerAddTask (NP_SERVER_SEND_ROM_IMAGE, 0); + } +} + +void S9xNPServerQueueSendingFreezeFile (const char *filename) +{ + if (Settings.NetPlay && Settings.NetPlayServer && + NPServer.NumClients > NP_ONE_CLIENT) + { + S9xNPNoClientReady (); + S9xNPDiscardHeartbeats (); + S9xNPServerAddTask (NP_SERVER_SEND_FREEZE_FILE_ALL, + (void *) strdup (filename)); + } +} + +void S9xNPServerQueueSendingLoadROMRequest (const char *filename) +{ + if (Settings.NetPlay && Settings.NetPlayServer && + NPServer.NumClients > NP_ONE_CLIENT) + { + S9xNPNoClientReady (); + S9xNPDiscardHeartbeats (); + S9xNPServerAddTask (NP_SERVER_SEND_ROM_LOAD_REQUEST_ALL, + (void *) strdup (filename)); + } +} + +#ifndef __WIN32__ +uint32 S9xGetMilliTime () +{ + static bool8 first = TRUE; + static long start_sec; + struct timeval tv; + + gettimeofday (&tv, NULL); + if (first) + { + start_sec = tv.tv_sec; + first = FALSE; + } + return ((uint32) ((tv.tv_sec - start_sec) * 1000 + tv.tv_usec / 1000)); +} +#endif +#endif + diff --git a/src/seta.cpp b/src/seta.cpp new file mode 100644 index 0000000..4e7d208 --- /dev/null +++ b/src/seta.cpp @@ -0,0 +1,105 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "seta.h" + +void (*SetSETA)(uint32, uint8)=&S9xSetST010; +uint8 (*GetSETA)(uint32)=&S9xGetST010; + +extern "C"{ +uint8 S9xGetSetaDSP(uint32 Address) +{ + return GetSETA(Address); +} + +void S9xSetSetaDSP(uint8 Byte, uint32 Address) +{ + SetSETA(Address, Byte); +} +} + diff --git a/src/seta010.cpp b/src/seta010.cpp new file mode 100644 index 0000000..0db09e3 --- /dev/null +++ b/src/seta010.cpp @@ -0,0 +1,750 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "seta.h" +#include "memmap.h" + +// Mode 7 scaling constants for all raster lines +const int16 ST010_M7Scale[176] = { + 0x0380, 0x0325, 0x02da, 0x029c, 0x0268, 0x023b, 0x0215, 0x01f3, + 0x01d5, 0x01bb, 0x01a3, 0x018e, 0x017b, 0x016a, 0x015a, 0x014b, + 0x013e, 0x0132, 0x0126, 0x011c, 0x0112, 0x0109, 0x0100, 0x00f8, + 0x00f0, 0x00e9, 0x00e3, 0x00dc, 0x00d6, 0x00d1, 0x00cb, 0x00c6, + 0x00c1, 0x00bd, 0x00b8, 0x00b4, 0x00b0, 0x00ac, 0x00a8, 0x00a5, + 0x00a2, 0x009e, 0x009b, 0x0098, 0x0095, 0x0093, 0x0090, 0x008d, + 0x008b, 0x0088, 0x0086, 0x0084, 0x0082, 0x0080, 0x007e, 0x007c, + 0x007a, 0x0078, 0x0076, 0x0074, 0x0073, 0x0071, 0x006f, 0x006e, + 0x006c, 0x006b, 0x0069, 0x0068, 0x0067, 0x0065, 0x0064, 0x0063, + 0x0062, 0x0060, 0x005f, 0x005e, 0x005d, 0x005c, 0x005b, 0x005a, + 0x0059, 0x0058, 0x0057, 0x0056, 0x0055, 0x0054, 0x0053, 0x0052, + 0x0051, 0x0051, 0x0050, 0x004f, 0x004e, 0x004d, 0x004d, 0x004c, + 0x004b, 0x004b, 0x004a, 0x0049, 0x0048, 0x0048, 0x0047, 0x0047, + 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, 0x0042, 0x0042, + 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, 0x003f, 0x003e, 0x003e, + 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, 0x003b, 0x003a, 0x003a, + 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, 0x0037, 0x0037, + 0x0036, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, 0x0034, + 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0032, 0x0031, + 0x0031, 0x0031, 0x0030, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, + 0x002f, 0x002e, 0x002e, 0x002e, 0x002e, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b +}; + +// H-DMA hack +bool seta_hack; + +//temporary Op04 requirement +#include + +#ifndef PI +#define PI 3.1415926535897932384626433832795 +#endif + +ST010_Regs ST010; + +uint8 S9xGetST010(uint32 Address) +{ + if(!(Address&0x80000)) + return 0x80; + + if((Address&0xFFF)==0x20) + return ST010.op_reg; + if ((Address&0xFFF)==0x21) + return ST010.execute; + return CMemory_SRAM[Address&CMemory_SRAMMask]; +} + +const int16 ST010_SinTable[256] = { + 0x0000, 0x0324, 0x0648, 0x096a, 0x0c8c, 0x0fab, 0x12c8, 0x15e2, + 0x18f9, 0x1c0b, 0x1f1a, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33df, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb3, 0x5ed7, 0x60eb, 0x62f1, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c23, 0x6dc9, 0x6f5e, 0x70e2, 0x7254, 0x73b5, 0x7504, + 0x7641, 0x776b, 0x7884, 0x7989, 0x7a7c, 0x7b5c, 0x7c29, 0x7ce3, + 0x7d89, 0x7e1d, 0x7e9c, 0x7f09, 0x7f61, 0x7fa6, 0x7fd8, 0x7ff5, + 0x7fff, 0x7ff5, 0x7fd8, 0x7fa6, 0x7f61, 0x7f09, 0x7e9c, 0x7e1d, + 0x7d89, 0x7ce3, 0x7c29, 0x7b5c, 0x7a7c, 0x7989, 0x7884, 0x776b, + 0x7641, 0x7504, 0x73b5, 0x7254, 0x70e2, 0x6f5e, 0x6dc9, 0x6c23, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f1, 0x60eb, 0x5ed7, 0x5cb3, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33df, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f1a, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8c, 0x096a, 0x0648, 0x0324, + 0x0000, -0x0324, -0x0648, -0x096b, -0x0c8c, -0x0fab, -0x12c8, -0x15e2, + -0x18f9, -0x1c0b, -0x1f1a, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33df, -0x36ba, -0x398d, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb3, -0x5ed7, -0x60ec, -0x62f1, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c23, -0x6dc9, -0x6f5e, -0x70e2, -0x7254, -0x73b5, -0x7504, + -0x7641, -0x776b, -0x7884, -0x7989, -0x7a7c, -0x7b5c, -0x7c29, -0x7ce3, + -0x7d89, -0x7e1d, -0x7e9c, -0x7f09, -0x7f61, -0x7fa6, -0x7fd8, -0x7ff5, + -0x7fff, -0x7ff5, -0x7fd8, -0x7fa6, -0x7f61, -0x7f09, -0x7e9c, -0x7e1d, + -0x7d89, -0x7ce3, -0x7c29, -0x7b5c, -0x7a7c, -0x7989, -0x7883, -0x776b, + -0x7641, -0x7504, -0x73b5, -0x7254, -0x70e2, -0x6f5e, -0x6dc9, -0x6c23, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f1, -0x60eb, -0x5ed7, -0x5cb3, + -0x5a82, -0x5842, -0x55f5, -0x539a, -0x5133, -0x4ebf, -0x4c3f, -0x49b3, + -0x471c, -0x447a, -0x41cd, -0x3f17, -0x3c56, -0x398c, -0x36b9, -0x33de, + -0x30fb, -0x2e10, -0x2b1f, -0x2826, -0x2527, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324}; + +const unsigned char ST010_ArcTan[32][32] = { + { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + { 0x80, 0xa0, 0xad, 0xb3, 0xb6, 0xb8, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf}, + { 0x80, 0x93, 0xa0, 0xa8, 0xad, 0xb0, 0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd}, + { 0x80, 0x8d, 0x98, 0xa0, 0xa6, 0xaa, 0xad, 0xb0, 0xb1, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, + 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc}, + { 0x80, 0x8a, 0x93, 0x9a, 0xa0, 0xa5, 0xa8, 0xab, 0xad, 0xaf, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb}, + { 0x80, 0x88, 0x90, 0x96, 0x9b, 0xa0, 0xa4, 0xa7, 0xa9, 0xab, 0xad, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9}, + { 0x80, 0x87, 0x8d, 0x93, 0x98, 0x9c, 0xa0, 0xa3, 0xa6, 0xa8, 0xaa, 0xac, 0xad, 0xae, 0xb0, 0xb0, + 0xb1, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8}, + { 0x80, 0x86, 0x8b, 0x90, 0x95, 0x99, 0x9d, 0xa0, 0xa3, 0xa5, 0xa7, 0xa9, 0xaa, 0xac, 0xad, 0xae, + 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7}, + { 0x80, 0x85, 0x8a, 0x8f, 0x93, 0x97, 0x9a, 0x9d, 0xa0, 0xa2, 0xa5, 0xa6, 0xa8, 0xaa, 0xab, 0xac, + 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5}, + { 0x80, 0x85, 0x89, 0x8d, 0x91, 0x95, 0x98, 0x9b, 0x9e, 0xa0, 0xa0, 0xa4, 0xa6, 0xa7, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4}, + { 0x80, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x96, 0x99, 0x9b, 0x9e, 0xa0, 0xa2, 0xa4, 0xa5, 0xa7, 0xa8, + 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3}, + { 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x91, 0x94, 0x97, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6, + 0xa7, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2}, + { 0x80, 0x83, 0x87, 0x8a, 0x8d, 0x90, 0x93, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1}, + { 0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x94, 0x96, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xaf, 0xb0}, + { 0x80, 0x83, 0x86, 0x89, 0x8b, 0x8e, 0x90, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa1, + 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf}, + { 0x80, 0x83, 0x85, 0x88, 0x8b, 0x8d, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9b, 0x9d, 0x9f, 0xa0, + 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xab, 0xab, 0xac, 0xad, 0xad, 0xae}, + { 0x80, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8f, 0x91, 0x93, 0x95, 0x97, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xad}, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x97, 0x99, 0x9b, 0x9c, 0x9d, + 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac}, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8b, 0x8d, 0x8f, 0x91, 0x93, 0x95, 0x96, 0x98, 0x99, 0x9b, 0x9c, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab}, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x9a, 0x9b, + 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa}, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x99, 0x9a, + 0x9b, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9}, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8f, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x99, + 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8}, + { 0x80, 0x82, 0x84, 0x86, 0x87, 0x89, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x98, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7}, + { 0x80, 0x82, 0x84, 0x85, 0x87, 0x89, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x94, 0x95, 0x96, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6}, + { 0x80, 0x82, 0x83, 0x85, 0x87, 0x88, 0x8a, 0x8c, 0x8d, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5}, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa4}, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x89, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4}, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x87, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2, 0xa3}, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x89, 0x8a, 0x8b, 0x8d, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2}, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x88, 0x8a, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1, 0xa1}, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1}, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, + 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0}}; + +short ST010_Sin(short Theta) +{ + return ST010_SinTable[(Theta >> 8) & 0xff]; +} + +short ST010_Cos(short Theta) +{ + return ST010_SinTable[((Theta + 0x4000) >> 8) & 0xff]; +} + +void ST010_OP01(short x0, short y0, short &x1, short &y1, short &Quadrant, short &Theta) +{ + if ((x0 < 0) && (y0 < 0)) + { + x1 = -x0; + y1 = -y0; + Quadrant = -0x8000; + } + else if (x0 < 0) + { + x1 = y0; + y1 = -x0; + Quadrant = -0x4000; + } + else if (y0 < 0) + { + x1 = -y0; + y1 = x0; + Quadrant = 0x4000; + } + else + { + x1 = x0; + y1 = y0; + Quadrant = 0x0000; + } + + while ((x1 > 0x1f) || (y1 > 0x1f)) + { + if (x1 > 1) x1 >>= 1; + if (y1 > 1) y1 >>= 1; + } + + if (y1 == 0) Quadrant += 0x4000; + + Theta = (ST010_ArcTan[y1][x1] << 8) ^ Quadrant; +} + +void ST010_Scale(short Multiplier, short X0, short Y0, int &X1, int &Y1) +{ + X1 = X0 * Multiplier << 1; + Y1 = Y0 * Multiplier << 1; +} + +void ST010_Multiply(short Multiplicand, short Multiplier, int &Product) +{ + Product = Multiplicand * Multiplier << 1; +} + +void ST010_Rotate(short Theta, short X0, short Y0, short &X1, short &Y1) +{ + X1 = (Y0 * ST010_Sin(Theta) >> 15) + (X0 * ST010_Cos(Theta) >> 15); + Y1 = (Y0 * ST010_Cos(Theta) >> 15) - (X0 * ST010_Sin(Theta) >> 15); +} + +void SETA_Distance(short Y0, short X0, short &Distance) +{ + if (X0 < 0) X0 = -X0; + if (Y0 < 0) Y0 = -Y0; + Distance = ((X0 * 0x7af0) + 0x4000) >> 15; +} + +void ST010_SortDrivers(uint16 Positions, uint16 Places[32], uint16 Drivers[32]) +{ + bool Sorted; + uint16 Temp; + + if (Positions > 1) + do { + Sorted = true; + for (int i = 0; i < Positions - 1; i++) + if (Places[i] < Places[i + 1]) + { + Temp = Places[i + 1]; + Places[i + 1] = Places[i]; + Places[i] = Temp; + + Temp = Drivers[i + 1]; + Drivers[i + 1] = Drivers[i]; + Drivers[i] = Temp; + + Sorted = false; + } + Positions--; + } while (!Sorted); +} + +#define ST010_WORD(offset) (CMemory_SRAM[offset + 1] << 8) | CMemory_SRAM[offset] + +void S9xSetST010(uint32 Address, uint8 Byte) +{ + if(!(Address&0x80000)) + { + ST010.control_enable=TRUE; + return; + } + //printf("Write %06X:%02X\n", Address, Byte); + + if((Address &0xFFF) ==0x20 && ST010.control_enable) + ST010.op_reg=Byte; + if((Address &0xFFF) ==0x21 && ST010.control_enable) + ST010.execute=Byte; + else CMemory_SRAM[Address&CMemory_SRAMMask]=Byte; + + if(ST010.execute&0x80) + { + switch(ST010.op_reg) + { + // Sorts Driver Placements + // + // Input + // 0x0024-0x0025 : Positions + // 0x0040-0x007f : Places + // 0x0080-0x00ff : Drivers + // Output + // 0x0040-0x007f : Places + // 0x0080-0x00ff : Drivers + // + case 0x02: + { +#ifdef FAST_LSB_WORD_ACCESS + ST010_SortDrivers(*(short*)&CMemory_SRAM[0x0024], (uint16*) (CMemory_SRAM + 0x0040), (uint16*) (CMemory_SRAM + 0x0080)); +#else + uint16 Places[32]; + uint16 Positions = ST010_WORD(0x0024); + int Pos, Offset; + + Offset = 0; + + for (Pos = 0; Pos < Positions; Pos++) + { + Places[Pos] = ST010_WORD(0x0040 + Offset); + Offset += 2; + } + + ST010_SortDrivers(Positions, Places, (uint16*) (CMemory_SRAM + 0x0080)); + + Offset = 0; + + for (Pos = 0; Pos < Positions; Pos++) + { + CMemory_SRAM[0x0040 + Offset]=(uint8)(Places[Pos]); + CMemory_SRAM[0x0041 + Offset]=(uint8)(Places[Pos] >> 8); + Offset += 2; + } +#endif + break; + + } + + // Two Dimensional Coordinate Scale + // + // Input + // 0x0000-0x0001 : X0 (signed) + // 0x0002-0x0003 : Y0 (signed) + // 0x0004-0x0005 : Multiplier (signed) + // Output + // 0x0010-0x0013 : X1 (signed) + // 0x0014-0x0017 : Y1 (signed) + // + case 0x03: + { +#ifdef FAST_LSB_WORD_ACCESS + ST010_Scale(*(short*)&CMemory_SRAM[0x0004], *(short*)&CMemory_SRAM[0x0000], *(short*)&CMemory_SRAM[0x0002], + (int&) CMemory_SRAM[0x0010], (int&) CMemory_SRAM[0x0014]); +#else + int x1, y1; + + ST010_Scale(ST010_WORD(0x0004), ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1); + + CMemory_SRAM[0x0010]=(uint8)(x1); + CMemory_SRAM[0x0011]=(uint8)(x1 >> 8); + CMemory_SRAM[0x0012]=(uint8)(x1 >> 16); + CMemory_SRAM[0x0013]=(uint8)(x1 >> 24); + CMemory_SRAM[0x0014]=(uint8)(y1); + CMemory_SRAM[0x0015]=(uint8)(y1 >> 8); + CMemory_SRAM[0x0016]=(uint8)(y1 >> 16); + CMemory_SRAM[0x0017]=(uint8)(y1 >> 24); +#endif + break; + } + + // 16-bit Multiplication + // + // Input + // 0x0000-0x0001 : Multiplcand (signed) + // 0x0002-0x0003 : Multiplier (signed) + // Output + // 0x0010-0x0013 : Product (signed) + // + case 0x06: + { +#ifdef FAST_LSB_WORD_ACCESS + ST010_Multiply(*(short*)&CMemory_SRAM[0x0000], *(short*)&CMemory_SRAM[0x0002], (int&) CMemory_SRAM[0x0010]); +#else + int Product; + + ST010_Multiply(ST010_WORD(0x0000), ST010_WORD(0x0002), Product); + + CMemory_SRAM[0x0010]=(uint8)(Product); + CMemory_SRAM[0x0011]=(uint8)(Product >> 8); + CMemory_SRAM[0x0012]=(uint8)(Product >> 16); + CMemory_SRAM[0x0013]=(uint8)(Product >> 24); +#endif + break; + } + + // Mode 7 Raster Data Calculation + // + // Input + // 0x0000-0x0001 : Angle (signed) + // Output + // 0x00f0-0x024f : Mode 7 Matrix A + // 0x0250-0x03af : Mode 7 Matrix B + // 0x03b0-0x050f : Mode 7 Matrix C + // 0x0510-0x066f : Mode 7 Matrix D + // + case 0x07: + { + int16 data; + int32 offset = 0; + int16 Theta = ST010_WORD(0x0000); + + for (int32 line = 0; line < 176; line++) + { + // Calculate Mode 7 Matrix A/D data + data = ST010_M7Scale[line] * ST010_Cos(Theta) >> 15; + + CMemory_SRAM[0x00f0 + offset]=(uint8)(data); + CMemory_SRAM[0x00f1 + offset]=(uint8)(data >> 8); + CMemory_SRAM[0x0510 + offset]=(uint8)(data); + CMemory_SRAM[0x0511 + offset]=(uint8)(data >> 8); + + // Calculate Mode 7 Matrix B/C data + data = ST010_M7Scale[line] * ST010_Sin(Theta) >> 15; + + CMemory_SRAM[0x0250 + offset]=(uint8)(data); + CMemory_SRAM[0x0251 + offset]=(uint8)(data >> 8); + + if (data) data = ~data; + + CMemory_SRAM[0x03b0 + offset]=(uint8)(data); + CMemory_SRAM[0x03b1 + offset]=(uint8)(data >> 8); + + offset += 2; + } + + // Shift Angle for use with Lookup table + CMemory_SRAM[0x00] = CMemory_SRAM[0x01]; + CMemory_SRAM[0x01] = 0x00; + + break; + } + + // Two dimensional Coordinate Rotation + // + // Input + // 0x0000-0x0001 : X0 (signed) + // 0x0002-0x0003 : Y0 (signed) + // 0x0004-0x0005 : Angle (signed) + // Output + // 0x0010-0x0011 : X1 (signed) + // 0x0012-0x0013 : Y1 (signed) + // + case 0x08: + { +#ifdef FAST_LSB_WORD_ACCESS + ST010_Rotate(*(short*)&CMemory_SRAM[0x0004], *(short*)&CMemory_SRAM[0x0000], *(short*)&CMemory_SRAM[0x0002], + (short&) CMemory_SRAM[0x0010], (short&) CMemory_SRAM[0x0012]); +#else + short x1, y1; + + ST010_Rotate(ST010_WORD(0x0004), ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1); + + CMemory_SRAM[0x0010]=(uint8)(x1); + CMemory_SRAM[0x0011]=(uint8)(x1 >> 8); + CMemory_SRAM[0x0012]=(uint8)(y1); + CMemory_SRAM[0x0013]=(uint8)(y1 >> 8); +#endif + break; + } + + // Input + // 0x0000-0x0001 : DX (signed) + // 0x0002-0x0003 : DY (signed) + // Output + // 0x0010-0x0011 : Angle (signed) + // + case 0x01: + { + CMemory_SRAM[0x0006] = CMemory_SRAM[0x0002]; + CMemory_SRAM[0x0007] = CMemory_SRAM[0x0003]; + +#ifdef FAST_LSB_WORD_ACCESS + ST010_OP01(*(short*)&CMemory_SRAM[0x0000], *(short*)&CMemory_SRAM[0x0002], + (short&) CMemory_SRAM[0x0000], (short&) CMemory_SRAM[0x0002], + (short&) CMemory_SRAM[0x0004], (short&) CMemory_SRAM[0x0010]); +#else + short x1, y1, Quadrant, Theta; + + ST010_OP01(ST010_WORD(0x0000), ST010_WORD(0x0002), x1, y1, Quadrant, Theta); + + CMemory_SRAM[0x0000]=(uint8)(x1); + CMemory_SRAM[0x0001]=(uint8)(x1 >> 8); + CMemory_SRAM[0x0002]=(uint8)(y1); + CMemory_SRAM[0x0003]=(uint8)(y1 >> 8); + CMemory_SRAM[0x0004]=(uint8)(Quadrant); + CMemory_SRAM[0x0005]=(uint8)(Quadrant >> 8); + CMemory_SRAM[0x0010]=(uint8)(Theta); + CMemory_SRAM[0x0011]=(uint8)(Theta >> 8); +#endif + break; + } + + // calculate the vector length of (x,y) + case 0x04: + { + int16 square, x,y; +#ifdef FAST_LSB_WORD_ACCESS + x=*((int16*)CMemory_SRAM); + y=*((int16*)&CMemory_SRAM[2]); +#else + x=CMemory_SRAM[0]|(CMemory_SRAM[1]<<8); + y=CMemory_SRAM[2]|(CMemory_SRAM[3]<<8); +#endif + square=(int16)sqrt((double)(y*y+x*x)); + //SETA_Distance( x,y,square ); + +#ifdef FAST_LSB_WORD_ACCESS + *((int16*)&CMemory_SRAM[0x10])=square; +#else + CMemory_SRAM[0x10]=(uint8)(square); + CMemory_SRAM[0x11]=(uint8)(square>>8); +#endif + break; + } + + // calculate AI orientation based on specific guidelines + case 0x05: + { + int dx,dy; + int16 a1,b1,c1; + uint16 o1; + + bool wrap=false; + + // target (x,y) coordinates + int16 ypos_max = ST010_WORD(0x00C0); + int16 xpos_max = ST010_WORD(0x00C2); + + // current coordinates and direction + int32 ypos = CMemory_SRAM[0xC4]|(CMemory_SRAM[0xC5]<<8)|(CMemory_SRAM[0xC6]<<16)|(CMemory_SRAM[0xC7]<<24); + int32 xpos = CMemory_SRAM[0xC8]|(CMemory_SRAM[0xC9]<<8)|(CMemory_SRAM[0xCA]<<16)|(CMemory_SRAM[0xCB]<<24); + uint16 rot = CMemory_SRAM[0xCC]|(CMemory_SRAM[0xCD]<<8); + + // physics + uint16 speed = ST010_WORD(0x00D4); + uint16 accel = ST010_WORD(0x00D6); + uint16 speed_max = ST010_WORD(0x00D8); + + // special condition acknowledgment + int16 system = ST010_WORD(0x00DA); + int16 flags = ST010_WORD(0x00DC); + + // new target coordinates + int16 ypos_new = ST010_WORD(0x00DE); + int16 xpos_new = ST010_WORD(0x00E0); + + // mask upper bit + xpos_new &= 0x7FFF; + + // get the current distance + dx = xpos_max-(xpos>>16); + dy = ypos_max-(ypos>>16); + + // quirk: clear and move in9 + CMemory_SRAM[0xD2]=0xFF; + CMemory_SRAM[0xD3]=0xFF; + CMemory_SRAM[0xDA]=0; + CMemory_SRAM[0xDB]=0; + + // grab the target angle + ST010_OP01(dy,dx,a1,b1,c1,(int16 &)o1); + + // check for wrapping + //if((o1<0x6000 && rot>0xA000) || + // (rot<0x6000 && o1>0xA000)) + //if(o10x8000) + { + o1+=0x8000; + rot+=0x8000; + wrap=true; + } + //o1=0x0000; + //rot=0xFF00; + + uint16 old_speed; + + old_speed = speed; + + // special case + if(abs(o1-rot)==0x8000) + { + speed = 0x100; + } + // slow down for sharp curves + else if(abs(o1-rot)>=0x1000) + { + uint32 slow = abs(o1-rot); + slow >>= 4; // scaling + speed -= slow; + } + // otherwise accelerate + else + { + speed += accel; + if(speed > speed_max) + { + // clip speed + speed = speed_max; + } + } + + // prevent negative/positive overflow + if(abs(old_speed-speed)>0x8000) { + if(old_speedrot && (o1-rot)>0x80) || + (o1=0x80) ) + { + if(o1rot) rot+=0x280; + } + + // turn off wrapping + if(wrap) rot-=0x8000; + + // now check the distances (store for later) + dx = (xpos_max<<16)-xpos; + dy = (ypos_max<<16)-ypos; + dx>>=16; + dy>>=16; + + // if we're in so many units of the target, signal it + if( ( system && (dy<=6 && dy>=-8) && (dx<=126 && dx>=-128)) || + (!system && (dx<=6 && dx>=-8) && (dy<=126 && dy>=-128)) ) + { + // announce our new destination and flag it + xpos_max = xpos_new&0x7FFF; + ypos_max = ypos_new; + flags |= 0x08; + } + + // update position + xpos -= (ST010_Cos(rot) * 0x400 >> 15) * (speed >> 8) << 1; + ypos -= (ST010_Sin(rot) * 0x400 >> 15) * (speed >> 8) << 1; + + // quirk: mask upper byte + xpos &= 0x1FFFFFFF; + ypos &= 0x1FFFFFFF; + + CMemory_SRAM[0x00C0]=(uint8)(ypos_max); + CMemory_SRAM[0x00C1]=(uint8)(ypos_max >> 8); + CMemory_SRAM[0x00C2]=(uint8)(xpos_max); + CMemory_SRAM[0x00C3]=(uint8)(xpos_max >> 8); + CMemory_SRAM[0x00C4]=(uint8)(ypos); + CMemory_SRAM[0x00C5]=(uint8)(ypos >> 8); + CMemory_SRAM[0x00C6]=(uint8)(ypos >> 16); + CMemory_SRAM[0x00C7]=(uint8)(ypos >> 24); + CMemory_SRAM[0x00C8]=(uint8)(xpos); + CMemory_SRAM[0x00C9]=(uint8)(xpos >> 8); + CMemory_SRAM[0x00CA]=(uint8)(xpos >> 16); + CMemory_SRAM[0x00CB]=(uint8)(xpos >> 24); + CMemory_SRAM[0x00CC]=(uint8)(rot); + CMemory_SRAM[0x00CD]=(uint8)(rot >> 8); + CMemory_SRAM[0x00D4]=(uint8)(speed); + CMemory_SRAM[0x00D5]=(uint8)(speed >> 8); + CMemory_SRAM[0x00DC]=(uint8)(flags); + CMemory_SRAM[0x00DD]=(uint8)(flags >> 8); + + break; + } + + default: + printf("Unknown Op\n"); + break; + } + + // lower signal: op processed + ST010.op_reg=0; + ST010.execute=0; + } +} + diff --git a/src/seta011.cpp b/src/seta011.cpp new file mode 100644 index 0000000..9f6f4cc --- /dev/null +++ b/src/seta011.cpp @@ -0,0 +1,232 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include "seta.h" +#include "memmap.h" + +ST011_Regs ST011; + +// shougi playboard +uint8 board[9][9]; + +// debug +static int line = 0; + +uint8 S9xGetST011(uint32 Address) +{ + uint8 t; + uint16 address = (uint16) Address & 0xFFFF; + + // line counter + line++; + + // status check + if (address == 0x01) + { + t = 0xFF; + } + // read directly from s-ram + else + { + t = CMemory_SRAM[address]; + } + + // debug +// if(address<0x150) +// printf( "ST011 R: %06X %02X\n", Address, t); + + return t; +} + +void S9xSetST011(uint32 Address, uint8 Byte) +{ + uint16 address = (uint16) Address & 0xFFFF; + static bool reset = false; + + // debug + line++; + + if(!reset) + { + // bootup values + ST011.waiting4command = true; + reset = true; + } + + // debug +// if(address<0x150) +// printf( "ST011 W: %06X %02X\n", Address, Byte ); + + CMemory_SRAM[address]=Byte; + + // op commands/data goes through this address + if(address==0x00) + { + // check for new commands + if (ST011.waiting4command) + { + ST011.waiting4command = false; + ST011.command = Byte; + ST011.in_index = 0; + ST011.out_index = 0; + switch(ST011.command) + { + case 0x01: ST011.in_count = 12*10+8; break; + case 0x02: ST011.in_count = 4; break; + case 0x04: ST011.in_count = 0; break; + case 0x05: ST011.in_count = 0; break; + case 0x06: ST011.in_count = 0; break; + case 0x07: ST011.in_count = 0; break; + case 0x0E: ST011.in_count = 0; break; + default: ST011.waiting4command=true; break; + } + } + else + { + ST011.parameters [ST011.in_index] = Byte; + ST011.in_index++; + } + } + + if (ST011.in_count==ST011.in_index) + { + // Actually execute the command + ST011.waiting4command = true; + ST011.out_index = 0; + switch (ST011.command) + { + // unknown: download playboard + case 0x01: + { + // 9x9 board data: top to bottom, left to right + // Values represent piece types and ownership + for( int lcv=0; lcv<9; lcv++ ) + memcpy( board[lcv], ST011.parameters+lcv*10, 9*1 ); + } + break; + + // unknown + case 0x02: break; + + // unknown + case 0x04: + { + // outputs + CMemory_SRAM[0x12C] = 0x00; + //CMemory_SRAM[0x12D] = 0x00; + CMemory_SRAM[0x12E] = 0x00; + } + break; + + // unknown + case 0x05: + { + // outputs + CMemory_SRAM[0x12C] = 0x00; + //CMemory_SRAM[0x12D] = 0x00; + CMemory_SRAM[0x12E] = 0x00; + } + break; + + // unknown + case 0x06: break; + case 0x07: break; + + // unknown + case 0x0E: + { + // outputs + CMemory_SRAM[0x12C] = 0x00; + CMemory_SRAM[0x12D] = 0x00; + } + break; + } + } +} + diff --git a/src/seta018.cpp b/src/seta018.cpp new file mode 100644 index 0000000..984c110 --- /dev/null +++ b/src/seta018.cpp @@ -0,0 +1,256 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "seta.h" +#include "memmap.h" + +ST018_Regs ST018; + +static int line; // line counter + +extern "C"{ +uint8 S9xGetST018(uint32 Address) +{ + uint8 t; + uint16 address = (uint16) Address & 0xFFFF; + + line++; + + // these roles may be flipped + // op output + if (address == 0x3804) + { + if (ST018.out_count) + { + t = (uint8) ST018.output [ST018.out_index]; + ST018.out_index++; + if (ST018.out_count==ST018.out_index) + ST018.out_count=0; + } + else + t = 0x81; + } + // status register + else if (address == 0x3800) + t = ST018.status; + + printf( "ST018 R: %06X %02X\n", Address, t); + + return t; +} + +void S9xSetST018(uint8 Byte, uint32 Address) +{ + uint16 address = (uint16) Address&0xFFFF; + static bool reset = false; + + printf( "ST018 W: %06X %02X\n", Address, Byte ); + + line++; + + if (!reset) + { + // bootup values + ST018.waiting4command = true; + ST018.part_command = 0; + reset = true; + } + + CMemory_SRAM[address]=Byte; + + // default status for now + ST018.status = 0x00; + + // op data goes through this address + if (address==0x3804) + { + // check for new commands: 3 bytes length + if(ST018.waiting4command && ST018.part_command==2) + { + ST018.waiting4command = false; + ST018.command <<= 8; + ST018.command |= Byte; + ST018.in_index = 0; + ST018.out_index = 0; + ST018.part_command = 0; // 3-byte commands + ST018.pass = 0; // data streams into the chip + switch(ST018.command & 0xFFFFFF) + { + case 0x0100: ST018.in_count = 0; break; + case 0xFF00: ST018.in_count = 0; break; + default: ST018.waiting4command = true; break; + } + } + else if(ST018.waiting4command) + { + // 3-byte commands + ST018.part_command++; + ST018.command <<= 8; + ST018.command |= Byte; + } + } + // extra parameters + else if (address==0x3802) + { + ST018.parameters[ST018.in_index] = Byte; + ST018.in_index++; + } + + if (ST018.in_count==ST018.in_index) + { + // Actually execute the command + ST018.waiting4command = true; + ST018.in_index = 0; + ST018.out_index = 0; + switch (ST018.command) + { + // hardware check? + case 0x0100: + ST018.waiting4command = false; + ST018.pass++; + if (ST018.pass==1) + { + ST018.in_count = 1; + ST018.out_count = 2; + + // Overload's research + ST018.output[0x00] = 0x81; + ST018.output[0x01] = 0x81; + } + else + { + //ST018.in_count = 1; + ST018.out_count = 3; + + // no reason to change this + //ST018.output[0x00] = 0x81; + //ST018.output[0x01] = 0x81; + ST018.output[0x02] = 0x81; + + // done processing requests + if (ST018.pass==3) + ST018.waiting4command = true; + } + break; + + // unknown: feels like a security detection + // format identical to 0x0100 + case 0xFF00: + ST018.waiting4command = false; + ST018.pass++; + if (ST018.pass==1) + { + ST018.in_count = 1; + ST018.out_count = 2; + + // Overload's research + ST018.output[0x00] = 0x81; + ST018.output[0x01] = 0x81; + } + else + { + static int a=0; + + //ST018.in_count = 1; + ST018.out_count = 3; + + // no reason to change this + //ST018.output[0x00] = 0x81; + //ST018.output[0x01] = 0x81; + ST018.output[0x02] = 0x81; + + // done processing requests + if (ST018.pass==3) + ST018.waiting4command = true; + } + break; + } + } +} +} + diff --git a/src/setppu_table.h b/src/setppu_table.h new file mode 100644 index 0000000..af466b6 --- /dev/null +++ b/src/setppu_table.h @@ -0,0 +1,8174 @@ +S9xSetPPU_func_t S9xSetPPU_func[]= { +#ifndef USE_SETPPU_SMALL_TABLE +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty,S9xSetPPU_empty, +#endif +S9xSetPPU_brightness,S9xSetPPU_obj,S9xSetPPU_spr_write_low,S9xSetPPU_spr_write_high,S9xSetPPU_spr_reg_write,S9xSetPPU_screen_mode,S9xSetPPU_mosaic_pixel,S9xSetPPU_bg0sc, +S9xSetPPU_bg1sc,S9xSetPPU_bg2sc,S9xSetPPU_bg3sc,S9xSetPPU_bg01nba,S9xSetPPU_bg23nba,S9xSetPPU_210d,S9xSetPPU_210e,S9xSetPPU_210f, +S9xSetPPU_2110,S9xSetPPU_2111,S9xSetPPU_2112,S9xSetPPU_2113,S9xSetPPU_2114,S9xSetPPU_vram_access,S9xSetPPU_vram_addr_low,S9xSetPPU_vram_addr_high, +S9xSetPPU_vram_write_low,S9xSetPPU_vram_write_high,S9xSetPPU_mode7_rot,S9xSetPPU_mode7_matrix_a,S9xSetPPU_mode7_matrix_b,S9xSetPPU_mode7_matrix_c,S9xSetPPU_mode7_matrix_d,S9xSetPPU_mode7_centre_x, +S9xSetPPU_mode7_centre_y,S9xSetPPU_cgram_addr,S9xSetPPU_2122,S9xSetPPU_enable_win_12,S9xSetPPU_enable_win_34,S9xSetPPU_enable_win_obj,S9xSetPPU_win_1_left,S9xSetPPU_win_1_right, +S9xSetPPU_win_2_left,S9xSetPPU_win_2_right,S9xSetPPU_win_overlap_14,S9xSetPPU_win_overlap_obj,S9xSetPPU_main_screen_dest,S9xSetPPU_sub_screen_dest,S9xSetPPU_main_screen_mask,S9xSetPPU_sub_screen_mask, +S9xSetPPU_fixed_add,S9xSetPPU_col_add,S9xSetPPU_fixed_sub,S9xSetPPU_screen_sets,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null, +S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null,S9xSetPPU_null, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool,S9xSetPPU_spctool, +S9xSetPPU_2180,S9xSetPPU_2181,S9xSetPPU_2182,S9xSetPPU_2183,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_2801,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_301f, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_3030,S9xSetPPU_3031,S9xSetPPU_default_fx,S9xSetPPU_3033,S9xSetPPU_3034,S9xSetPPU_default_fx,S9xSetPPU_3036,S9xSetPPU_3037, +S9xSetPPU_3038,S9xSetPPU_3039,S9xSetPPU_303a,S9xSetPPU_303b,S9xSetPPU_303c,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_303f, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx,S9xSetPPU_default_fx, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +#ifndef USE_SETPPU_SMALL_TABLE +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty,S9xSetPPU_sa1_empty, +#endif +}; diff --git a/src/sh/aputimer.h b/src/sh/aputimer.h new file mode 100644 index 0000000..d479f50 --- /dev/null +++ b/src/sh/aputimer.h @@ -0,0 +1,195 @@ + +.macro UPDATE_APUTIMER_WITH_SHUTODOWN_i +#ifdef SPC700_SHUTDOWN + mov #1,r0 + mov.l APUWaitCounter, r4 + add r0,r4 + mov.l r4, APUWaitCounter +#endif +.endm + +.macro UPDATE_APUTIMER_WITH_SHUTODOWN_f +#ifdef SPC700_SHUTDOWN + mov.b r0, APUExecuting +#endif +.endm + +.macro UPDATE_APUTIMER_WITH_SHUTODOWN + UPDATE_APUTIMER_WITH_SHUTODOWN_i + UPDATE_APUTIMER_WITH_SHUTODOWN_f +.endm + + +.macro UPDATE_APUTIMER K +// r1 = IAPU +// r2 = APUTimer_ptr +// r3 = Cycles * 10000 + mov.l IAPU, r1 + mov.l .S9xUpdateAPUTimer_APUTimer_ptr, r2 + mov.l Cycles, r3 + mov.l .S9xUpdateAPUTimer_CONST00002710, r0 + mul.l r0, r3 + sts macl, r3 +.S9xUpdateAPUTimer_bucle\K: + mov.l NextAPUTimerPos, r4 + cmp/ge r4, r3 + bf .S9xUpdateAPUTimer_salida\K + +#ifdef USE_ASM_R5 + mov.l .S9xUpdateAPUTimer_CONST003334bb, r5 + add r5, r4 +#else + mov.l .S9xUpdateAPUTimer_CONST003334bb, r0 + add r0, r4 +#endif + mov.l r4, NextAPUTimerPos + + mov.b @(APUTimerEnabled - APUTimer + 2, r2), r0 + tst r0, r0 + bt .S9xUpdateAPUTimer_1salto\K + +#ifdef USE_ASM_R5 + mov.w @(4, r2), r0 + add #1,r0 + mov.w r0, @(4, r2) + mov r0, r5 + mov.w @(APUTimerTarget - APUTimer + 4, r2), r0 + extu.w r0,r4 + extu.w r5,r0 +#else + mov.w @(APUTimerTarget - APUTimer + 4, r2), r0 + extu.w r0,r4 + mov.w @(4, r2), r0 + add #1,r0 + mov.w r0, @(4, r2) + extu.w r0,r0 +#endif + cmp/hs r4,r0 + bf .S9xUpdateAPUTimer_bucle\K + + mov #0,r0 + mov.w r0, @(4, r2) + + mov.l .S9xUpdateAPUTimer_CONST000000ff, r4 +#ifdef USE_ASM_R5 + mov.l APURAM, r5 + add r4,r5 + mov.b @r5,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r5 +#else + mov.l APURAM,r0 + add r0,r4 + mov.b @r4,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r4 +#endif + + UPDATE_APUTIMER_WITH_SHUTODOWN + +.S9xUpdateAPUTimer_1salto\K: + mov.l APUTimerCounter, r0 + add #1, r0 + mov.l r0, APUTimerCounter + cmp/eq #8, r0 + bf .S9xUpdateAPUTimer_bucle\K + + mov #0, r0 + mov.l r0, APUTimerCounter + + mov.b @(APUTimerEnabled - APUTimer, r2), r0 + tst r0, r0 + bt .S9xUpdateAPUTimer_2salto\K + +#ifdef USE_ASM_R5 + mov.w @r2, r5 + add #1, r5 + mov.w r5, @r2 + + extu.w r5, r4 + mov.w @(APUTimerTarget - APUTimer, r2), r0 + extu.w r0, r5 + cmp/hs r5, r4 +#else + mov.w @r2, r4 + add #1, r4 + mov.w r4, @r2 + + extu.w r4, r4 + mov.w @(APUTimerTarget - APUTimer, r2), r0 + extu.w r0, r0 + cmp/hs r0, r4 +#endif + bf .S9xUpdateAPUTimer_bucle\K + + mov #0, r0 + mov.w r0, @r2 +#ifdef USE_ASM_R5 + mov.l APURAM, r5 + mov.l .S9xUpdateAPUTimer_CONST000000fd, r4 + add r4, r5 + mov.b @r5,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r5 +#else + mov.l .S9xUpdateAPUTimer_CONST000000fd, r4 + mov.l APURAM, r0 + add r0, r4 + mov.b @r4,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r4 +#endif + + UPDATE_APUTIMER_WITH_SHUTODOWN + +.S9xUpdateAPUTimer_2salto\K: + mov.b @(APUTimerEnabled - APUTimer + 1, r2), r0 + tst r0, r0 + bt .S9xUpdateAPUTimer_bucle\K + + mov.w @(2, r2), r0 + add #1, r0 + mov.w r0, @(2, r2) + + extu.w r0, r4 + mov.w @(APUTimerTarget - APUTimer + 2, r2), r0 +#ifdef USE_ASM_R5 + extu.w r0, r5 + cmp/hs r5, r4 +#else + extu.w r0, r0 + cmp/hs r0, r4 +#endif + bf.s .S9xUpdateAPUTimer_bucle\K + + mov #0, r0 + mov.w r0, @(2, r2) +#ifdef USE_ASM_R5 + mov.l APURAM, r5 + mov.l .S9xUpdateAPUTimer_CONST000000fe, r4 + add r4, r5 + mov.b @r5,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r5 +#else + mov.l .S9xUpdateAPUTimer_CONST000000fe, r4 + mov.l APURAM, r0 + add r0, r4 + mov.b @r4,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r4 +#endif + + UPDATE_APUTIMER_WITH_SHUTODOWN_i + bra .S9xUpdateAPUTimer_bucle\K + UPDATE_APUTIMER_WITH_SHUTODOWN_f + +.S9xUpdateAPUTimer_salida\K: +.endm + diff --git a/src/sh/asmaddr.h b/src/sh/asmaddr.h new file mode 100644 index 0000000..9741493 --- /dev/null +++ b/src/sh/asmaddr.h @@ -0,0 +1,1159 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +#if defined(USE_MMU_DIRECT_INDEX) && !defined(USE_MMU) +#undef USE_MMU_DIRECT_INDEX +#endif + +.macro GetCarry + mov FLAGS,r1 + shlr r1 +.endm + +.macro GetNotCarry + mov #Carry,r1 + tst r1,FLAGS +.endm + +.macro SetZNjmp R + jmp @r13 + exts.b \R,r7 +.endm + +.macro Set16ZNjmp R + jmp @r13 + exts.w \R,r7 +.endm + +.macro SetZNlink R + lds r13,pr + jmp @r3 + exts.b \R,r7 +.endm + +.macro Set16ZNlink R + lds r13,pr + jmp @r3 + exts.w \R,r7 +.endm + +.macro Xlink + jmp @r3 + lds r13,pr +.endm + +/************* IMMEDIATE8 ****************/ +.Macro Immediate8 K + mov.b @PC+,r0 + extu.b r0,r0 +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +.endm + +/************* IMMEDIATE16 ****************/ +.macro Immediate16 K + mov.b @PC+,r0 + shll8 r0 + mov.b @PC+,r2 + extu.b r2,r2 + or r2,r0 + swap.b r0,r0 + extu.w r0,r0 +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif +.endm + +/************* Relative ****************/ +.macro Relative K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif + mov.b @PC+,r4 +! exts.b r4,r4 + mov.l PCBase,r2 + add PC,r4 + sub r2,r4 +.endm + +/************* RelativeLong ****************/ +.macro RelativeLong K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r4 +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + extu.b r4,r4 + mov.b @PC+,r0 + shll8 r0 + mov.l PCBase,r2 + or r0,r4 + add PC,r4 + sub r2,r4 +.endm + + +/************* AbsoluteIndexedIndirect8 ****************/ +.macro AbsoluteIndexedIndirect8 K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 + mov.w XX,r0 + add r2,r4 + add r0,r4 + mov.l S9xGetWord,r3 + extu.w r4,r4 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + mov.l ICPU,r1 + mov.l ShiftedPB,r2 + jsr @r3 + or r2,r4 + extu.w r0,r4 +.endm + +/************* AbsoluteIndirectLong8 ****************/ +.macro AbsoluteIndirectLong8 K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 +#ifndef USE_MMU_DIRECT_INDEX + mov.l S9xGetWord,r3 +#endif + or r2,r4 +#ifndef USE_MMU_DIRECT_INDEX + jsr @r3 +#endif + extu.w r4,r4 +#ifdef USE_MMU_DIRECT_INDEX + mov.b @r4+,r0 + add #24,CYCLES + extu.b r0, r3 + mov.b @r4+,r0 + shll8 r0 + or r3,r0 + extu.w r0,r3 + mov.b @r4,r0 + extu.b r0,r0 + shll16 r0 + or r0,r3 + mov r3,r4 +#else + mov.l r0,@-r15 + mov.l S9xGetByte,r3 + add #2,r4 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + shll16 r0 + or r0,r4 +#endif +.endm + +.macro AbsoluteIndirect8 K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 + mov.l S9xGetWord,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + or r2,r4 + jsr @r3 + extu.w r4,r4 + extu.w r0,r4 +.endm + +.macro Absolute8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l ICPU,r1 + mov.l ShiftedDB,r4 + or r2,r3 + extu.w r3,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro Absolute8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro Absolute8 K + Absolute8_i \K +#ifdef ASMADDR_NOP_PATCH + Absolute8_f +#endif +.endm + + +.macro AbsoluteLong8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add r2,CYCLES + add r2,CYCLES +#else + add #24,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + extu.b r4,r4 + mov.b @PC+,r0 + extu.b r0,r0 + shll16 r0 + shll8 r4 + or r0,r2 +#ifndef ASMADDR_NOP_PATCH + or r2,r4 +#endif +.endm + +.macro AbsoluteLong8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + or r2,r4 +#endif +.endm + +.macro AbsoluteLong8 K + AbsoluteLong8_i \K +#ifdef ASMADDR_NOP_PATCH + AbsoluteLong8_f +#endif +.endm + +.macro Direct8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +#if 0 + cmpb $0, DL + je .Direct8\K + addl $6, CYCLES +.Direct8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 +#ifndef ASMADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro Direct8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro Direct8 K + Direct8_i \K +#ifdef ASMADDR_NOP_PATCH + Direct8_f +#endif +.endm + +.macro DirectIndirectIndexed8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +#if 0 + cmpb $0, DD + je .DirectIndirectIndexed8\K + addl $6, CYCLES +.DirectIndirectIndexed8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xGetWord,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + jsr @r3 + extu.w r4,r4 + mov.l ICPU,r3 + mov.l @(20,r3),r4 + add r0,r4 + mov.w YY,r0 + extu.w r0,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexed8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexed8 K + DirectIndirectIndexed8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndirectIndexed8_f +#endif +.endm + +.macro DirectIndirectIndexedLong8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +#if 0 + cmpb $0, DD + je .DirectIndirectIndexedLong8\K + addl $6, CYCLES +.DirectIndirectIndexedLong8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 +#ifndef USE_MMU_DIRECT_INDEX + mov.l S9xGetWord,r3 + jsr @r3 +#endif + extu.w r4,r4 +#ifndef USE_MMU_DIRECT_INDEX + mov.l r0,@-r15 + mov.l S9xGetByte,r3 + jsr @r3 + add #2,r4 + mov.l @r15+,r4 + shll16 r0 + or r0,r4 +#else + mov.b @r4+,r0 + add #24,CYCLES + extu.b r0, r3 + mov.b @r4+,r0 + shll8 r0 + or r3,r0 + extu.w r0,r3 + mov.b @r4,r0 + extu.b r0,r0 + shll16 r0 + or r0,r3 + mov r3,r4 +#endif + mov.w YY,r0 + extu.w r0,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexedLong8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexedLong8 K + DirectIndirectIndexedLong8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndirectIndexedLong8_f +#endif +.endm + +.macro DirectIndexedIndirect8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6, CYCLES +#else + add #14,CYCLES +#endif +#endif +#if 0 + cmpb $0, DD + je .DirectIndexedIndirect8\K + addl $6, CYCLES +.DirectIndexedIndirect8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w XX,r0 + add r0,r4 + mov.l S9xGetWord,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + jsr @r3 + extu.w r4,r4 + mov.l ICPU,r3 + mov.l @(20,r3),r4 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndexedIndirect8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndexedIndirect8 K + DirectIndexedIndirect8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndexedIndirect8_f +#endif +.endm + +.macro DirectIndexedX8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6, CYCLES +#else + add #14, CYCLES +#endif +#endif +#if 0 + cmpb $0, DD + je .DirectIndexedX8\K + addl $6, CYCLES +.DirectIndexedX8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w XX,r0 + add r0,r4 +#ifndef ASMADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedX8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedX8 K + DirectIndexedX8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndexedX8_f +#endif +.endm + +.macro DirectIndexedY8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6, CYCLES +#else + add #14, CYCLES +#endif +#endif +#if 0 + cmpb $0, DD + je .DirectIndexedY8\K + addl $6, CYCLES +.DirectIndexedY8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w YY,r0 + add r0,r4 +#ifndef ASMADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedY8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedY8 K + DirectIndexedY8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndexedY8_f +#endif +.endm + +.macro AbsoluteIndexedX8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l ICPU,r1 + mov.l ShiftedDB,r4 + or r2,r3 + extu.w r3,r3 + mov.w XX,r0 + add r3,r4 + extu.w r0,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedX8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedX8 K + AbsoluteIndexedX8_i \K +#ifdef ASMADDR_NOP_PATCH + AbsoluteIndexedX8_f +#endif +.endm + + +.macro AbsoluteIndexedY8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES +#else + add #16,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l ICPU,r1 + mov.l ShiftedDB,r4 + or r2,r3 + extu.w r3,r3 + mov.w YY,r0 + add r3,r4 + extu.w r0,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedY8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedY8 K + AbsoluteIndexedY8_i \K +#ifdef ASMADDR_NOP_PATCH + AbsoluteIndexedY8_f +#endif +.endm + +.macro AbsoluteLongIndexedX8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add r2,CYCLES + add r2,CYCLES +#else + add #24,CYCLES +#endif +#endif + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + extu.b r3,r3 + mov.b @PC+,r4 + extu.b r4,r4 + shll8 r3 + or r2,r3 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + or r3,r4 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteLongIndexedX8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteLongIndexedX8 K + AbsoluteLongIndexedX8_i \K +#ifdef ASMADDR_NOP_PATCH + AbsoluteLongIndexedX8_f +#endif +.endm + +.macro DirectIndirect8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +#if 0 + cmpb $0, DL + je .DirectIndirect8\K + addl $6, CYCLES +.DirectIndirect8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xGetWord,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + jsr @r3 + extu.w r4,r4 + mov.l ICPU,r3 + mov.l @(20,r3),r4 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirect8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirect8 K + DirectIndirect8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndirect8_f +#endif +.endm + +.macro DirectIndirectLong8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES +#else + add #8,CYCLES +#endif +#endif +#if 0 + cmpb $0, DL + je .DirectIndirectLong8\K + addl $6, CYCLES +.DirectIndirectLong8\K: +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 +#ifndef USE_MMU_DIRECT_INDEX + mov.l S9xGetWord,r3 + jsr @r3 +#endif + extu.w r4,r4 +#ifndef USE_MMU_DIRECT_INDEX + mov.l r0,@-r15 + mov.l S9xGetByte,r3 + jsr @r3 + add #2,r4 + mov.l @r15+,r4 + shll16 r0 +#else + mov.b @r4+,r0 + add #24,CYCLES + extu.b r0, r3 + mov.b @r4+,r0 + shll8 r0 + or r3,r0 + extu.w r0,r3 + mov.b @r4,r0 + extu.b r0,r0 + shll16 r0 + mov r3,r4 +#endif +#ifndef ASMADDR_NOP_PATCH + or r0,r4 +#endif +.endm + +.macro DirectIndirectLong8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + or r0,r4 +#endif +.endm + +.macro DirectIndirectLong8 K + DirectIndirectLong8_i \K +#ifdef ASMADDR_NOP_PATCH + DirectIndirectLong8_f +#endif +.endm + +.macro StackRelative8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6,CYCLES +#else + add #14,CYCLES +#endif +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w SS,r0 + add r0,r4 +#ifndef ASMADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro StackRelative8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro StackRelative8 K + StackRelative8_i \K +#ifdef ASMADDR_NOP_PATCH + StackRelative8_f +#endif +.endm + +.macro StackRelativeIndirectIndexed8_i K +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #12,CYCLES +#else + add #20,CYCLES +#endif +#endif + mov.b @PC+,r4 + extu.b r4,r4 + mov.w SS,r0 + mov.l S9xGetWord,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + add r0,r4 + jsr @r3 + extu.w r4,r4 + mov.l ICPU,r3 + mov.l @(20,r3),r4 + add r0,r4 + mov.w YY,r0 + extu.w r0,r0 +#ifndef ASMADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro StackRelativeIndirectIndexed8_f +#ifndef ASMADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro StackRelativeIndirectIndexed8 K + StackRelativeIndirectIndexed8_i \K +#ifdef ASMADDR_NOP_PATCH + StackRelativeIndirectIndexed8_f +#endif +.endm + + +.macro BranchCheck0 K +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b BranchSkip,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .BranchCheck0S9xExit\K + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,BranchSkip +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov PC,r0 + mov.l PCBase,r1 + extu.w r4,r4 + sub r1,r0 + extu.w r0,r0 + cmp/hs r4,r0 + bt .BranchCheck0S9xExit\K + jmp @r13 + nop +.BranchCheck0S9xExit\K: +.endm + +.macro BranchCheck1 K +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b BranchSkip,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .BranchCheck1S9xExit\K + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,BranchSkip +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov PC,r0 + mov.l PCBase,r1 + extu.w r4,r4 + sub r1,r0 + extu.w r0,r0 + cmp/hs r4,r0 + bt .BranchCheck1S9xExit\K + jmp @r13 + nop +.BranchCheck1S9xExit\K: +.endm + +.macro BranchCheck2 K +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b BranchSkip,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .BranchCheck2S9xExit\K + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,BranchSkip +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov PC,r0 + mov.l PCBase,r1 + extu.w r4,r4 + sub r1,r0 + extu.w r0,r0 + cmp/hs r4,r0 + bt .BranchCheck2S9xExit\K + jmp @r13 + nop +.BranchCheck2S9xExit\K: +.endm + +.macro PushBytejmp K + mov r0,r1 + mov.w SS,r0 + extu.w r0,r4 + mov.l S9xSetByte,r3 + add #-1,r0 +#ifdef USE_MMU_DIRECT_INDEX + add #-12,r3 +#endif + mov.w r0,SS + mov r1,r0 + Xlink +.endm + +.macro PushWordjmp K + mov r0,r1 + mov.w SS,r0 + add #-1,r0 + extu.w r0,r4 + mov.l S9xSetWord,r3 + add #-1,r0 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + mov.w r0,SS + mov r1,r0 + Xlink +.endm + +.macro PushByte K + mov r0,r1 + mov.w SS,r0 + extu.w r0,r4 + mov.l S9xSetByte,r3 + add #-1,r0 +#ifdef USE_MMU_DIRECT_INDEX + add #-12,r3 +#endif + mov.w r0,SS + jsr @r3 + mov r1,r0 +.endm + +.macro PushWord K + mov r0,r1 + mov.w SS,r0 + add #-1,r0 + extu.w r0,r4 + mov.l S9xSetWord,r3 + add #-1,r0 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + mov.w r0,SS + jsr @r3 + mov r1,r0 +.endm + +.macro PullByte K + mov.w SS,r0 + add #1,r0 + mov.l S9xGetByte,r3 +#ifdef USE_MMU_DIRECT_INDEX + add #-8,r3 +#endif + extu.w r0,r4 + jsr @r3 + mov.w r0,SS +.endm + +.macro PullWord K + mov.w SS,r0 + add #1,r0 + mov.l S9xGetWord,r3 + extu.w r0,r4 +#ifdef USE_MMU_DIRECT_INDEX + add #-16,r3 +#endif + add #1,r0 + jsr @r3 + mov.w r0,SS +.endm diff --git a/src/sh/asmops.h b/src/sh/asmops.h new file mode 100644 index 0000000..93f7fea --- /dev/null +++ b/src/sh/asmops.h @@ -0,0 +1,1200 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro Adc8 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .ADC8Decimal\K + extu.b A,r2 + mov #Carry,r1 + tst r1, FLAGS + bt/s .ADC8nocarry\K + add r0,r2 + add #1,r2 +.ADC8nocarry\K: + mov r2,r3 +.ADC8Binary\K: + xor r0,r3 + xor A,r0 + mov #Carry|Overflow,r1 + not r0,r0 + or r1,FLAGS + and r3,r0 + exts.b r0,r0 + cmp/pz r0 + bf/s .ADC8setovf\K + extu.b A,r3 + add #-Overflow,FLAGS +.ADC8setovf\K: + sub r3,A + extu.b r2,r3 + shlr8 r2 + tst r2,r2 + bf/s .ADC8setcarry\K + add r3,A + add #-Carry,FLAGS +.ADC8setcarry\K: + SetZNjmp A + +.ADC8Decimal\K: + GetCarry + mov #15,r3 + and r3,r2 + and r0,r3 + addc r3,r2 + mov #9,r3 + cmp/gt r3,r2 + bf/s .ADC8less10\K + mov #-16,r3 + add #6,r2 +.ADC8less10\K: + and A,r3 + extu.b r3,r3 + add r3,r2 + mov #-16,r3 + and r0,r3 + add r3,r2 + mov #0x60,r3 + add #0x39,r3 + cmp/gt r3,r2 + bf/s .ADC8Binary\K + mov r2,r3 + add #96,r2 + bra .ADC8Binary\K + mov r2,r3 +.endm + +.macro Adc16 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .ADC16Decimal\K + extu.w A,r2 + mov #Carry,r1 + tst r1, FLAGS + bt/s .ADC16nocarry\K + add r0,r2 + add #1,r2 +.ADC16nocarry\K: + mov r2,r3 +.ADC16Binary\K: + xor r0,r3 + xor A,r0 + mov #Carry|Overflow,r1 + not r0,r0 + or r1,FLAGS + and r3,r0 + exts.w r0,r0 + cmp/pz r0 + bf/s .ADC16setovf\K + extu.w r2,A + add #-Overflow,FLAGS +.ADC16setovf\K: + shlr16 r2 + tst r2,r2 + bf .ADC16setcarry\K + add #-Carry,FLAGS +.ADC16setcarry\K: + Set16ZNjmp A + +.ADC16Decimal\K: + GetCarry + mov #15,r4 + and r4,r2 + mov r0,r3 + and r4,r3 + addc r3,r2 + mov #9,r3 + cmp/gt r3,r2 + bf/s .ADC16less10\K + shll2 r4 + add #6,r2 +.ADC16less10\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov #0x60,r3 + add #0x39,r3 + cmp/gt r3,r2 + bf/s .ADC16less100\K + shll2 r4 + add #96,r2 +.ADC16less100\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov.w .x999\K,r3 + cmp/gt r3,r2 + bf/s .ADC16less1000\K + shll2 r4 + mov.w .n1536\K,r3 + add r3,r2 +.ADC16less1000\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov.w .x9999\K,r3 + extu.w r3,r3 + cmp/gt r3,r2 + bf/s .ADC16Binary\K + mov r2,r3 + mov.w .n24576\K,r3 + add r3,r2 + bra .ADC16Binary\K + mov r2,r3 +.x999\K: + .word 0x999 +.x9999\K: + .word 0x9999 +.n1536\K: + .word 1536 +.n24576\K: + .word 24576 +.endm + .align 2 + +.macro Sbc8 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .SBC8Decimal\K + extu.b A,r2 + mov #Carry,r1 + tst r1, FLAGS + bf/s .SBC8carry\K + sub r0,r2 + add #-1,r2 +.SBC8carry\K: + mov r2,r3 +.SBC8Binary\K: + xor A,r0 + xor A,r3 + mov #Carry|Overflow,r1 + and r3,r0 + or r1,FLAGS + exts.b r0,r0 + cmp/pz r0 + bf/s .SBC8setovf\K + extu.b A,r3 + add #-Overflow,FLAGS +.SBC8setovf\K: + sub r3,A + extu.b r2,r3 + cmp/pz r2 + bt/s .SBC8setcarry\K + add r3,A + add #-Carry,FLAGS +.SBC8setcarry\K: + SetZNjmp A + +.SBC8Decimal\K: + GetNotCarry + mov #15,r3 + and r3,r2 + and r0,r3 + subc r3,r2 + cmp/pz r2 + bt/s .SBC8gt01\K + mov #-16,r3 + add #-6,r2 +.SBC8gt01\K: + and A,r3 + extu.b r3,r3 + add r3,r2 + mov #-16,r3 + and r0,r3 + sub r3,r2 + cmp/pz r2 + bt/s .SBC8Binary\K + mov r2,r3 + add #-96,r2 + bra .SBC8Binary\K + mov r2,r3 +.endm + +.macro Sbc16 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .SBC16Decimal\K + extu.w A,r2 + mov #Carry,r1 + tst r1, FLAGS + bf/s .SBC16carry\K + sub r0,r2 + add #-1,r2 +.SBC16carry\K: + mov r2,r3 +.SBC16Binary\K: + xor A,r0 + xor A,r3 + mov #Carry|Overflow,r1 + and r3,r0 + or r1,FLAGS + exts.w r0,r0 + cmp/pz r0 + bf/s .SBC16setovf\K + extu.w r2,A + add #-Overflow,FLAGS +.SBC16setovf\K: + cmp/pz r2 + bt .SBC16setcarry\K + add #-Carry,FLAGS +.SBC16setcarry\K: + Set16ZNjmp A + +.SBC16Decimal\K: + GetNotCarry + mov #15,r4 + and r4,r2 + mov r0,r3 + and r4,r3 + subc r3,r2 + cmp/pz r2 + bt/s .SBC16gt01\K + shll2 r4 + add #-6,r2 +.SBC16gt01\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16gt02\K + shll2 r4 + add #-96,r2 +.SBC16gt02\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16gt03\K + shll2 r4 + mov.w .n1536\K,r3 + sub r3,r2 +.SBC16gt03\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16Binary\K + mov r2,r3 + mov.w .n24576\K,r3 + extu.w r3,r3 + sub r3,r2 + bra .SBC16Binary\K + mov r2,r3 +.n1536\K: + .word 1536 +.n24576\K: + .word 24576 +.endm + .align 2 + +.macro Ora8 K + or r0,A + SetZNjmp A +.endm + +.macro Ora16 K + or r0,A + Set16ZNjmp A +.endm + +.macro Eor8 K + xor r0,A + SetZNjmp A +.endm + +.macro Eor16 K + xor r0,A + Set16ZNjmp A +.endm + +.macro And8 K + mov #-128,r2 + shll r2 + or r2,r0 + and r0,A + SetZNjmp A +.endm + +.macro And16 K + and r0,A + Set16ZNjmp A +.endm + +.macro Lda8 K + extu.b A,r2 + sub r2,A + add r0,A + SetZNjmp A +.endm + +.macro Lda16 K + mov r0,A + Set16ZNjmp A +.endm + +.macro Ldx8 K + mov.b r0,XL + SetZNjmp r0 +.endm + +.macro Ldx16 K + mov.w r0,XX + Set16ZNjmp r0 +.endm + +.macro Ldy8 K + mov.b r0,YL + SetZNjmp r0 +.endm + +.macro Ldy16 K + mov.w r0,YY + Set16ZNjmp r0 +.endm + +.macro Cmp8 K + extu.b A,r2 + sub r0,r2 + mov #Carry,r1 + cmp/pz r2 + bt/s .Cmp8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Cmp8Carry\K: + SetZNjmp r2 +.endm + +.macro Cmp16 K + extu.w A,r2 + sub r0,r2 + mov #Carry,r1 + cmp/pz r2 + bt/s .Cmp16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Cmp16Carry\K: + Set16ZNjmp r2 +.endm + +.macro Cpx8 K + mov r0,r1 + mov.b XL,r0 + extu.b r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpx8Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpx8Carry\K: + SetZNjmp r0 +.endm + +.macro Cpx16 K + mov r0,r1 + mov.w XX,r0 + extu.w r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpx16Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpx16Carry\K: + Set16ZNjmp r0 +.endm + +.macro Cpy8 K + mov r0,r1 + mov.b YL,r0 + extu.b r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpy8Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpy8Carry\K: + SetZNjmp r0 +.endm + +.macro Cpy16 K + mov r0,r1 + mov.w YY,r0 + extu.w r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpy16Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpy16Carry\K: + Set16ZNjmp r0 +.endm + +.macro Asl8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + mov #-128,r2 + mov #Carry,r1 + tst r2,r0 + bf/s .Asl8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Asl8Carry\K: + shll r0 + mov.l S9xSetByte,r3 + SetZNlink r0 +.endm + +.macro Asl16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + mov #1,r2 + shll r0 + shll16 r2 + mov #Carry,r1 + tst r2,r0 + bf/s .Asl16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Asl16Carry\K: + mov.l S9xSetWord,r3 + Set16ZNlink r0 +.endm + +.macro Lsr8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + tst #1,r0 + mov #Carry,r1 + bf/s .Lsr8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Lsr8Carry\K: + shlr r0 + mov.l S9xSetByte,r3 + SetZNlink r0 +.endm + +.macro Lsr16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + tst #1,r0 + mov #Carry,r1 + bf/s .Lsr16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Lsr16Carry\K: + shlr r0 + mov.l S9xSetWord,r3 + Set16ZNlink r0 +.endm + +.macro Rol8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + GetCarry + mov #1,r2 + rotcl r0 + or r2,FLAGS + shll8 r2 + tst r2,r0 + bf/s .Rol8Carry\K + mov.l S9xSetByte,r3 + add #-Carry,FLAGS +.Rol8Carry\K: + SetZNlink r0 +.endm + +.macro Rol16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + GetCarry + mov #1,r2 + rotcl r0 + or r2,FLAGS + shll16 r2 + tst r2,r0 + bf/s .Rol16Carry\K + mov.l S9xSetWord,r3 + add #-Carry,FLAGS +.Rol16Carry\K: + Set16ZNlink r0 +.endm + +.macro Ror8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + mov #1,r1 + and FLAGS,r1 + shll8 r1 + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Ror8Carry\K: + mov.l S9xSetByte,r3 + SetZNlink r0 +.endm + +.macro Ror16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + mov #1,r1 + and FLAGS,r1 + shll16 r1 + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Ror16Carry\K: + mov.l S9xSetWord,r3 + Set16ZNlink r0 +.endm + +.macro Bit8 K + mov.l S9xGetByte,r3 + jsr @r3 + nop + exts.b r0,r7 + mov #0x40,r2 + shll16 r7 + tst r2,r0 + bf/s .Bit8Ovf\K + or r2,FLAGS + sub r2,FLAGS +.Bit8Ovf\K: + and A,r0 + jmp @r13 + or r0,r7 +.endm + +.macro Bit16 K + mov.l S9xGetWord,r3 + jsr @r3 + nop + mov #0x40,r2 + exts.w r0,r7 + shll8 r2 + sub r0,r7 + tst r2,r0 + shlr8 r2 + bf/s .Bit16Ovf\K + or r2,FLAGS + sub r2,FLAGS +.Bit16Ovf\K: + and A,r0 + jmp @r13 + or r0,r7 +.endm + +.macro Dec8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.l S9xSetByte,r3 + SetZNlink r0 +.endm + +.macro Dec16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.l S9xSetWord,r3 + Set16ZNlink r0 +.endm + +.macro Inc8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.l S9xSetByte,r3 + SetZNlink r0 +.endm + +.macro Inc16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.l S9xSetWord,r3 + Set16ZNlink r0 +.endm + +.macro Sta8 K + mov.l S9xSetByte,r3 + mov A,r0 + Xlink +.endm + +.macro Sta16 K + mov.l S9xSetWord,r3 + mov A,r0 + Xlink +.endm + +.macro Stx8 K + mov.l S9xSetByte,r3 + mov.b XL,r0 + Xlink +.endm + +.macro Stx16 K + mov.l S9xSetWord,r3 + mov.w XX,r0 + Xlink +.endm + +.macro Sty8 K + mov.l S9xSetByte,r3 + mov.b YL,r0 + Xlink +.endm + +.macro Sty16 K + mov.l S9xSetWord,r3 + mov.w YY,r0 + Xlink +.endm + +.macro Stz8 K + mov.l S9xSetByte,r3 + mov #0,r0 + Xlink +.endm + +.macro Stz16 K + mov.l S9xSetWord,r3 + mov #0,r0 + Xlink +.endm + +.macro Trb8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + extu.w r7,r2 + sub r2,r7 + extu.b A,r2 + and r0,r2 + or r2,r7 + sub r2,r0 + mov.l S9xSetByte,r3 + Xlink +.endm + +.macro Trb16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + extu.w r7,r2 + sub r2,r7 + extu.w A,r2 + and r0,r2 + or r2,r7 + sub r2,r0 + mov.l S9xSetWord,r3 + Xlink +.endm + +.macro Tsb8 K + mov.l S9xGetByte,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + extu.w r7,r2 + sub r2,r7 + extu.b A,r2 + and r0,r2 + or r2,r7 + or A,r0 + mov.l S9xSetByte,r3 + Xlink +.endm + +.macro Tsb16 K + mov.l S9xGetWord,r3 + jsr @r3 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + extu.w r7,r2 + sub r2,r7 + extu.w A,r2 + and r0,r2 + or r2,r7 + or A,r0 + mov.l S9xSetWord,r3 + Xlink +.endm + +.macro CheckForIrqjmp K + mov #IRQ,r0 + tst r0,FLAGS + bf .CheckForIrqS9xExit\K +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .CheckForIrqS9xExit\K + mov.l S9xOpcode_IRQ,r3 + Xlink +.CheckForIrqS9xExit\K: + jmp @r13 + nop +.endm + +.macro S9xFixCycles K + mov FLAGS16,r0 + mov #Emulation/4,r1 + shll2 r1 + tst r1,r0 + bt/s .S9xFixCyclesNoEmulation\K + mov.l ICPU,r3 +#ifndef VAR_CYCLES + mov.l .S9xE1M1X1\K,r0 + mov.l r0,@r3 +#endif + mov.l .S9xOpcodesM1X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,@(4,r3) + +.S9xFixCyclesNoEmulation\K: + tst #MemoryFlag,r0 + bt .S9xFixCyclesNoMemory\K + tst #IndexFlag,r0 + bt .S9xFixCyclesNoIndex\K +#ifndef VAR_CYCLES + mov.l .S9xE0M1X1\K,r0 + mov.l r0,@r3 +#endif + mov.l .S9xOpcodesM1X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,@(4,r3) + +.S9xFixCyclesNoIndex\K: +#ifndef VAR_CYCLES + mov.l .S9xE0M1X0\K,r0 + mov.l r0,@r3 +#endif + mov.l .S9xOpcodesM1X0\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,@(4,r3) + +.S9xFixCyclesNoMemory\K: + tst #IndexFlag,r0 + bt .S9xFixCyclesNoIndex2\K +#ifndef VAR_CYCLES + mov.l .S9xE0M0X1\K,r0 + mov.l r0,@r3 +#endif + mov.l .S9xOpcodesM0X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,@(4,r3) +.S9xFixCyclesNoIndex2\K: +#ifndef VAR_CYCLES + mov.l .S9xE0M0X0\K,r0 + mov.l r0,@r3 +#endif + mov.l .S9xOpcodesM0X0\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,@(4,r3) + + .align 2 +.S9xOpcodesM0X0\K: + .long _S9xOpcodesM0X0 +.S9xOpcodesM0X1\K: + .long _S9xOpcodesM0X1 +.S9xOpcodesM1X0\K: + .long _S9xOpcodesM1X0 +.S9xOpcodesM1X1\K: + .long _S9xOpcodesM1X1 +#ifndef VAR_CYCLES +.S9xE0M0X0\K: + .long S9xE0M0X0 +.S9xE0M0X1\K: + .long S9xE0M0X1 +.S9xE0M1X0\K: + .long S9xE0M1X0 +.S9xE0M1X1\K: + .long S9xE0M1X1 +.S9xE1M1X1\K: + .long S9xE1M1X1 + .align 2 +#endif +.S9xFixCyclesS9xExit\K: +.endm + +.macro S9xUnpackStatus K + exts.b FLAGS,r7 + mov #Zero,r0 + shll16 r7 + tst r0,FLAGS + rotcl r7 +.endm + +.macro S9xPackStatus K + cmp/pz r7 + mov #(Negative|Zero)/2,r2 + add r2,r2 + bf/s PackStatusNeg\K + or r2,FLAGS + add #-Negative,FLAGS +PackStatusNeg\K: + extu.w r7,r2 + tst r2,r2 + bt PackStatusZero\K + add #-Zero,FLAGS +PackStatusZero\K: +.endm + +.macro CPUShutdown K +#ifdef CPU_SHUTDOWN + mov.l Settings,r1 + mov.b Shutdown,r0 + extu.b r0,r0 + tst r0,r0 + bt .NoCPUShutdown\K + mov.l WaitAddress,r0 + cmp/eq PC,r0 + bf .NoCPUShutdown\K + mov.l WaitCounter,r0 + tst r0,r0 + bf .CPUShutdownNotYet\K + mov.l Flags,r2 + mov.w .ShutdownMask\K,r1 + tst r2,r1 + bf .CPUShutdownNotYet\K + +#ifdef ARMAPU + mov #0,r2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent, CYCLES +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + jmp @r13 + mov.l r2,WaitAddress +#else + mov.l IAPU,r1 + mov #0,r2 + mov.b APUExecuting,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + extu.b r0,r0 + mov.l NextEvent, CYCLES +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + mov.l r2,WaitAddress + bt .NoCPUShutdown\K + + mov.l ICPU,r1 + mov #0,r0 + mov.l r4,@-r15 + mov.b r0, CPUExecuting +#ifndef USE_OLD_APUEXEC + SAVE_CYCLES + PUSH_REGISTERS + mov.l .S9xApuExecute\K,r1 + jsr @r1 + nop + POP_REGISTERS + LOAD_CYCLES +#else +.CPUShutdownAPUExecLoop\K: +#ifdef SPC700_C + mov.l IAPU,r1 + SAVE_CYCLES + mov.l APUPC,r0 + + PUSH_REGISTERS + mov.b @r0,r0 +#else + mov.b @APUPC,r0 +#endif + mov.l .S9xAPUCycles\K,r1 + extu.b r0,r0 + mov.l .S9xApuOpcodes\K,r2 + shll2 r0 + mov.l @(r0,r1),r4 + mov.l @(r0,r2),r0 + mov.l APU,r1 + mov.l APUCycles,r2 + add r4,r2 + jsr @r0 + mov.l r2,APUCycles +#ifdef SPC700_C + POP_REGISTERS + LOAD_CYCLES +#endif + mov.l APU,r1 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent,r2 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l APUCycles,r3 + cmp/ge r2,r3 + bf .CPUShutdownAPUExecLoop\K +#endif + mov.l ICPU,r1 + mov #1,r0 + mov.l @r15+,r4 + jmp @r13 + mov.b r0, CPUExecuting + + .align 2 +#ifndef USE_OLD_APUEXEC +.S9xApuExecute\K: + .long _S9xApuExecute +#else +.S9xAPUCycles\K: + .long _S9xAPUCycles +.S9xApuOpcodes\K: + .long _S9xApuOpcodes +#endif + .align 2 + +#endif /* ARMAPU */ + + .align 2 +.ShutdownMask\K: + .word NMI_FLAG | IRQ_PENDING_FLAG + .align 2 + +.CPUShutdownNotYet\K: + mov #2,r2 + cmp/hs r2,r0 + bf/s .CPUShutdownDecCounter\K + add #-1,r0 + mov #1,r0 +.CPUShutdownDecCounter\K: + jmp @r13 + mov.l r0,WaitCounter +.NoCPUShutdown\K: + jmp @r13 + nop + .align 2 +#endif +.endm diff --git a/src/sh/asmstruc.h b/src/sh/asmstruc.h new file mode 100644 index 0000000..e4e7877 --- /dev/null +++ b/src/sh/asmstruc.h @@ -0,0 +1,399 @@ +#ifndef _ASMSTRUC_H_ +#define _ASMSTRUC_H_ + +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#if defined(__GCC) +#define S9xTraceMessage _S9xTraceMessage +#define S9xGetPPU _S9xGetPPU +#define S9xSetPPU _S9xSetPPU +#define S9xSetDSP _S9xSetDSP +#define S9xGetDSP _S9xGetDSP +#define S9xGetCPU _S9xGetCPU +#define S9xSetCPU _S9xSetCPU +#define S9xSyncSpeed _S9xSyncSpeed +#define S9xTrace _S9xTrace +#define S9xDoHBlankProcessing _S9xDoHBlankProcessing +#define S9xTraceAPU _S9xTraceAPU +#define S9xGetWord _S9xGetWord +#define memset _memset +#define S9xDoHDMA _S9xDoHDMA +#define S9xStartHDMA _S9xStartHDMA +#define S9xEndScreenRefresh _S9xEndScreenRefresh +#define S9xStartScreenRefresh _S9xStartScreenRefresh +#define S9xSetAPUControl _S9xSetAPUControl +#define S9xSetAPUDSP _S9xSetAPUDSP +#define S9xGetAPUDSP _S9xGetAPUDSP +#define S9xTextMode _S9xTextMode +#define printf _printf +#define S9xSetAPUTimer _S9xSetAPUTimer +#define S9xAPUOPrint _S9xAPUOPrint +#define S9xSuperFXExec _S9xSuperFXExec +#define S9xGenerateSound _S9xGenerateSound +#define S9xUpdateJoypads _S9xUpdateJoypads +#define S9xMainLoop _S9xMainLoop +#define RenderLine _RenderLine +#define S9xSetIRQ _S9xSetIRQ +#define S9xClearIRQ _S9xClearIRQ +#define SA1 _SA1 +#define CPU _CPU +#define ICPU _ICPU +#define Settings _Settings +#define PPU _PPU +#define IPPU _IPPU +#define Registers _Registers +#define Memory _Memory +#define APU _APU +#define IAPU _IAPU +#define APURegisters _APURegisters +#define S9xBreakpoint _S9xBreakpoint +#define missing _missing +#define S9xApuOpcodes _S9xApuOpcodes +#define S9xAPUCycles _S9xAPUCycles +#define S9xMessage _S9xMessage +#define String _String +#define sprintf _sprintf +#define S9xSA1ExecuteDuringSleep _S9xSA1ExecuteDuringSleep + +#define A1 _A1 +#define A2 _A2 +#define A3 _A3 +#define A4 _A4 +#define Work8 _Work8 +#define Work16 _Work16 +#define Work32 _Work32 +#define Int8 _Int8 +#define Int16 _Int16 +#define Int32 _Int32 +#define S9xE1M1X1 _S9xE1M1X1 +#define S9xE0M1X1 _S9xE0M1X1 +#define S9xE0M1X0 _S9xE0M1X0 +#define S9xE0M0X1 _S9xE0M0X1 +#define S9xE0M0X0 _S9xE0M0X0 +#define S9xOpcodesM1X1 _S9xOpcodesM1X1 +#define S9xOpcodesM1X0 _S9xOpcodesM1X0 +#define S9xOpcodesM0X1 _S9xOpcodesM0X1 +#define S9xOpcodesM0X0 _S9xOpcodesM0X0 +#define APUROM _APUROM +#define W1 _W1 +#define W2 _W2 +#define W3 _W3 +#define W4 _W4 +#define ebx_save _ebx_save +#endif + +#define SA1REG r1 +#include "offsets.h" + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define DEBUG_MODE_FLAG (1 << 0) +#define TRACE_FLAG (1 << 1) +#define SINGLE_STEP_FLAG (1 << 2) +#define BREAK_FLAG (1 << 3) +#define SCAN_KEYS_FLAG (1 << 4) +#define SAVE_SNAPSHOT_FLAG (1 << 5) +#define DELAYED_NMI_FLAG (1 << 6) +#define NMI_FLAG (1 << 7) +#define PROCESS_SOUND_FLAG (1 << 8) +#define FRAME_ADVANCE_FLAG (1 << 9) +#define DELAYED_NMI_FLAG2 (1 << 10) +#define IRQ_PENDING_FLAG (1 << 11) + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT 12 +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) + +#define CYCLES r10 +#define PC r9 + +#ifndef USE_ASM_R12 +#if 1 +#undef PB +#define PB r12 +#define USE_REGISTER_AS_PB +#else +#define USE_REGISTER_LEFT_TIMESLICE r12 +#endif +#endif + +#ifndef USE_ASM_R5 +#if 0 +#undef DB +#define DB r5 +#define USE_REGISTER_AS_DB +#else +#define USE_REGISTER_LEFT_TIMESLICE r5 +#endif +#endif + +#ifdef SPC700_C +#define APUPC APUPCS +#else +#error AUN_NO_IMPLEMENTADO_SPC700_ASM +#define APUPC r12 +#endif + +#define FLAGS r6 +#define FLAGS16 r6 + +#define A r8 + +#define LOAD_CYCLES mov.l Cycles, CYCLES +#define SAVE_CYCLES mov.l CYCLES, Cycles + +.macro SETUP_PREDEF + mova .misc,r0 + mov.l @r0+,r11 +#ifdef USE_ASM_R12 + mov.l @r0+,r12 +#endif + mov.l @r0+,r13 + mov r0,r14 +.endm + +.macro MISC + .align 2 +.misc: + .long _Registers +#ifdef USE_ASM_R12 + .long _CPU +#endif + .long MainAsmLoop + + .long 0 + .long S9xGetByte_r + .long S9xSetByte_r + .long S9xGetWord_r + .long S9xSetWord_r + .long S9xOpcode_IRQ_r + .long S9xOpcode_NMI_r + .long S9xSetPCBase_r + .long _ICPU +#ifdef ARMAPU + .long 0 + .long 0 +#else + .long _IAPU + .long _APU +#endif + .long _SA1 +#ifdef ARMAPU + .long 0 +#else + .long _APURegisters +#endif + .long _Settings + .long _IPPU + .long _PPU + .align 2 +.endm + +.macro LOAD_REGISTERS K + LOAD_CYCLES + mov.l PCS, PC +#ifndef SPC700_C + mov.l IAPU, r1 + mov.l APUPCS, APUPC +#endif + mov.w PP, r0 + mov r0, FLAGS16 +#ifdef USE_REGISTER_AS_DB + mov.b DBMEM, r0 + extu.b r0,DB +#endif + mov.w AA, r0 + extu.w r0, A +#ifdef USE_REGISTER_AS_PB + mov.b PBMEM, PB + extu.b PB,PB +#endif + S9xUnpackStatus \K +.endm + +.macro STORE_REGISTERS_i K + S9xPackStatus \K + SAVE_CYCLES + mov.l PC, PCS +#ifndef SPC700_C + mov.l IAPU, r1 + mov.l APUPC, APUPCS +#endif + mov FLAGS16, r0 + mov.w r0,PP +#ifdef USE_REGISTER_AS_PB + mov.b PB, PBMEM +#endif +#ifdef USE_REGISTER_AS_DB + mov DB, r0 + mov.b r0, DBMEM +#endif + mov A,r0 +#ifndef ASMSTRUC_NOP_PATCH + mov.w r0,AA +#endif +.endm + +.macro STORE_REGISTERS_f K +#ifndef ASMSTRUC_NOP_PATCH + nop +#else + mov.w r0,AA +#endif +.endm + +.macro STORE_REGISTERS K + STORE_REGISTERS_i \K +#ifdef ASMSTRUC_NOP_PATCH + STORE_REGISTERS_f +#endif +.endm + +.macro PUSH_REGISTERS_i + mov.l r6,@-r15 +#ifndef USE_ASM_R5 + mov.l r5,@-r15 +#endif +#ifndef ASMSTRUC_NOP_PATCH + mov.l r7,@-r15 +#endif +.endm + +.macro PUSH_REGISTERS_f +#ifndef ASMSTRUC_NOP_PATCH + nop +#else + mov.l r7,@-r15 +#endif +.endm + +.macro PUSH_REGISTERS + PUSH_REGISTERS_i +#ifdef ASMSTRUC_NOP_PATCH + PUSH_REGISTERS_f +#endif +.endm + +.macro POP_REGISTERS_i + mov.l @r15+,r7 +#ifndef USE_ASM_R5 + mov.l @r15+,r5 +#endif +#ifndef ASMSTRUC_NOP_PATCH + mov.l @r15+,r6 +#endif +.endm + +.macro POP_REGISTERS_f +#ifndef ASMSTRUC_NOP_PATCH + nop +#else + mov.l @r15+,r6 +#endif +.endm + +.macro POP_REGISTERS + POP_REGISTERS_i +#ifdef ASMSTRUC_NOP_PATCH + POP_REGISTERS_f +#endif +.endm + + +#endif diff --git a/src/sh/cpuexec.S b/src/sh/cpuexec.S new file mode 100644 index 0000000..ecb2a03 --- /dev/null +++ b/src/sh/cpuexec.S @@ -0,0 +1,1391 @@ +/*** Renesas SH assembler ***************************************************** + SH assembler code partly based on x86 assembler code + + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) +******************************************************************************/ + +/****************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +******************************************************************************/ +.text +.little +#include "asmstruc.h" +#include "asmops.h" +#include "spcops.h" +#include "aputimer.h" + +#ifdef USE_OPC_ASM_MIXTO +.extern _S9xDoHBlankProcessing +#endif + +.macro RUN_CPU + mov.l ICPU,r1 +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed, r2 + mov.b @PC,r0 + add r2,CYCLES + extu.b r0,r0 +#else + mov.b @PC,r0 + add #8,CYCLES + extu.b r0,r0 +#endif +#else + mov.b @PC,r0 + mov.l CPUSpeed,r4 + extu.b r0,r0 + mov.b @(r0,r4),r2 + add r2,CYCLES +#endif + mov.l CPUOpcodes,r2 + shll2 r0 + mov.l @(r0,r2),r0 +#ifdef CPU_SHUTDOWN + mov.l PC, PCAtOpcodeStart +#endif + jmp @r0 + add #1,PC +.endm + + + +.globl MainAsmLoop + +.text + .align 5 +.globl _S9xMainLoop +_S9xMainLoop: + mov.l r14,@-r15 + sts.l pr,@-r15 + mov.l r13,@-r15 + mov.l r12,@-r15 + mov.l r11,@-r15 + mov.l r10,@-r15 + mov.l r9,@-r15 + mov.l r8,@-r15 + SETUP_PREDEF + LOAD_REGISTERS MainLoop +#ifndef USE_REGISTER_LEFT_TIMESLICE + mov.l _snes4all_timeslice,r1 + mova left_timeslice,r0 + bra .L9 + mov.l r1,@r0 +#else + mov.l _snes4all_timeslice, USE_REGISTER_LEFT_TIMESLICE + bra .L9 + nop +#endif + + .align 5 +MainAsmLoop: +#ifndef USE_REGISTER_LEFT_TIMESLICE + mova left_timeslice,r0 + mov.l @r0,r1 + add #-1,r1 + tst r1,r1 + bt/s .L8 + mov.l r1,@r0 + + RUN_CPU +.L8: + mov.l _snes4all_timeslice,r1 + mov.l r1,@r0 +#else + add #-1, USE_REGISTER_LEFT_TIMESLICE + tst USE_REGISTER_LEFT_TIMESLICE, USE_REGISTER_LEFT_TIMESLICE + bt .L8 + RUN_CPU +.L8: +#endif + extu.b r0,r0 + mov.l SA1,r1 + mov.b SA1Executing,r0 + tst r0,r0 + bt .nosa1 + STORE_REGISTERS_i MAL1 + mov.l .S9xSA1MainLoop,r3 + jsr @r3 + STORE_REGISTERS_f + LOAD_REGISTERS MAL1 +.nosa1: +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + + cmp/ge r0,CYCLES + bf .L9 + STORE_REGISTERS_i MAL2 +#ifdef USE_OPC_ASM_MIXTO +#ifdef ASMSTRUC_NOP_PATCH + STORE_REGISTERS_f +#endif + UPDATE_APUTIMER _1 + mov.l ._S9xDoHBlankProcessing,r0 + jsr @r0 + nop +#else +#ifndef USE_ALWAYS_APU_SYNC + mov.l .S9xApuExecute,r1 + jsr @r1 + STORE_REGISTERS_f + bsr S9xDoHBlankProcessing + nop +#else + bsr S9xDoHBlankProcessing + STORE_REGISTERS_f +#endif +#endif + LOAD_REGISTERS MAL2 + +.L9: +#ifndef USE_ALWAYS_APU_SYNC + mov.l _snes4all_sound_enable,r0 + mov #1,r1 + cmp/hi r1,r0 + bf .L12 +#endif +#ifndef ARMAPU + extu.b r0,r0 + mov.l IAPU,r1 + mov.b APUExecuting,r0 + tst r0,r0 + bt .L12 + +#ifndef USE_OLD_APUEXEC + mov.l APU,r1 + mov.l APUCycles,r0 + cmp/gt CYCLES,r0 + bt .L12 + + SAVE_CYCLES + PUSH_REGISTERS + mov.l .S9xApuExecute,r0 + jsr @r0 + nop + POP_REGISTERS + LOAD_CYCLES +#else + +.apuloop: + mov.l APU,r1 + mov.l APUCycles,r0 + cmp/gt CYCLES,r0 + bt .L12 +#ifdef SPC700_C + mov.l IAPU,r1 + SAVE_CYCLES + mov.l APUPC,r0 + + PUSH_REGISTERS + mov.b @r0,r0 +#else + mov.b @APUPC,r0 +#endif + mov.l .S9xAPUCycles,r1 + extu.b r0,r0 + mov.l .S9xApuOpcodes,r2 + shll2 r0 + mov.l @(r0,r1),r4 + mov.l @(r0,r2),r0 + mov.l APU,r1 + mov.l APUCycles,r2 + add r4,r2 + + jsr @r0 + mov.l r2,APUCycles +#ifdef SPC700_C + POP_REGISTERS + + bra .apuloop + LOAD_CYCLES +#else + bra .apuloop + nop +#endif +#endif + + .align 2 +#endif /* ARMAPU */ + +.L12: + mov.l Flags,r0 + tst r0,r0 + bt .L15 + tst #128,r0 + bt .NO_NMI + mov.l NMICycleCount,r1 + dt r1 + bf/s .NO_NMI + mov.l r1,NMICycleCount + add #-NMI_FLAG,r0 + mov.l r0,Flags + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .L17 + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + add #1,PC +.L17: + mov.l S9xOpcode_NMI,r0 + jsr @r0 + nop + mov.l Flags,r0 +.NO_NMI: + mov.l .pIRQ_PENDING_FLAG,r1 + tst r1, r0 + bt .L15 + mov.l IRQCycleCount,r0 + tst r0,r0 + bf/s .DEC_IRQ_CYCLE_COUNT + add #-1,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + extu.b r0,r0 + tst r0,r0 + bt .NOT_WAITING + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + add #1,PC +.NOT_WAITING: +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .CLEAR_PENDING_IRQ_FLAG + /* XXX: test for Settings.DisableIRQ */ + mov #IRQ,r0 + tst r0,FLAGS + bf .L15 + mov.l S9xOpcode_IRQ,r3 + jsr @r3 + nop + bra .L15 + nop +.CLEAR_PENDING_IRQ_FLAG: + mov.l Flags,r0 + mov.l .nIRQ_PENDING_FLAG,r1 + and r1,r0 + bra .L15 + mov.l r0,Flags + + .align 2 +#ifndef USE_REGISTER_LEFT_TIMESLICE +.global left_timeslice +left_timeslice: + .long 0 +#endif +._S9xDoHBlankProcessing: + .long _S9xDoHBlankProcessing +#ifdef USE_OPC_ASM_MIXTO +.S9xUpdateAPUTimer_CONST00002710: + .long 0x00002710 +.S9xUpdateAPUTimer_CONST003334bb: + .long 0x003334bb +.S9xUpdateAPUTimer_APUTimer_ptr: + .long _APU+APUTimer +.S9xUpdateAPUTimer_CONST000000ff: + .long 0x000000ff +.S9xUpdateAPUTimer_CONST000000fd: + .long 0x000000fd +.S9xUpdateAPUTimer_CONST000000fe: + .long 0x000000fe +#endif +.pIRQ_PENDING_FLAG: + .long IRQ_PENDING_FLAG +.nIRQ_PENDING_FLAG: + .long ~IRQ_PENDING_FLAG + + + .align 2 +.DEC_IRQ_CYCLE_COUNT: + mov.l r0,IRQCycleCount + +.L15: +#ifdef USE_REGISTER_LEFT_TIMESLICE + mov.l _snes4all_timeslice, USE_REGISTER_LEFT_TIMESLICE +#else + mov.l _snes4all_timeslice,r1 +#endif + mov.l Flags,r0 + tst r0,r0 + bt .L16 +#ifdef USE_REGISTER_LEFT_TIMESLICE + mov #1, USE_REGISTER_LEFT_TIMESLICE +#else + mov #1, r1 +#endif + +.L16: +#ifndef USE_REGISTER_LEFT_TIMESLICE + mova left_timeslice,r0 + mov.l r1,@r0 +#endif + RUN_CPU + + .align 2 +.globl _snes4all_timeslice +_snes4all_timeslice: .long 4 +.S9xSA1MainLoop: + .long _S9xSA1MainLoop + + .align 2 + +#ifndef ARMAPU +#ifdef USE_OLD_APUEXEC +.S9xAPUCycles: + .long _S9xAPUCycles +.S9xApuOpcodes: + .long _S9xApuOpcodes +#ifndef USE_ALWAYS_APU_SYNC +.S9xApuExecute: + .long _S9xApuExecute +#endif +#else +.S9xApuExecute: + .long _S9xApuExecute +#endif +#endif /* ARMAPU */ +#ifndef USE_ALWAYS_APU_SYNC +.global _snes4all_sound_enable +_snes4all_sound_enable: +#if defined(DEBUG_TILECACHE) || defined(PROFILER_SNES4ALL) + .long 0 +#else + .long 1 +#endif +#endif + + .align 2 + +#ifndef USE_OPC_ASM_MIXTO +.globl _S9xDoHBlankProcessing +_S9xDoHBlankProcessing: + mov.l r14,@-r15 + mov.l r13,@-r15 + sts.l pr,@-r15 + mov.l r12,@-r15 + mov.l r11,@-r15 + SETUP_PREDEF + bsr S9xDoHBlankProcessing + nop + mov.l @r15+,r11 + mov.l @r15+,r12 + lds.l @r15+,pr + mov.l @r15+,r13 + rts + mov.l @r15+,r14 +#endif + + MISC + +#ifndef USE_OPC_ASM_MIXTO +S9xDoHBlankProcessing: + sts.l pr,@-r15 + +#ifndef USE_OLD_APUTIMER + UPDATE_APUTIMER _1 +#endif + +#ifdef CPU_SHUTDOWN + mov.l WaitCounter,r1 +#endif +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WhichEvent,r0 + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +#ifdef CPU_SHUTDOWN + add #1,r1 +#endif + tst r0,r0 +#ifdef CPU_SHUTDOWN + mov.l r1,WaitCounter +#endif + bt/s .hblank_start + cmp/eq #1,r0 + bt/s .hblank_end + mov #3,r1 + cmp/hi r1,r0 + bt .reschedule + +!.htimer_trigger: + mov.l PPU,r1 + mov.b HTimerEnabled,r0 + tst r0,r0 + bt .reschedule + mov.b VTimerEnabled,r0 + tst r0,r0 + bt .L191 + mov.w IRQVBeamPos,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r3 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmp/eq r0,r3 + bf .reschedule +.L191: +#ifndef USE_ASM_IRQ_INLINE + bsr _S9xSetIRQ + mov #1,r4 +#else +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 + mov #3,r1 + or #1,r0 + mov.b r0,IRQActive +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l r1,IRQCycleCount + mov.l Flags,r2 + mov.l .pIRQ_PENDING_FLAG20,r0 + or r0,r2 + mov.l r2,Flags +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .reschedule + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l PCS,r1 + mov.l r0,IRQCycleCount + add #1,r1 + mov.l r1,PCS +#endif + + bra .reschedule + nop + +#ifdef USE_ASM_IRQ_INLINE + .align 2 +.pIRQ_PENDING_FLAG20: + .long IRQ_PENDING_FLAG +#endif + +.hblank_start: + mov.l IPPU,r1 + mov.b HDMA,r0 + extu.b r0,r4 + tst r4,r4 + bt .reschedule + mov.l PPU,r1 + mov.w ScreenHeight,r0 + extu.w r0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r1 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmp/hi r0,r1 + bt .reschedule + mov.l .S9xDoHDMA,r3 + jsr @r3 + nop + mov.l IPPU,r1 + mov.b r0,HDMA + +.reschedule: +#ifndef USE_HDMA_EVENT + mov.l IPPU,r1 + mov.b HDMA,r0 + extu.b r0,r5 +#endif +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WhichEvent,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + extu.b r0,r0 + tst r0,r0 + bt/s .next_is_hblank_end + mov.l Settings,r1 + cmp/eq #3,r0 +#ifdef USE_HDMA_EVENT + bf .next_is_hblank_start +#else + bt .next_is_hblank_end + tst r5,r5 + bf .next_is_hblank_start +#endif +.next_is_hblank_end: + mov #1,r4 + bra .skip + mov.l H_Max,r5 +/* AQUI NO ES NECESARIO CAMBIAR R5? */ +.next_is_hblank_start: + mov #0,r4 + mov.l HBlankStart,r5 +.skip: + mov.l PPU,r1 + mov.b HTimerEnabled,r0 + tst r0,r0 + bt .not_enabled + mov.w HTimerPosition,r0 + cmp/ge r5,r0 + bt .not_enabled +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent,r3 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov r0,r6 + cmp/gt r3,r0 + bf .not_enabled + mov.b VTimerEnabled,r0 + extu.b r0,r0 + tst r0,r0 + bt .enabled + mov.w IRQVBeamPos,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r2 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmp/eq r0,r2 + bf .not_enabled +.enabled: + mov.l Settings,r1 + mov #2,r4 + mov.l HBlankStart,r0 + cmp/gt r6,r0 + bt/s .before + mov r6,r5 + mov #3,r4 +.before: +.not_enabled: + mov r4,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l r5,NextEvent +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + lds.l @r15+,pr +#ifdef USE_ASM_R12 + rts + mov.b r0,WhichEvent +#else + add #16,r11 + mov.b r0,WhichEvent + rts + add #-16,r11 +#endif + +.hblank_end: + mov.l Settings,r1 + add #80, r1 +//mov.b SuperFXEnabled,r3 + mov.b @r1,r3 + extu.b r3,r3 + tst r3,r3 + bt .nofx + mov.l .S9xSuperFXExec,r3 + jsr @r3 + nop +.nofx: +#ifndef USE_SOUND_DESYNC + mova .cuenta_sound_throttle, r0 + mov.l @r0, r2 + add #-1, r2 + tst r2,r2 + bt/s .nosoundsync + mov.l r2,@r0 + + mov.l _snes4all_sound_throttle, r2 + mov.l .S9xGenerateSound,r3 + jsr @r3 + mov.l r2,@r0 +#endif + +.nosoundsync: + mov.l Settings,r1 + mov.l Cycles,r0 + mov.l H_Max,r2 + sub r2,r0 + mov.l r0,Cycles +#ifndef ARMAPU + mov.l IAPU,r1 + +#ifndef USE_OLD_APUTIMER + mov.l NextAPUTimerPos,r0 + mov.l _snes4all_apu_hmax, r3 + sub r3,r0 + mov.l r0,NextAPUTimerPos +#endif + mov.b APUExecuting,r0 + extu.b r0,r0 + tst r0,r0 + bt/s .apunotrunning + mov.l APU,r1 + mov.l APUCycles,r0 + sub r2,r0 + +.apunotrunning: + mov.l r0,APUCycles +.apucycleskip: +#endif + mov.l ICPU,r1 + mov.l Scanline,r2 + add #1,r2 + mov.l r2,Scanline + mov #-1,r2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l r2,NextEvent +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + + mov.l PPU,r1 + mov.l ._snes4all_vcounter,r2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r0 + add r0,r0 + mov.w @(r0,r2),r0 + extu.w r0,r0 + mov.l r0,V_Counter +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + + mov.l _snes4all_max_vcounter,r3 + cmp/hi r3,r0 + bf .L162 + +#ifdef USE_OLD_SYNC_SPEED +!.ntsc_tv: + mov.l PPU,r1 + mov.w SavedOAMAddr,r0 + mov.w r0,OAMAddr + mov #0,r0 + mov.b r0,OAMFlip +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,NMIActive + mov.l r0,V_Counter +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +#endif + mov.l .S9xSyncSpeed2,r3 + jsr @r3 + nop + + mov.l _savestate_state,r0 + tst r0,r0 + bt .L161 + mov.l PCBase,r0 + neg r0,r0 + add PC,r0 + mov.w r0,PCR +#ifdef SPC700_C + mov.l IAPU,r1 + mov.l APUPC, r0 + mov.l APURAM, r1 + sub r1,r0 + mov.l APURegisters,r1 + mov.w r0,APUPCR +#else + mov.l APURAM,r1 + sub r1,APUPC + mov.w APUPC, APUPCR +#endif + APUS9xPackStatus SSProc2 + mov.l .S9xSaveStateProcess,r3 + jsr @r3 + nop +.L161: + mov.l PPU,r1 + mov.b VTimerEnabled,r0 + extu.b r0,r0 + tst r0,r0 + bt .L165 + mov.b HTimerEnabled,r0 + tst r0,r0 + bf .L165 + mov.w IRQVBeamPos,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r2 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmp/eq r0,r2 + bf .L165 +#ifndef USE_ASM_R12 + add #16,r11 +#endif +#ifdef USE_OLD_SYNC_SPEED + mov.b IRQActive,r0 + or #2,r0 + mov.b r0,IRQActive + mov.b WaitingForInterrupt,r0 + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .L163 + mov.l PCS,r0 + add #1,r0 + mov.l r0,PCS + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +#endif +.L163: +#ifndef USE_ASM_IRQ_INLINE + bsr _S9xSetIRQ + mov #2,r4 +#else +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 + mov #3,r1 + or #2,r0 + mov.b r0,IRQActive +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l r1,IRQCycleCount + mov.l Flags,r2 + mov.l .pIRQ_PENDING_FLAG21,r0 + or r0,r2 + mov.l r2,Flags +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .L165 + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l PCS,r1 + mov.l r0,IRQCycleCount + add #1,r1 + mov.l r1,PCS +#endif + bra .L165 + nop +.L162: + mov.l PPU,r1 + mov.w ScreenHeight,r0 + extu.w r0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r2 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + add #1,r0 + cmp/eq r0,r2 + bf .L161 + + mov.l .S9xEndScreenRefresh,r0 + jsr @r0 + nop + +#ifdef USE_OLD_END_REFRESH + mov.l PPU,r1 + mov #0,r0 + mov.b r0,FirstSprite + mov.b Brightness,r0 + mov.l IPPU,r1 + mov.b r0,MaxBrightness + mov #0,r0 + mov.b r0,HDMA + mov.l .FillRAM0,r0 + mov.w .nx2100,r2 + mov.b @(r0,r2),r3 + shll r2 + shll r3 + mov.l PPU,r1 + shlr8 r3 + mov #1,r0 + and r3,r0 + mov.b r0,ForcedBlanking + mov.l .FillRAM0,r0 + mov.b @(r0,r2),r3 + add #0x10,r2 + cmp/pz r3 + mov #0x80,r3 + bt/s .L161 + mov.b r3,@(r0,r2) + mov.l Flags,r0 + or #NMI_FLAG,r0 + mov.l r0,Flags + mov #NMITriggerPoint_offs,r0 +#ifdef USE_ASM_R12 + mov.l @(r0,r12),r2 +#else + mov.l @(r0,r11),r2 +#endif + mov #1,r0 + mov.l r2,NMICycleCount +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,NMIActive +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +#endif + bra .L161 + nop +.L165: +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmp/eq #1,r0 + bf .L177 +#ifndef USE_OLD_START_REFRESH + mov.l .S9xStartScreenRefresh,r3 + jsr @r3 + nop +#else + mov.l .S9xUpdateJoypads,r3 + jsr @r3 + nop + mov.l .FillRAM0,r3 + mov #2,r2 + mov.w .n4210,r1 + mov.l Flags,r0 + add r1,r3 + mov.b r2,@r3 + or #NMI_FLAG,r0 + mov.l .S9xStartScreenRefresh,r3 + add #-NMI_FLAG,r0 + jsr @r3 + mov.l r0,Flags +#endif +.L177: +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r3 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l PPU,r1 + tst r3,r3 + bt .L178 + mov.w ScreenHeight,r0 + extu.w r0,r0 + add #1,r0 + cmp/ge r0,r3 + bt .L178 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l .RenderLine,r3 + add #-1,r0 + jsr @r3 + extu.b r0,r4 + +.L178: +#ifndef USE_OLD_APUTIMER + bra .reschedule + nop +#else +#ifndef ARMAPU + mov.l .APUTimer_ptr,r2 + mov.l IAPU,r1 + mov.b @(APUTimerEnabled - APUTimer + 2,r2),r0 + extu.b r0,r0 + tst r0,r0 + bt .L179 + mov.w @(4,r2),r0 + add #4,r0 + mov.w r0,@(4,r2) + extu.w r0,r3 + mov.w @(APUTimerTarget - APUTimer + 4,r2),r0 + extu.w r0,r0 + cmp/hs r0,r3 + bf .L179 +.L182: + mov.w .n255,r0 + extu.w r0,r0 + mov.l APURAM,r3 + add r0,r3 + mov.b @r3,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r3 + mov.w @(APUTimerTarget - APUTimer + 4,r2),r0 + extu.w r0,r3 + mov.w @(4,r2),r0 +#ifdef SPC700_SHUTDOWN + mov.l APUWaitCounter,r4 + sub r3,r0 + add #1,r4 + mov.w r0,@(4,r2) + extu.w r0,r0 + mov.l r4,APUWaitCounter + cmp/hs r3,r0 + mov #1,r0 + bt/s .L182 + mov.b r0,APUExecuting +#else + sub r3,r0 + mov.w r0,@(4,r2) + extu.w r0,r0 + cmp/hs r3,r0 + bt .L182 +#endif +.L179: +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l V_Counter,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst #1,r0 + bt 1f + mov.b @(APUTimerEnabled - APUTimer,r2),r0 + extu.b r0,r0 + tst r0,r0 + bt .L185 + mov.w @r2,r0 + add #1,r0 + mov.w r0,@r2 + mov r0,r3 + mov.w @(APUTimerTarget - APUTimer,r2),r0 + cmp/hs r0,r3 + bf .L185 + mov.w .n253,r0 + mov.l APURAM,r3 + add r0,r3 + mov.b @r3,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r3 +#ifdef SPC700_SHUTDOWN + mov.l APUWaitCounter,r3 + mov #0,r0 + add #1,r3 + mov.w r0,@r2 + add #1,r0 + mov.l r3,APUWaitCounter + mov.b r0,APUExecuting +#else + mov #0,r0 + mov.w r0,@r2 +#endif +.L185: + mov.b @(APUTimerEnabled - APUTimer + 1,r2),r0 + extu.b r0,r0 + tst r0,r0 + bt 1f + mov.w @(2, r2),r0 + add #1,r0 + mov.w r0,@(2, r2) + mov r0,r3 + mov.w @(APUTimerTarget - APUTimer + 2,r2),r0 + cmp/hs r0,r3 + bf 1f + mov.w .n254,r0 + mov.l APURAM,r3 + add r0,r3 + mov.b @r3,r0 + add #1,r0 + and #15,r0 + mov.b r0,@r3 +#ifdef SPC700_SHUTDOWN + mov.l APUWaitCounter,r3 + mov #0,r0 + add #1,r3 + mov.w r0,@(2,r2) + add #1,r0 + mov.l r3,APUWaitCounter + bra .reschedule + mov.b r0,APUExecuting +#else + mov #0,r0 + bra .reschedule + mov.w r0,@(2,r2) +#endif +#endif +1: +#endif + bra .reschedule + nop + + .align 2 +#ifdef USE_ASM_IRQ_INLINE +.pIRQ_PENDING_FLAG21: + .long IRQ_PENDING_FLAG +#endif + +.S9xDoHDMA: + .long _S9xDoHDMA +.S9xSuperFXExec: + .long _S9xSuperFXExec +#ifndef USE_SOUND_DESYNC +.S9xGenerateSound: + .long _S9xGenerateSound +#endif + +//.S9xStartHDMA: +// .long _S9xStartHDMA +.S9xEndScreenRefresh: + .long _S9xEndScreenRefresh +#if defined(USE_OLD_END_REFRESH) || defined(USE_OLD_START_REFRESH) +.FillRAM0: + .long FillRAM +#endif +#ifdef USE_OLD_START_REFRESH +.S9xUpdateJoypads: + .long _S9xUpdateJoypads +#endif +.S9xStartScreenRefresh: + .long _S9xStartScreenRefresh +.RenderLine: + .long _RenderLine +#ifdef USE_OLD_START_REFRESH +.n4210: + .word 0x4210 +#endif +#ifdef USE_OLD_END_REFRESH +.nx2100: + .word 0x2100 +#endif +.n253: + .word 253 +.n254: + .word 254 +.n255: + .word 255 +.n262: + .word 262 +.n312: + .word 312 + + .align 2 +.global _snes4all_sound_throttle +_snes4all_sound_throttle: + .long 1 +.cuenta_sound_throttle: + .long 1 +.S9xUpdateAPUTimer_CONST00002710: + .long 0x00002710 +.S9xUpdateAPUTimer_CONST003334bb: + .long 0x003334bb +.S9xUpdateAPUTimer_APUTimer_ptr: + .long _APU+APUTimer +.S9xUpdateAPUTimer_CONST000000ff: + .long 0x000000ff +.S9xUpdateAPUTimer_CONST000000fd: + .long 0x000000fd +.S9xUpdateAPUTimer_CONST000000fe: + .long 0x000000fe +#endif + +.S9xSyncSpeed2: + .long _S9xSyncSpeed +.global _savestate_state +_savestate_state: + .long 0 +.S9xSaveStateProcess: + .long _S9xSaveStateProcess + +#ifndef ARMAPU +.APUTimer_ptr: + .long _APU+APUTimer +#endif + +._snes4all_vcounter: + .long _snes4all_vcounter +.global _snes4all_max_vcounter +_snes4all_max_vcounter: + .long 343 +.global _snes4all_apu_hmax +_snes4all_apu_hmax: + .long 1 + + .align 2 +.globl _S9xSetIRQ +_S9xSetIRQ: +#ifdef USE_ASM_R12 + mov.l r12,@-r15 + mov.l ._CPU,r12 +#else + mov.l r11,@-r15 + mov.l ._Registers,r11 + add #16,r11 +#endif + mov.b IRQActive,r0 + mov #3,r1 + or r4,r0 + mov.b r0,IRQActive +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l r1,IRQCycleCount + mov.l Flags,r2 + mov.l .pIRQ_PENDING_FLAG2,r0 + or r0,r2 + mov.l r2,Flags +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .NoIncPC + mov #0,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l PCS,r1 + mov.l r0,IRQCycleCount + add #1,r1 + mov.l r1,PCS +.NoIncPC: + rts +#ifdef USE_ASM_R12 + mov.l @r15+,r12 +#else + mov.l @r15+,r11 +#endif + + + .align 2 +.globl _S9xClearIRQ +_S9xClearIRQ: +#ifdef USE_ASM_R12 + mov.l r12,@-r15 + mov.l ._CPU,r12 +#else + mov.l r11,@-r15 + mov.l ._Registers,r11 + add #16,r11 +#endif + not r4,r3 + mov.b IRQActive,r0 + and r3,r0 + mov.b r0,IRQActive + extu.b r0,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .irqsstillpending + mov.l .nIRQ_PENDING_FLAG2,r0 + mov.l Flags,r2 + and r0,r2 + mov.l r2,Flags +.irqsstillpending: + rts +#ifdef USE_ASM_R12 + mov.l @r15+,r12 +#else + mov.l @r15+,r11 +#endif + + .align 2 +#ifdef USE_ASM_R12 +._CPU: + .long _CPU +#else +._Registers: + .long _Registers +#endif +.pIRQ_PENDING_FLAG2: + .long IRQ_PENDING_FLAG +.nIRQ_PENDING_FLAG2: + .long ~IRQ_PENDING_FLAG + + .align 2 +/* +.global _APU +_APU: + .rept (224/4) + .long 0 + .endr + .align 2 +.global _IAPU +_IAPU: + .rept (68/4) + .long 0 + .endr + .align 2 +*/ +/* +.global _APURegisters +_APURegisters: + .rept (8/4) + .long 0 + .endr + .align 2 +*/ diff --git a/src/sh/cpumem.S b/src/sh/cpumem.S new file mode 100644 index 0000000..3c2c406 --- /dev/null +++ b/src/sh/cpumem.S @@ -0,0 +1,232 @@ +.text +.little +.section .bss +#ifndef USE_MMU + .align 5 +#else + .align 12 +#endif +.global _CMemory_RAM, CMemory_RAM +CMemory_RAM: +_CMemory_RAM: + .zero 0x20000 +.global _CMemory_SRAM, CMemory_SRAM +CMemory_SRAM: +_CMemory_SRAM: + .zero 0x20000 +.global _CMemory_VRAM, CMemory_VRAM +CMemory_VRAM: +_CMemory_VRAM: + .zero 0x10000 +.global _CMemory_BSRAM, CMemory_BSRAM +CMemory_BSRAM: +_CMemory_BSRAM: + .zero 0x80000 +.global _CMemory_FillRAM, CMemory_FillRAM +CMemory_FillRAM: +_CMemory_FillRAM: + .zero 0x600000+0x200+0x8000 +.global __IPPU_TileCache_2_ +__IPPU_TileCache_2_: + .zero 4096*128 +.global __IPPU_TileCache_4_ +__IPPU_TileCache_4_: + .zero 2048*128 +.global __IPPU_TileCache_8_ +__IPPU_TileCache_8_: + .zero 1024*128 +.global __IPPU_TileCached_2_ +__IPPU_TileCached_2_: + .zero 4096 +.global __IPPU_TileCached_4_ +__IPPU_TileCached_4_: + .zero 2048 +.global __IPPU_TileCached_8_ +__IPPU_TileCached_8_: + .zero 1024 +.global _S9xAPUCycles +_S9xAPUCycles: + .zero 1024 +.global _Registers +_Registers: + .zero 16 +.global _CPU +_CPU: + .zero 76 + .align 2 +.global _ICPU +_ICPU: + .zero 36 + .align 2 +.global _Settings +_Settings: + .zero 148 + .align 2 +.global _IAPU +_IAPU: + .zero 68 + .align 2 +.global _APURegisters +_APURegisters: + .rept (8/4) + .long 0 + .endr + .align 2 +.global _APU +_APU: + .zero 224 + .align 2 +.global _IPPU +_IPPU: + .zero 4340 + .align 2 +.global _PPU +_PPU: + .zero 2776 + .align 2 +.global _SA1 +_SA1: + .zero 32848 + .align 2 +.global _snes4all_vcounter +_snes4all_vcounter: + .zero 1024 + .align 5 +#if 0 +.data +.global _EnvRateSteps +_EnvRateSteps: + .long 0x00000000 + .long 0x00000000 + .long 0xFA000000 + .long 0x00000000 + .long 0x71F80000 + .long 0x00000009 + .long 0x71F80000 + .long 0x00000009 + .long 0xF4000000 + .long 0x00000001 + .long 0x03E80000 + .long 0x00000000 + .long 0xFA000000 + .long 0x00000000 + .long 0xD6D80000 + .long 0x00000000 + .long 0xFA000000 + .long 0x00000000 + .long 0x71F80000 + .long 0x00000009 + .align 5 +#endif +.global _videogl_cache_reseted +_videogl_cache_reseted: .long 1 +.global _videogl_cache_to_reseted +_videogl_cache_to_reseted: .long 0 +.global _videogl_cache +_videogl_cache: .long 0 +.global _videogl_tiles +_videogl_tiles: .long 0 +.global _videogl_first_brightness +_videogl_first_brightness: .byte 0 +.global _videogl_brightness +_videogl_brightness: .byte 0 +.global _videogl_min_z +_videogl_min_z: .byte 255 +.global _videogl_max_z +_videogl_max_z: .byte 0 +.global _videogl_hw_render +_videogl_hw_render: .long -1 +.global _videogl_changed_colors +_videogl_changed_colors: .long 0 +.global _videogl_changed_colors_back +_videogl_changed_colors_back: .long 0 +.global _videogl_clip +_videogl_clip: .long 0 +.global _videogl_clip_enabled +_videogl_clip_enabled: .long 0 +.global _videogl_used_screen +_videogl_used_screen: .long 0 +.global _videogl_used_addfix +_videogl_used_addfix: .long 0 +.global _videogl_addfix_x0 +_videogl_addfix_x0: .long 0 +.global _videogl_addfix_y0 +_videogl_addfix_y0: .long 256 +.global _videogl_addfix_x1 +_videogl_addfix_x1: .long 256 +.global _videogl_addfix_y1 +_videogl_addfix_y1: .long 0 +#if 0 +.global _videogl_used_sub +_videogl_used_sub: .long 0 +.global _videogl_sub_color +_videogl_sub_color: .short 0x8000, 0 +.global _videogl_sub_x0 +_videogl_sub_x0: .long 0 +.global _videogl_sub_y0 +_videogl_sub_y0: .long 256 +.global _videogl_sub_x1 +_videogl_sub_x1: .long 256 +.global _videogl_sub_y1 +_videogl_sub_y1: .long 0 +#endif +.global _videogl_8bit_tiles +_videogl_8bit_tiles: .long 0 +.global _videogl_screen_endY +_videogl_screen_endY: .long 0 +.global _videogl_screen_buffer +_videogl_screen_buffer: .long 0 +.global _videogl_screen_texture +_videogl_screen_texture: .long 0 +.global _videogl_screen +_videogl_screen: .long 0 +.global _videogl_z +_videogl_z: .float 0 +.global _videogl_fps_enabled +_videogl_fps_enabled: .long 0 +.global _videogl_fps_buffer +_videogl_fps_buffer: .long 0 +.global _videogl_info_enabled +_videogl_info_enabled: .long 0 +.global _videogl_info_buffer +_videogl_info_buffer: .long 0 +.global _videogl_black_buffer +_videogl_black_buffer: .long 0 +.global _videogl_background_buffer +_videogl_background_buffer: .long 0 +.global _videogl_back_no_tiles +_videogl_back_no_tiles: .long 0 +.global _videogl_addfix_buffer +_videogl_addfix_buffer: .long 0 +.global _videogl_sub_buffer +_videogl_sub_buffer: .long 0 +.global _videogl_changed_color +_videogl_changed_color: .zero 256 +.global _videogl_actual_color +_videogl_actual_color: .zero 512 +.global _videogl_tiles_z +_videogl_tiles_z: .zero 512 +.global _videogl_cached +_videogl_cached: .zero (VIDEO_GL_MAX_TEX * 2) +.global _videogl_background_color +_videogl_background_color: .zero (VIDEO_GL_RASTER * 2) +.global _videogl_addfix_color +_videogl_addfix_color: .zero (VIDEO_GL_RASTER * 2) +#ifndef USE_VIDEOGL_DIRECT_SLOT +.global _videogl_cache_slot_last +_videogl_cache_slot_last: .long 0 +.global _videogl_cache_slot +_videogl_cache_slot: .zero (VIDEO_GL_MAX_TEX * 2) +.global _videogl_cache_tile_slot +_videogl_cache_tile_slot: .zero (VIDEO_GL_MAX_TEX * 2) +#endif +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET +.global _videogl_selective +_videogl_selective: .zero 512 +.global _videogl_selective_cache +_videogl_selective_cache: .zero ((VIDEO_GL_MAX_TEX / 16) * 512) +#endif +.global _videogl_tile +_videogl_tile: .zero (VIDEO_GL_MAX_TEX * 12) + + .align 5 diff --git a/src/sh/cpuops.S b/src/sh/cpuops.S new file mode 100644 index 0000000..49ff031 --- /dev/null +++ b/src/sh/cpuops.S @@ -0,0 +1,7287 @@ +/*** Renesas SH assembler ***************************************************** + SH assembler code partly based on x86 assembler code + + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) +******************************************************************************/ + +/****************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +******************************************************************************/ + +.text +.little + +#include "asmstruc.h" +#include "asmaddr.h" +#include "asmops.h" +#include "getset.S" + + +.macro call_S9xGetByte LASTOPCODE + mov.l S9xGetByte,r3 + jsr @r3 + \LASTOPCODE +.endm + +.macro call_S9xGetWord LASTOPCODE + mov.l S9xGetWord,r3 + jsr @r3 + \LASTOPCODE +.endm + +.align 5 + +/* ADC */ +Op69M1: + Immediate8 ADC +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 IMM8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op69M0: + Immediate16 ADC2 +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 IMM16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op65M1: + Direct8_i ADC2 + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DIR8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op65M0: + Direct8_i ADC + call_S9xGetWord Direct8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DIR16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op75M1: + DirectIndexedX8_i ADC + call_S9xGetByte DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DIX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op75M0: + DirectIndexedX8_i ADC2 + call_S9xGetWord DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DIX16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op72M1: + DirectIndirect8_i ADC + call_S9xGetByte DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DI8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op72M0: + DirectIndirect8_i ADC2 + call_S9xGetWord DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DI16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op61M1: + DirectIndexedIndirect8_i ADC + call_S9xGetByte DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DII8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op61M0: + DirectIndexedIndirect8_i ADC2 + call_S9xGetWord DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DII16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op71M1: + DirectIndirectIndexed8_i ADC + call_S9xGetByte DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DIIY8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op71M0: + DirectIndirectIndexed8_i ADC2 + call_S9xGetWord DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DIIY16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op67M1: + DirectIndirectLong8_i ADC + call_S9xGetByte DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DIL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op67M0: + DirectIndirectLong8_i ADC2 + call_S9xGetWord DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DIL16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op77M1: + DirectIndirectIndexedLong8_i ADC + call_S9xGetByte DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 DIIL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op77M0: + DirectIndirectIndexedLong8_i ADC2 + call_S9xGetWord DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 DIIL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6DM1: + Absolute8_i ADC + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 ABS8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6DM0: + Absolute8_i ADC2 + call_S9xGetWord Absolute8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 ABS16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7DM1: + AbsoluteIndexedX8_i ADC + call_S9xGetByte AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 ABSX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7DM0: + AbsoluteIndexedX8_i ADC2 + call_S9xGetWord AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 ABSX16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op79M1: + AbsoluteIndexedY8_i ADC + call_S9xGetByte AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 ABSY8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op79M0: + AbsoluteIndexedY8_i ADC2 + call_S9xGetWord AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 ABSY16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6FM1: + AbsoluteLong8_i ADC + call_S9xGetByte AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 ABSL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6FM0: + AbsoluteLong8_i ADC2 + call_S9xGetWord AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 ABSL16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7FM1: + AbsoluteLongIndexedX8_i ADC + call_S9xGetByte AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 ALX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7FM0: + AbsoluteLongIndexedX8_i ADC2 + call_S9xGetWord AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 ALX16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op63M1: + StackRelative8_i ADC + call_S9xGetByte StackRelative8_f +#ifdef USE_ASM_SMALL + bra .Op73M1_Adc8 + nop +#else + Adc8 SREL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op63M0: + StackRelative8_i ADC2 + call_S9xGetWord StackRelative8_f +#ifdef USE_ASM_SMALL + bra .Op73M0_Adc16 + nop +#else + Adc16 SREL16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op73M1: + StackRelativeIndirectIndexed8_i ADC + call_S9xGetByte StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.Op73M1_Adc8: +#endif + Adc8 SRII8 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op73M0: + StackRelativeIndirectIndexed8_i ADC2 + call_S9xGetWord StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.Op73M0_Adc16: +#endif + Adc16 SRII16 + +/* AND */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op29M1: + Immediate8 AND +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 IMM8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op29M0: + Immediate16 AND + And16 IMM16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op25M1: + Direct8_i AND + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DIR8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op25M0: + Direct8_i AND2 + call_S9xGetWord Direct8_f + And16 DIR16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op35M1: + DirectIndexedX8_i AND + call_S9xGetByte DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DIX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op35M0: + DirectIndexedX8_i AND2 + call_S9xGetWord DirectIndexedX8_f + And16 DIX16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op32M1: + DirectIndirect8_i AND + call_S9xGetByte DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DI8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op32M0: + DirectIndirect8_i AND2 + call_S9xGetWord DirectIndirect8_f + And16 DI16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op21M1: + DirectIndexedIndirect8_i AND + call_S9xGetByte DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DII8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op21M0: + DirectIndexedIndirect8_i AND2 + call_S9xGetWord DirectIndexedIndirect8_f + And16 DII16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op31M1: + DirectIndirectIndexed8_i AND + call_S9xGetByte DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DIIY8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op31M0: + DirectIndirectIndexed8_i AND2 + call_S9xGetWord DirectIndirectIndexed8_f + And16 DIIY16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op27M1: + DirectIndirectLong8_i AND + call_S9xGetByte DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DIL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op27M0: + DirectIndirectLong8_i AND2 + call_S9xGetWord DirectIndirectLong8_f + And16 DIL16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op37M1: + DirectIndirectIndexedLong8_i AND + call_S9xGetByte DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 DIIL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op37M0: + DirectIndirectIndexedLong8_i AND2 + call_S9xGetWord DirectIndirectIndexedLong8_f + And16 DIIL16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2DM1: + Absolute8_i AND + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 ABS8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2DM0: + Absolute8_i AND2 + call_S9xGetWord Absolute8_f + And16 ABS16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3DM1: + AbsoluteIndexedX8_i AND + call_S9xGetByte AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 ABSX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3DM0: + AbsoluteIndexedX8_i AND2 + call_S9xGetWord AbsoluteIndexedX8_f + And16 ABSX16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op39M1: + AbsoluteIndexedY8_i AND + call_S9xGetByte AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 ABSY8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op39M0: + AbsoluteIndexedY8_i AND2 + call_S9xGetWord AbsoluteIndexedY8_f + And16 ABSY16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2FM1: + AbsoluteLong8_i AND + call_S9xGetByte AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 ABSL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2FM0: + AbsoluteLong8_i AND2 + call_S9xGetWord AbsoluteLong8_f + And16 ABSL16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3FM1: + AbsoluteLongIndexedX8_i AND + call_S9xGetByte AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 ALX8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3FM0: + AbsoluteLongIndexedX8_i AND2 + call_S9xGetWord AbsoluteLongIndexedX8_f + And16 ALX16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op23M1: + StackRelative8_i AND + call_S9xGetByte StackRelative8_f +#ifdef USE_ASM_SMALL + bra .Op33M1_And8 + nop +#else + And8 SREL8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op23M0: + StackRelative8_i AND2 + call_S9xGetWord StackRelative8_f + And16 SREL16 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op33M1: + StackRelativeIndirectIndexed8_i AND + call_S9xGetByte StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.Op33M1_And8: +#endif + And8 SRII8 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op33M0: + StackRelativeIndirectIndexed8_i AND2 + call_S9xGetWord StackRelativeIndirectIndexed8_f + And16 SRII16 + +/* ASL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0AM1: + extu.b A,r1 + sub r1,A +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + shll r1 + extu.b r1,r2 + mov #Carry,r0 + or r2,A + cmp/eq r1,r2 + bf/s .Asl8Carry + or r0,FLAGS + add #-Carry,FLAGS +.Asl8Carry: + SetZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0AM0: + extu.w A,r1 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + shll r1 + mov #Carry,r0 + extu.w r1,A + cmp/eq r1,A + bf/s .Asl16Carry + or r0,FLAGS + add #-Carry,FLAGS +.Asl16Carry: + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op06M1: + Direct8 ASL +#ifdef USE_ASM_SMALL + bra .Op1EM1_Asl8 + nop +#else + Asl8 DIR8 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op06M0: + Direct8 ASL2 +#ifdef USE_ASM_SMALL + bra .Op1EM0_Asl16 + nop +#else + Asl16 DIR16 +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op16M1: + DirectIndexedX8 ASL +#ifdef USE_ASM_SMALL + bra .Op1EM1_Asl8 + nop +#else + Asl8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op16M0: + DirectIndexedX8 ASL2 +#ifdef USE_ASM_SMALL + bra .Op1EM0_Asl16 + nop +#else + Asl16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0EM1: + Absolute8 ASL +#ifdef USE_ASM_SMALL + bra .Op1EM1_Asl8 + nop +#else + Asl8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0EM0: + Absolute8 ASL2 +#ifdef USE_ASM_SMALL + bra .Op1EM0_Asl16 + nop +#else + Asl16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1EM1: + AbsoluteIndexedX8 ASL +#ifdef USE_ASM_SMALL +.Op1EM1_Asl8: +#endif + Asl8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1EM0: + AbsoluteIndexedX8 ASL2 +#ifdef USE_ASM_SMALL +.Op1EM0_Asl16: +#endif + Asl16 ABSX + +/* BIT */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op89M1: + Immediate8 BIT + and A, r0 + extu.w r7,r3 + sub r3,r7 + jmp @r13 + or r0,r7 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op89M0: + Immediate16 BIT + and A, r0 + extu.w r7,r3 + sub r3,r7 + jmp @r13 + or r0,r7 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op24M1: + Direct8 BIT +#ifdef USE_ASM_SMALL + bra .Op3CM1_Bit8 + nop +#else + Bit8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op24M0: + Direct8 BIT +#ifdef USE_ASM_SMALL + bra .Op3CM0_Bit16 + nop +#else + Bit16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op34M1: + DirectIndexedX8 BIT +#ifdef USE_ASM_SMALL + bra .Op3CM1_Bit8 + nop +#else + Bit8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op34M0: + DirectIndexedX8 BIT2 +#ifdef USE_ASM_SMALL + bra .Op3CM0_Bit16 + nop +#else + Bit16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2CM1: + Absolute8 BIT +#ifdef USE_ASM_SMALL + bra .Op3CM1_Bit8 + nop +#else + Bit8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2CM0: + Absolute8 BIT2 +#ifdef USE_ASM_SMALL + bra .Op3CM0_Bit16 + nop +#else + Bit16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3CM1: + AbsoluteIndexedX8 BIT +#ifdef USE_ASM_SMALL +.Op3CM1_Bit8: +#endif + Bit8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3CM0: + AbsoluteIndexedX8 BIT2 +#ifdef USE_ASM_SMALL +.Op3CM0_Bit16: +#endif + Bit16 ABSX + +/* CMP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC9M1: + Immediate8 CMP +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC9M0: + Immediate16 CMP +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC5M1: + Direct8_i CMP + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC5M0: + Direct8_i CMP2 + call_S9xGetWord Direct8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD5M1: + DirectIndexedX8_i CMP + call_S9xGetByte DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD5M0: + DirectIndexedX8_i CMP2 + call_S9xGetWord DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD2M1: + DirectIndirect8_i CMP + call_S9xGetByte DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DI +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD2M0: + DirectIndirect8_i CMP2 + call_S9xGetWord DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DI +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC1M1: + DirectIndexedIndirect8_i CMP + call_S9xGetByte DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DII +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC1M0: + DirectIndexedIndirect8_i CMP2 + call_S9xGetWord DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DII +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD1M1: + DirectIndirectIndexed8_i CMP + call_S9xGetByte DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DIIY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD1M0: + DirectIndirectIndexed8_i CMP2 + call_S9xGetWord DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DIIY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC7M1: + DirectIndirectLong8_i CMP + call_S9xGetByte DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC7M0: + DirectIndirectLong8_i CMP2 + call_S9xGetWord DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD7M1: + DirectIndirectIndexedLong8_i CMP + call_S9xGetByte DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 DIIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD7M0: + DirectIndirectIndexedLong8_i CMP2 + call_S9xGetWord DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 DIIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCDM1: + Absolute8_i CMP + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCDM0: + Absolute8_i CMP2 + call_S9xGetWord Absolute8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDDM1: + AbsoluteIndexedX8_i CMP + call_S9xGetByte AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 ABSX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDDM0: + AbsoluteIndexedX8_i CMP2 + call_S9xGetWord AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 ABSX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD9M1: + AbsoluteIndexedY8_i CMP + call_S9xGetByte AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 ABSY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD9M0: + AbsoluteIndexedY8_i CMP2 + call_S9xGetWord AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 ABSY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCFM1: + AbsoluteLong8_i CMP + call_S9xGetByte AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 ABSL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCFM0: + AbsoluteLong8_i CMP2 + call_S9xGetWord AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 ABSL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDFM1: + AbsoluteLongIndexedX8_i CMP + call_S9xGetByte AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 ALX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDFM0: + AbsoluteLongIndexedX8_i CMP2 + call_S9xGetWord AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 ALX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC3M1: + StackRelative8_i CMP + call_S9xGetByte StackRelative8_f +#ifdef USE_ASM_SMALL + bra .OpD3M1_Cmp8 + nop +#else + Cmp8 SREL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC3M0: + StackRelative8_i CMP2 + call_S9xGetWord StackRelative8_f +#ifdef USE_ASM_SMALL + bra .OpD3M0_Cmp16 + nop +#else + Cmp16 SREL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD3M1: + StackRelativeIndirectIndexed8_i CMP + call_S9xGetByte StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.OpD3M1_Cmp8: +#endif + Cmp8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD3M0: + StackRelativeIndirectIndexed8_i CMP2 + call_S9xGetWord StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.OpD3M0_Cmp16: +#endif + Cmp16 SRII + +/* CPX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE0X1: + Immediate8 CPX +#ifdef USE_ASM_SMALL + bra .OpECX1_Cpx8 + nop +#else + Cpx8 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE0X0: + Immediate16 CPX +#ifdef USE_ASM_SMALL + bra .OpECX0_Cpx16 + nop +#else + Cpx16 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE4X1: + Direct8_i CPX + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .OpECX1_Cpx8 + nop +#else + Cpx8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE4X0: + Direct8_i CPX2 + call_S9xGetWord Direct8_f +#ifdef USE_ASM_SMALL + bra .OpECX0_Cpx16 + nop +#else + Cpx16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpECX1: + Absolute8_i CPX + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL +.OpECX1_Cpx8: +#endif + Cpx8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpECX0: + Absolute8_i CPX2 + call_S9xGetWord Absolute8_f +#ifdef USE_ASM_SMALL +.OpECX0_Cpx16: +#endif + Cpx16 ABS + + +/* CPY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC0X1: + Immediate8 CPY +#ifdef USE_ASM_SMALL + bra .OpCCX1_Cpy8 + nop +#else + Cpy8 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC0X0: + Immediate16 CPY +#ifdef USE_ASM_SMALL + bra .OpCCX0_Cpy16 + nop +#else + Cpy16 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC4X1: + Direct8_i CPY + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .OpCCX1_Cpy8 + nop +#else + Cpy8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC4X0: + Direct8_i CPY2 + call_S9xGetWord Direct8_f +#ifdef USE_ASM_SMALL + bra .OpCCX0_Cpy16 + nop +#else + Cpy16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCCX1: + Absolute8_i CPY + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL +.OpCCX1_Cpy8: +#endif + Cpy8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCCX0: + Absolute8_i CPY2 + call_S9xGetWord Absolute8_f +#ifdef USE_ASM_SMALL +.OpCCX0_Cpy16: +#endif + Cpy16 ABS + +/* DEC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3AM1: + extu.b A,r0 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + sub r0,A + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + extu.b r0,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + or r0,A + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3AM0: + add #-1,A +#ifdef VAR_CYCLES + add #6, CYCLES +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + extu.w A,A +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC6M1: + Direct8 DEC +#ifdef USE_ASM_SMALL + bra .OpDEM1_Dec8 + nop +#else + Dec8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC6M0: + Direct8 DEC2 +#ifdef USE_ASM_SMALL + bra .OpDEM0_Dec16 + nop +#else + Dec16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD6M1: + DirectIndexedX8 DEC +#ifdef USE_ASM_SMALL + bra .OpDEM1_Dec8 + nop +#else + Dec8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD6M0: + DirectIndexedX8 DEC2 +#ifdef USE_ASM_SMALL + bra .OpDEM0_Dec16 + nop +#else + Dec16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCEM1: + Absolute8 DEC +#ifdef USE_ASM_SMALL + bra .OpDEM1_Dec8 + nop +#else + Dec8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCEM0: + Absolute8 DEC2 +#ifdef USE_ASM_SMALL + bra .OpDEM0_Dec16 + nop +#else + Dec16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDEM1: + AbsoluteIndexedX8 DEC + +#ifdef USE_ASM_SMALL +.OpDEM1_Dec8: +#endif + Dec8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDEM0: + AbsoluteIndexedX8 DEC2 +#ifdef USE_ASM_SMALL +.OpDEM0_Dec16: +#endif + Dec16 ABSX + +/* EOR */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op49M1: + Immediate8 EOR + Eor8 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op49M0: + Immediate16 EOR + Eor16 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op45M1: + Direct8_i EOR + call_S9xGetByte Direct8_f + Eor8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op45M0: + Direct8_i EOR2 + call_S9xGetWord Direct8_f + Eor16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op55M1: + DirectIndexedX8_i EOR + call_S9xGetByte DirectIndexedX8_f + Eor8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op55M0: + DirectIndexedX8_i EOR2 + call_S9xGetWord DirectIndexedX8_f + Eor16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op52M1: + DirectIndirect8_i EOR + call_S9xGetByte DirectIndirect8_f + Eor8 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op52M0: + DirectIndirect8_i EOR2 + call_S9xGetWord DirectIndirect8_f + Eor16 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op41M1: + DirectIndexedIndirect8_i EOR + call_S9xGetByte DirectIndexedIndirect8_f + Eor8 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op41M0: + DirectIndexedIndirect8_i EOR2 + call_S9xGetWord DirectIndexedIndirect8_f + Eor16 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op51M1: + DirectIndirectIndexed8_i EOR + call_S9xGetByte DirectIndirectIndexed8_f + Eor8 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op51M0: + DirectIndirectIndexed8_i EOR2 + call_S9xGetWord DirectIndirectIndexed8_f + Eor16 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op47M1: + DirectIndirectLong8_i EOR + call_S9xGetByte DirectIndirectLong8_f + Eor8 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op47M0: + DirectIndirectLong8_i EOR2 + call_S9xGetWord DirectIndirectLong8_f + Eor16 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op57M1: + DirectIndirectIndexedLong8_i EOR + call_S9xGetByte DirectIndirectIndexedLong8_f + Eor8 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op57M0: + DirectIndirectIndexedLong8_i EOR2 + call_S9xGetWord DirectIndirectIndexedLong8_f + Eor16 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4DM1: + Absolute8_i EOR + call_S9xGetByte Absolute8_f + Eor8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4DM0: + Absolute8_i EOR2 + call_S9xGetWord Absolute8_f + Eor16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5DM1: + AbsoluteIndexedX8_i EOR + call_S9xGetByte AbsoluteIndexedX8_f + Eor8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5DM0: + AbsoluteIndexedX8_i EOR2 + call_S9xGetWord AbsoluteIndexedX8_f + Eor16 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op59M1: + AbsoluteIndexedY8_i EOR + call_S9xGetByte AbsoluteIndexedY8_f + Eor8 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op59M0: + AbsoluteIndexedY8_i EOR2 + call_S9xGetWord AbsoluteIndexedY8_f + Eor16 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4FM1: + AbsoluteLong8_i EOR + call_S9xGetByte AbsoluteLong8_f + Eor8 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4FM0: + AbsoluteLong8_i EOR2 + call_S9xGetWord AbsoluteLong8_f + Eor16 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5FM1: + AbsoluteLongIndexedX8_i EOR + call_S9xGetByte AbsoluteLongIndexedX8_f + Eor8 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5FM0: + AbsoluteLongIndexedX8_i EOR2 + call_S9xGetWord AbsoluteLongIndexedX8_f + Eor16 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op43M1: + StackRelative8_i EOR + call_S9xGetByte StackRelative8_f + Eor8 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op43M0: + StackRelative8_i EOR2 + call_S9xGetWord StackRelative8_f + Eor16 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op53M1: + StackRelativeIndirectIndexed8_i EOR + call_S9xGetByte StackRelativeIndirectIndexed8_f + Eor8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op53M0: + StackRelativeIndirectIndexed8_i EOR2 + call_S9xGetWord StackRelativeIndirectIndexed8_f + Eor16 SRII + +/* INC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1AM1: + extu.b A,r0 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + sub r0,A + add #1,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + extu.b r0,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + or r0,A + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1AM0: + add #1,A +#ifdef VAR_CYCLES + add #6, CYCLES +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + extu.w A,A + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE6M1: + Direct8 INC +#ifdef USE_ASM_SMALL + bra .OpFEM1_Inc8 + nop +#else + Inc8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE6M0: + Direct8 INC2 +#ifdef USE_ASM_SMALL + bra .OpFEM0_Inc16 + nop +#else + Inc16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF6M1: + DirectIndexedX8 INC +#ifdef USE_ASM_SMALL + bra .OpFEM1_Inc8 + nop +#else + Inc8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF6M0: + DirectIndexedX8 INC2 +#ifdef USE_ASM_SMALL + bra .OpFEM0_Inc16 + nop +#else + Inc16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEEM1: + Absolute8 INC +#ifdef USE_ASM_SMALL + bra .OpFEM1_Inc8 + nop +#else + Inc8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEEM0: + Absolute8 INC2 +#ifdef USE_ASM_SMALL + bra .OpFEM0_Inc16 + nop +#else + Inc16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFEM1: + AbsoluteIndexedX8 INC +#ifdef USE_ASM_SMALL +.OpFEM1_Inc8: +#endif + Inc8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFEM0: + AbsoluteIndexedX8 INC2 +#ifdef USE_ASM_SMALL +.OpFEM0_Inc16: +#endif + Inc16 ABSX + +/* LDA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA9M1: + Immediate8 LDA +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA9M0: + Immediate16 LDA + Lda16 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA5M1: + Direct8_i LDA + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA5M0: + Direct8_i LDA2 + call_S9xGetWord Direct8_f + Lda16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB5M1: + DirectIndexedX8_i LDA + call_S9xGetByte DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB5M0: + DirectIndexedX8_i LDA2 + call_S9xGetWord DirectIndexedX8_f + Lda16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB2M1: + DirectIndirect8_i LDA + call_S9xGetByte DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DI +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB2M0: + DirectIndirect8_i LDA2 + call_S9xGetWord DirectIndirect8_f + Lda16 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA1M1: + DirectIndexedIndirect8_i LDA + call_S9xGetByte DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DII +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA1M0: + DirectIndexedIndirect8_i LDA2 + call_S9xGetWord DirectIndexedIndirect8_f + Lda16 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB1M1: + DirectIndirectIndexed8_i LDA + call_S9xGetByte DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DIIY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB1M0: + DirectIndirectIndexed8_i LDA2 + call_S9xGetWord DirectIndirectIndexed8_f + Lda16 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA7M1: + DirectIndirectLong8_i LDA + call_S9xGetByte DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA7M0: + DirectIndirectLong8_i LDA2 + call_S9xGetWord DirectIndirectLong8_f + Lda16 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB7M1: + DirectIndirectIndexedLong8_i LDA + call_S9xGetByte DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 DIIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB7M0: + DirectIndirectIndexedLong8_i LDA2 + call_S9xGetWord DirectIndirectIndexedLong8_f + Lda16 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpADM1: + Absolute8_i LDA + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpADM0: + Absolute8_i LDA2 + call_S9xGetWord Absolute8_f + Lda16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBDM1: + AbsoluteIndexedX8_i LDA + call_S9xGetByte AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 ABSX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBDM0: + AbsoluteIndexedX8_i LDA2 + call_S9xGetWord AbsoluteIndexedX8_f + Lda16 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB9M1: + AbsoluteIndexedY8_i LDA + call_S9xGetByte AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 ABSY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB9M0: + AbsoluteIndexedY8_i LDA2 + call_S9xGetWord AbsoluteIndexedY8_f + Lda16 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAFM1: + AbsoluteLong8_i LDA + call_S9xGetByte AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 ABSL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAFM0: + AbsoluteLong8_i LDA2 + call_S9xGetWord AbsoluteLong8_f + Lda16 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBFM1: + AbsoluteLongIndexedX8_i LDA + call_S9xGetByte AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 ALX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBFM0: + AbsoluteLongIndexedX8_i LDA2 + call_S9xGetWord AbsoluteLongIndexedX8_f + Lda16 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA3M1: + StackRelative8_i LDA + call_S9xGetByte StackRelative8_f +#ifdef USE_ASM_SMALL + bra .OpB3M1_Lda8 + nop +#else + Lda8 SREL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA3M0: + StackRelative8_i LDA2 + call_S9xGetWord StackRelative8_f + Lda16 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB3M1: + StackRelativeIndirectIndexed8_i LDA + call_S9xGetByte StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.OpB3M1_Lda8: +#endif + Lda8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB3M0: + StackRelativeIndirectIndexed8_i LDA2 + call_S9xGetWord StackRelativeIndirectIndexed8_f + Lda16 SRII + +/* LDX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA2X1: + Immediate8 LDX + Ldx8 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA2X0: + Immediate16 LDX + Ldx16 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA6X1: + Direct8_i LDX + call_S9xGetByte Direct8_f + Ldx8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA6X0: + Direct8_i LDX2 + call_S9xGetWord Direct8_f + Ldx16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB6X1: + DirectIndexedY8_i LDX + call_S9xGetByte DirectIndexedY8_f + Ldx8 DIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB6X0: + DirectIndexedY8_i LDX2 + call_S9xGetWord DirectIndexedY8_f + Ldx16 DIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAEX1: + Absolute8_i LDX + call_S9xGetByte Absolute8_f + Ldx8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAEX0: + Absolute8_i LDX2 + call_S9xGetWord Absolute8_f + Ldx16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBEX1: + AbsoluteIndexedY8_i LDX + call_S9xGetByte AbsoluteIndexedY8_f + Ldx8 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBEX0: + AbsoluteIndexedY8_i LDX2 + call_S9xGetWord AbsoluteIndexedY8_f + Ldx16 ABSY + +/* LDY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA0X1: + Immediate8 LDY + Ldy8 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA0X0: + Immediate16 LDY + Ldy16 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA4X1: + Direct8_i LDY + call_S9xGetByte Direct8_f + Ldy8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA4X0: + Direct8_i LDY2 + call_S9xGetWord Direct8_f + Ldy16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB4X1: + DirectIndexedX8_i LDY + call_S9xGetByte DirectIndexedX8_f + Ldy8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB4X0: + DirectIndexedX8_i LDY2 + call_S9xGetWord DirectIndexedX8_f + Ldy16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpACX1: + Absolute8_i LDY + call_S9xGetByte Absolute8_f + Ldy8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpACX0: + Absolute8_i LDY2 + call_S9xGetWord Absolute8_f + Ldy16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBCX1: + AbsoluteIndexedX8_i LDY + call_S9xGetByte AbsoluteIndexedX8_f + Ldy8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBCX0: + AbsoluteIndexedX8_i LDY2 + call_S9xGetWord AbsoluteIndexedX8_f + Ldy16 ABSX + +/* LSR */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4AM1: + extu.b A,r1 + sub r1,A +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov #Carry,r0 + shlr r1 + bt/s .Lsr8Carry + or r0,FLAGS + add #-Carry,FLAGS +.Lsr8Carry: + or r1,A + SetZNjmp r1 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4AM0: + extu.w A,A +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + shlr A + mov #Carry,r0 + bt/s .Lsr16Carry + or r0,FLAGS + add #-Carry,FLAGS +.Lsr16Carry: + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op46M1: + Direct8 LSR +#ifdef USE_ASM_SMALL + bra .Op5EM1_Lsr8 + nop +#else + Lsr8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op46M0: + Direct8 LSR2 +#ifdef USE_ASM_SMALL + bra .Op5EM0_Lsr16 + nop +#else + Lsr16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op56M1: + DirectIndexedX8 LSR +#ifdef USE_ASM_SMALL + bra .Op5EM1_Lsr8 + nop +#else + Lsr8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op56M0: + DirectIndexedX8 LSR2 +#ifdef USE_ASM_SMALL + bra .Op5EM0_Lsr16 + nop +#else + Lsr16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4EM1: + Absolute8 LSR +#ifdef USE_ASM_SMALL + bra .Op5EM1_Lsr8 + nop +#else + Lsr8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4EM0: + Absolute8 LSR2 +#ifdef USE_ASM_SMALL + bra .Op5EM0_Lsr16 + nop +#else + Lsr16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5EM1: + AbsoluteIndexedX8 LSR +#ifdef USE_ASM_SMALL +.Op5EM1_Lsr8: +#endif + Lsr8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5EM0: + AbsoluteIndexedX8 LSR2 +#ifdef USE_ASM_SMALL +.Op5EM0_Lsr16: +#endif + Lsr16 ABSX + +/* ORA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op09M1: + Immediate8 ORA + Ora8 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op09M0: + Immediate16 ORA + Ora16 IMM + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op05M1: + Direct8_i ORA + call_S9xGetByte Direct8_f + Ora8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op05M0: + Direct8_i ORA2 + call_S9xGetWord Direct8_f + Ora16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op15M1: + DirectIndexedX8_i ORA + call_S9xGetByte DirectIndexedX8_f + Ora8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op15M0: + DirectIndexedX8_i ORA2 + call_S9xGetWord DirectIndexedX8_f + Ora16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op12M1: + DirectIndirect8_i ORA + call_S9xGetByte DirectIndirect8_f + Ora8 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op12M0: + DirectIndirect8_i ORA2 + call_S9xGetWord DirectIndirect8_f + Ora16 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op01M1: + DirectIndexedIndirect8_i ORA + call_S9xGetByte DirectIndexedIndirect8_f + Ora8 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op01M0: + DirectIndexedIndirect8_i ORA2 + call_S9xGetWord DirectIndexedIndirect8_f + Ora16 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op11M1: + DirectIndirectIndexed8_i ORA + call_S9xGetByte DirectIndirectIndexed8_f + Ora8 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op11M0: + DirectIndirectIndexed8_i ORA2 + call_S9xGetWord DirectIndirectIndexed8_f + Ora16 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op07M1: + DirectIndirectLong8_i ORA + call_S9xGetByte DirectIndirectLong8_f + Ora8 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op07M0: + DirectIndirectLong8_i ORA2 + call_S9xGetWord DirectIndirectLong8_f + Ora16 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op17M1: + DirectIndirectIndexedLong8_i ORA + call_S9xGetByte DirectIndirectIndexedLong8_f + Ora8 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op17M0: + DirectIndirectIndexedLong8_i ORA2 + call_S9xGetWord DirectIndirectIndexedLong8_f + Ora16 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0DM1: + Absolute8_i ORA + call_S9xGetByte Absolute8_f + Ora8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0DM0: + Absolute8_i ORA2 + call_S9xGetWord Absolute8_f + Ora16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1DM1: + AbsoluteIndexedX8_i ORA + call_S9xGetByte AbsoluteIndexedX8_f + Ora8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1DM0: + AbsoluteIndexedX8_i ORA2 + call_S9xGetWord AbsoluteIndexedX8_f + Ora16 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op19M1: + AbsoluteIndexedY8_i ORA + call_S9xGetByte AbsoluteIndexedY8_f + Ora8 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op19M0: + AbsoluteIndexedY8_i ORA2 + call_S9xGetWord AbsoluteIndexedY8_f + Ora16 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0FM1: + AbsoluteLong8_i ORA + call_S9xGetByte AbsoluteLong8_f + Ora8 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0FM0: + AbsoluteLong8_i ORA2 + call_S9xGetWord AbsoluteLong8_f + Ora16 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1FM1: + AbsoluteLongIndexedX8_i ORA + call_S9xGetByte AbsoluteLongIndexedX8_f + Ora8 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1FM0: + AbsoluteLongIndexedX8_i ORA2 + call_S9xGetWord AbsoluteLongIndexedX8_f + Ora16 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op03M1: + StackRelative8_i ORA + call_S9xGetByte StackRelative8_f + Ora8 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op03M0: + StackRelative8_i ORA2 + call_S9xGetWord StackRelative8_f + Ora16 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op13M1: + StackRelativeIndirectIndexed8_i ORA + call_S9xGetByte StackRelativeIndirectIndexed8_f + Ora8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op13M0: + StackRelativeIndirectIndexed8_i ORA2 + call_S9xGetWord StackRelativeIndirectIndexed8_f + Ora16 SRII + +/* ROL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2AM1: + GetCarry +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.b A,r0 + mov #1,r2 + sub r0,A + or r2,FLAGS + rotcl r0 + shll8 r2 + tst r2,r0 + extu.b r0,r0 + bf/s .Rol8Carry + or r0,A + add #-Carry,FLAGS +.Rol8Carry: + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2AM0: + GetCarry +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov #1,r2 + rotcl A + or r2,FLAGS + shll16 r2 + tst r2,A + bf/s .Rol16Carry + extu.w A,A + add #-Carry,FLAGS +.Rol16Carry: + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op26M1: + Direct8 ROL +#ifdef USE_ASM_SMALL + bra .Op3EM1_Rol8 + nop +#else + Rol8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op26M0: + Direct8 ROL2 +#ifdef USE_ASM_SMALL + bra .Op3EM0_Rol16 + nop +#else + Rol16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op36M1: + DirectIndexedX8 ROL +#ifdef USE_ASM_SMALL + bra .Op3EM1_Rol8 + nop +#else + Rol8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op36M0: + DirectIndexedX8 ROL2 +#ifdef USE_ASM_SMALL + bra .Op3EM0_Rol16 + nop +#else + Rol16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2EM1: + Absolute8 ROL +#ifdef USE_ASM_SMALL + bra .Op3EM1_Rol8 + nop +#else + Rol8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2EM0: + Absolute8 ROL2 +#ifdef USE_ASM_SMALL + bra .Op3EM0_Rol16 + nop +#else + Rol16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3EM1: + AbsoluteIndexedX8 ROL +#ifdef USE_ASM_SMALL +.Op3EM1_Rol8: +#endif + Rol8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3EM0: + AbsoluteIndexedX8 ROL2 +#ifdef USE_ASM_SMALL +.Op3EM0_Rol16: +#endif + Rol16 ABSX + +/* ROR */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6AM1: + mov #1,r1 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + and FLAGS,r1 + extu.b A,r0 + shll8 r1 + sub r0,A + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror8Carry + or r1,FLAGS + add #-Carry,FLAGS +.Ror8Carry: + or r0,A + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6AM0: + mov #1,r1 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + and FLAGS,r1 + extu.w A,A + shll16 r1 + or r1,A + shlr A + mov #Carry,r1 + bt/s .Ror16Carry + or r1,FLAGS + add #-Carry,FLAGS +.Ror16Carry: + Set16ZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op66M1: + Direct8 ROR +#ifdef USE_ASM_SMALL + bra .Op7EM1_Ror8 + nop +#else + Ror8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op66M0: + Direct8 ROR2 +#ifdef USE_ASM_SMALL + bra .Op7EM0_Ror16 + nop +#else + Ror16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op76M1: + DirectIndexedX8 ROR +#ifdef USE_ASM_SMALL + bra .Op7EM1_Ror8 + nop +#else + Ror8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op76M0: + DirectIndexedX8 ROR2 +#ifdef USE_ASM_SMALL + bra .Op7EM0_Ror16 + nop +#else + Ror16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6EM1: + Absolute8 ROR +#ifdef USE_ASM_SMALL + bra .Op7EM1_Ror8 + nop +#else + Ror8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6EM0: + Absolute8 ROR2 +#ifdef USE_ASM_SMALL + bra .Op7EM0_Ror16 + nop +#else + Ror16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7EM1: + AbsoluteIndexedX8 ROR +#ifdef USE_ASM_SMALL +.Op7EM1_Ror8: +#endif + Ror8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7EM0: + AbsoluteIndexedX8 ROR2 +#ifdef USE_ASM_SMALL +.Op7EM0_Ror16: +#endif + Ror16 ABSX + +/* SBC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE9M1: + Immediate8 SBC +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE9M0: + Immediate16 SBC +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 IMM +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE5M1: + Direct8_i SBC + call_S9xGetByte Direct8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE5M0: + Direct8_i SBC2 + call_S9xGetWord Direct8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF5M1: + DirectIndexedX8_i SBC + call_S9xGetByte DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF5M0: + DirectIndexedX8_i SBC2 + call_S9xGetWord DirectIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DIX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF2M1: + DirectIndirect8_i SBC + call_S9xGetByte DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DI +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF2M0: + DirectIndirect8_i SBC2 + call_S9xGetWord DirectIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DI +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE1M1: + DirectIndexedIndirect8_i SBC + call_S9xGetByte DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DII +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE1M0: + DirectIndexedIndirect8_i SBC2 + call_S9xGetWord DirectIndexedIndirect8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DII +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF1M1: + DirectIndirectIndexed8_i SBC + call_S9xGetByte DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DIIY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF1M0: + DirectIndirectIndexed8_i SBC2 + call_S9xGetWord DirectIndirectIndexed8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DIIY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE7M1: + DirectIndirectLong8_i SBC + call_S9xGetByte DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE7M0: + DirectIndirectLong8_i SBC2 + call_S9xGetWord DirectIndirectLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF7M1: + DirectIndirectIndexedLong8_i SBC + call_S9xGetByte DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 DIIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF7M0: + DirectIndirectIndexedLong8_i SBC2 + call_S9xGetWord DirectIndirectIndexedLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 DIIL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEDM1: + Absolute8_i SBC + call_S9xGetByte Absolute8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEDM0: + Absolute8_i SBC2 + call_S9xGetWord Absolute8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 ABS +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFDM1: + AbsoluteIndexedX8_i SBC + call_S9xGetByte AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 ABSX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFDM0: + AbsoluteIndexedX8_i SBC2 + call_S9xGetWord AbsoluteIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 ABSX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF9M1: + AbsoluteIndexedY8_i SBC + call_S9xGetByte AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 ABSY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF9M0: + AbsoluteIndexedY8_i SBC2 + call_S9xGetWord AbsoluteIndexedY8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 ABSY +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEFM1: + AbsoluteLong8_i SBC + call_S9xGetByte AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 ABSL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEFM0: + AbsoluteLong8_i SBC2 + call_S9xGetWord AbsoluteLong8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 ABSL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFFM1: + AbsoluteLongIndexedX8_i SBC + call_S9xGetByte AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 ALX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFFM0: + AbsoluteLongIndexedX8_i SBC2 + call_S9xGetWord AbsoluteLongIndexedX8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 ALX +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE3M1: + StackRelative8_i SBC + call_S9xGetByte StackRelative8_f +#ifdef USE_ASM_SMALL + bra .OpF3M1_Sbc8 + nop +#else + Sbc8 SREL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE3M0: + StackRelative8_i SBC2 + call_S9xGetWord StackRelative8_f +#ifdef USE_ASM_SMALL + bra .OpF3M0_Sbc16 + nop +#else + Sbc16 SREL +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF3M1: + StackRelativeIndirectIndexed8_i SBC + call_S9xGetByte StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.OpF3M1_Sbc8: +#endif + Sbc8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF3M0: + StackRelativeIndirectIndexed8_i SBC2 + call_S9xGetWord StackRelativeIndirectIndexed8_f +#ifdef USE_ASM_SMALL +.OpF3M0_Sbc16: +#endif + Sbc16 SRII + +/* STA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op85M1: + Direct8 STA + Sta8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op85M0: + Direct8 STA2 + Sta16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op95M1: + DirectIndexedX8 STA + Sta8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op95M0: + DirectIndexedX8 STA2 + Sta16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op92M1: + DirectIndirect8 STA + Sta8 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op92M0: + DirectIndirect8 STA2 + Sta16 DI + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op81M1: + DirectIndexedIndirect8 STA + Sta8 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op81M0: + DirectIndexedIndirect8 STA2 + Sta16 DII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op91M1: + DirectIndirectIndexed8 STA + Sta8 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op91M0: + DirectIndirectIndexed8 STA2 + Sta16 DIIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op87M1: + DirectIndirectLong8 STA + Sta8 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op87M0: + DirectIndirectLong8 STA2 + Sta16 DIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op97M1: + DirectIndirectIndexedLong8 STA + Sta8 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op97M0: + DirectIndirectIndexedLong8 STA2 + Sta16 DIIL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8DM1: + Absolute8 STA + Sta8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8DM0: + Absolute8 STA + Sta16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9DM1: + AbsoluteIndexedX8 STA + Sta8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9DM0: + AbsoluteIndexedX8 STA2 + Sta16 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op99M1: + AbsoluteIndexedY8 STA + Sta8 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op99M0: + AbsoluteIndexedY8 STA2 + Sta16 ABSY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8FM1: + AbsoluteLong8 STA + Sta8 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8FM0: + AbsoluteLong8 STA2 + Sta16 ABSL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9FM1: + AbsoluteLongIndexedX8 STA + Sta8 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9FM0: + AbsoluteLongIndexedX8 STA2 + Sta16 ALX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op83M1: + StackRelative8 STA + Sta8 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op83M0: + StackRelative8 STA2 + Sta16 SREL + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op93M1: + StackRelativeIndirectIndexed8 STA + Sta8 SRII + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op93M0: + StackRelativeIndirectIndexed8 STA2 + Sta16 SRII + +/* STX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op86X1: + Direct8 STX + Stx8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op86X0: + Direct8 STX2 + Stx16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op96X1: + DirectIndexedY8 STX + Stx8 DIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op96X0: + DirectIndexedY8 STX2 + Stx16 DIY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8EX1: + Absolute8 STX + Stx8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8EX0: + Absolute8 STX2 + Stx16 ABS + +/* STY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op84X1: + Direct8 STY + Sty8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op84X0: + Direct8 STY2 + Sty16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op94X1: + DirectIndexedX8 STY + Sty8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op94X0: + DirectIndexedX8 STY2 + Sty16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8CX1: + Absolute8 STY + Sty8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8CX0: + Absolute8 STY2 + Sty16 ABS + +/* STZ */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op64M1: + Direct8 STZ + Stz8 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op64M0: + Direct8 STZ2 + Stz16 DIR + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op74M1: + DirectIndexedX8 STZ + Stz8 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op74M0: + DirectIndexedX8 STZ2 + Stz16 DIX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9CM1: + Absolute8 STZ + Stz8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9CM0: + Absolute8 STZ2 + Stz16 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9EM1: + AbsoluteIndexedX8 STZ + Stz8 ABSX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9EM0: + AbsoluteIndexedX8 STZ2 + Stz16 ABSX + +/* TRB */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op14M1: + Direct8 TRB +#ifdef USE_ASM_SMALL + bra .Op1CM1_Trb8 + nop +#else + Trb8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op14M0: + Direct8 TRB2 +#ifdef USE_ASM_SMALL + bra .Op1CM0_Trb16 + nop +#else + Trb16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1CM1: + Absolute8 TRB +#ifdef USE_ASM_SMALL +.Op1CM1_Trb8: +#endif + Trb8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1CM0: + Absolute8 TRB2 +#ifdef USE_ASM_SMALL +.Op1CM0_Trb16: +#endif + Trb16 ABS + +/* TSB */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op04M1: + Direct8 TSB +#ifdef USE_ASM_SMALL + bra .Op04M1_Tsb8 + nop +#else + Tsb8 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op04M0: + Direct8 TSB2 +#ifdef USE_ASM_SMALL + bra .Op0CM0_Tsb16 + nop +#else + Tsb16 DIR +#endif + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0CM1: + Absolute8 TSB +#ifdef USE_ASM_SMALL +.Op04M1_Tsb8: +#endif + Tsb8 ABS + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0CM0: + Absolute8 TSB2 +#ifdef USE_ASM_SMALL +.Op0CM0_Tsb16: +#endif + Tsb16 ABS + +/* BCC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op90: + Relative + BranchCheck0 BCC + GetNotCarry + bf .BCC_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BCC +#endif +.BCC_EXIT: + jmp @r13 + nop + +/* BCS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB0: + Relative + BranchCheck0 BCS + GetNotCarry + bt .BCS_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BCS +#endif +.BCS_EXIT: + jmp @r13 + nop + +/* BEQ */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF0: + Relative + BranchCheck2 BEQ + extu.w r7,r3 + tst r3,r3 + bf .BEQ_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BEQ +#endif +.BEQ_EXIT: + jmp @r13 + nop + +/* BMI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op30: + Relative + BranchCheck1 BMI + cmp/pz r7 + bt .BMI_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BMI +#endif +.BMI_EXIT: + jmp @r13 + nop + +/* BNE */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD0: + Relative + BranchCheck1 BNE + extu.w r7,r3 + tst r3,r3 + bt .BNE_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BNE +#endif +.BNE_EXIT: + jmp @r13 + nop + +/* BPL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op10: + Relative + BranchCheck1 BPL + cmp/pz r7 + bf .BPL_EXIT +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BPL +#endif +.BPL_EXIT: + jmp @r13 + nop + +/* BRA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op80: + Relative +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + extu.w r4,PC + mov.l PCBase,r3 + jmp @r13 + add r3,PC + +/* BVC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op50: + Relative + BranchCheck0 BVC + mov #Overflow,r1 + tst r1,FLAGS + bf .BVC_EXIT: +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL + bra .Op70_CPUShutdown + nop +#else + CPUShutdown BVC +#endif +.BVC_EXIT: + jmp @r13 + nop + +/* BVS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op70: + Relative + BranchCheck0 BVS + mov #Overflow,r1 + tst r1,FLAGS + bt .BVS_EXIT: +#ifdef VAR_CYCLES + add #6,CYCLES +#else + add #1,CYCLES +#endif + mov.l PCBase,r3 + extu.w r4,PC + add r3,PC +#ifdef USE_ASM_SMALL +.Op70_CPUShutdown: +#endif + CPUShutdown BVS +.BVS_EXIT: + jmp @r13 + nop + +/* BRL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op82: + RelativeLong BRL + extu.w r4,r4 + mov.l ICPU,r0 + mov.l @(16,r0),r2 + mov.l S9xSetPCBase,r3 + or r2,r4 + Xlink + +/* CLC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op18: + mov #~Carry,r0 +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + jmp @r13 + and r0,FLAGS + +/* CLD */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD8: + mov #~Decimal,r0 +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + jmp @r13 + and r0,FLAGS + +/* CLI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op58: + mov #~IRQ,r2 +#ifdef VAR_CYCLES + add #6,CYCLES +#endif +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .CLI_EXIT + /* XXX: test for Settings.DisableIRQ */ + mov.l S9xOpcode_IRQ,r3 + and r2,FLAGS + Xlink +.CLI_EXIT: + jmp @r13 + and r2,FLAGS + +/* CLV */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpB8: + mov #~Overflow,r0 +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + jmp @r13 + and r0,FLAGS + +/* DEX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCAX1: +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + mov.b XL,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.b r0,XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCAX0: +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + mov.w XX,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.w r0,XX + Set16ZNjmp r0 + +/* DEY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op88X1: +#ifdef VAR_CYCLES + add #6,CYCLES +#endif + mov.b YL,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.b r0,YL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op88X0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w YY,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #-1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.w r0,YY + Set16ZNjmp r0 + +/* INX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE8X1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b XL,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.b r0, XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE8X0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w XX,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.w r0, XX + Set16ZNjmp r0 + +/* INY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC8X1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b YL,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.b r0, YL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC8X0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w YY,r0 +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif + add #1,r0 +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif + mov.w r0,YY + Set16ZNjmp r0 + +/* NOP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEA: + jmp @r13 +#ifdef VAR_CYCLES + add #6,CYCLES +#else + nop +#endif + +/* PEA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF4: + Immediate16 PEA + PushWordjmp PEA + +/* PEI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpD4: + DirectIndirect8 PEI + extu.w r4,r0 + PushWordjmp PEI + +/* PER */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op62: + RelativeLong PER + extu.w r4,r0 + PushWordjmp PER + +/* PHA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op48M1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.b A,r0 + PushBytejmp PHA + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op48M0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.w A,r0 + PushWordjmp PHA + +/* PHB */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif +#ifndef USE_REGISTER_AS_DB + mov.b DB, r0 +#else + extu.b DB, r0 +#endif + PushBytejmp PHB + +/* PHD */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op0B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w DD, r0 + PushWordjmp PHD + +/* PHK */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushBytejmp PHK + +/* PHP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op08: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + S9xPackStatus PHP + extu.b FLAGS, r0 + PushBytejmp PHP + +/* PHX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDAX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b XL, r0 + PushBytejmp PHX + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDAX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w XX, r0 + PushWordjmp PHX + +/* PHY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5AX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b YL, r0 + PushBytejmp PHY + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5AX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w YY, r0 + PushWordjmp PHY + +/* PLA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op68M1: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte PLA + extu.b A,r1 + add r0,A + sub r1,A + SetZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op68M0: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullWord PLA + extu.w r0,A + Set16ZNjmp A + +/* PLB */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAB: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte PLB +#ifndef USE_REGISTER_AS_DB + mov.b r0, DB +#else + mov r0, DB +#endif + extu.b r0,r1 + mov.l ICPU,r2 + shll16 r1 + mov.l r1,@(20,r2) + SetZNjmp r0 + +/* PLD */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op2B: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullWord PLD + mov.w r0 DD + Set16ZNjmp r0 + +/* PLP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op28: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte PLP + extu.b FLAGS,r1 + add r0,FLAGS + mov #IndexFlag,r2 + sub r1,FLAGS + tst r2,r0 + bt .PLP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.PLP16: +#ifdef USE_ASM_SMALL + bra .RTI16 + nop +#else + S9xUnpackStatus PLP + S9xFixCycles PLP + CheckForIrqjmp PLP /* Removed in 1.39. See asmops.h */ +#endif + +/* PLX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFAX1: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte PLX + mov.b r0, XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFAX0: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullWord PLX + mov.w r0, XX + Set16ZNjmp r0 + +/* PLY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7AX1: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte PLY + mov.b r0, YL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7AX0: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullWord PLY + mov.w r0, YY + Set16ZNjmp r0 + +/* SEC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op38: + mov #Carry,r0 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + jmp @r13 + or r0,FLAGS + +/* SED */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpF8: + + mov #Decimal,r0 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + jmp @r13 + or r0,FLAGS + +/* SEI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op78: + mov #IRQ,r0 +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + jmp @r13 + or r0,FLAGS + +/* TAX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAAX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.b A,r0 + mov.b r0, XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpAAX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.w A,r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* TAY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA8X1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.b A,r0 + mov.b r0, YL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpA8X0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.w A,r0 + mov.w r0, YY + Set16ZNjmp r0 + +/* TCD */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.w A,r0 + mov.w r0, DD + Set16ZNjmp r0 + +/* TCS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op1B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + extu.w A,r0 + mov #Emulation/4,r1 + mov.w r0, SS + shll2 r1 + tst r1,FLAGS16 + bt .TCS_EXIT + mov #1,r0 + mov.b r0,SH +.TCS_EXIT: + jmp @r13 + nop + +/* TDC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w DD, r0 + extu.w r0,A + Set16ZNjmp A + +/* TSC */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op3B: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w SS, r0 + extu.w r0,A + Set16ZNjmp A + +/* TSX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBAX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b SL, r0 + mov.b r0, XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBAX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w SS, r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* TXA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8AM1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b XL, r0 + extu.b A,r1 + extu.b r0,r0 + sub r1,A + add r0,A + SetZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op8AM0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w XX, r0 + extu.w r0,A + Set16ZNjmp A + +/* TXS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9A: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w XX, r0 + mov #Emulation/4,r1 + mov.w r0, SS + shll2 r1 + tst r1,FLAGS16 + bt .TXS_EXIT + mov #1,r0 + mov.b r0,SH +.TXS_EXIT: + jmp @r13 + nop + +/* TXY */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9BX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b XL, r0 + mov.b r0, YL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op9BX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w XX, r0 + mov.w r0, YY + Set16ZNjmp r0 + +/* TYA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op98M1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b YL, r0 + extu.b A,r1 + extu.b r0,r0 + sub r1,A + add r0,A + SetZNjmp A + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op98M0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w YY, r0 + extu.w r0,A + Set16ZNjmp A + +/* TYX */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBBX1: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.b YL, r0 + mov.b r0, XL + SetZNjmp r0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpBBX0: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.w YY, r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* XCE */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFB: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov FLAGS16, r0 + mov.w .notemcymask,r1 + and r1,FLAGS16 + tst #Carry,r0 + mov.w .emflag0,r1 + bt .XCE_NO_CARRY + or r1,FLAGS16 +.XCE_NO_CARRY: + tst r1,r0 + bt/s .XCE_NO_EMU + tst r1,FLAGS + add #Carry,FLAGS +.XCE_NO_EMU: + bt/s .XCE_NO_EMULATION2 + mov #IndexFlag,r1 + mov #MemoryFlag|IndexFlag,r0 + or r0,FLAGS + mov #1,r0 + mov.b r0,SH +.XCE_NO_EMULATION2: + tst r1,FLAGS + bt .XCE_NO_INDEX + mov #0,r0 + mov.b r0, XH + mov.b r0, YH +.XCE_NO_INDEX: +#ifdef USE_ASM_SMALL + bra .SEP16 + nop +#else + S9xFixCycles XCE + jmp @r13 + nop +#endif + + .align 2 +.emflag0: + .word Emulation + .align 2 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op00: + mov #1,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,BRKTriggered +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.w .emflag,r0 + tst r0,FLAGS16 + bf .BRK_EMULATION +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushByte BRK1 + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord BRK2 + + S9xPackStatus BRK + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte BRK3 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #12, CYCLES +#else + add #8, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0x1a,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink +.BRK_EMULATION: + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord BRK2 + + S9xPackStatus BRK2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte BRK3 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #6, CYCLES +#else + add #6, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-2,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink + + .align 2 +.notemcymask: + .word ~(Emulation|Carry) +.emflag: + .word Emulation + + .align 5 +.globl S9xOpcode_IRQ_r +S9xOpcode_IRQ_r: + mov.w .emflag1,r0 + sts.l pr,@-r15 + tst r0,FLAGS16 + bf .IRQ_EMULATION +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushByte IRQ1 + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord IRQ2 + + S9xPackStatus IRQ + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte IRQ3 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #12, CYCLES +#else + add #8, CYCLES +#endif + mov.l Settings,r3 + add #82,r3 ! Settings.SA1 + mov.b @r3,r0 + tst r0,r0 + bt .noirqsa1vector + mov.l .FillRAM2,r3 + mov.w .n2209,r0 + add r0,r3 + mov.b @r3,r0 + tst #0x40,r0 + bt .noirqsa1vector + add #5,r3 + lds.l @r15+,pr + mov.w @r3,r4 + mov.l S9xSetPCBase,r3 + jmp @r3 + extu.w r4,r4 +.noirqsa1vector: + mov.l S9xGetWord,r3 + mov #-0x12,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + lds.l @r15+,pr + jmp @r3 + extu.w r0,r4 +.IRQ_EMULATION: + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord IRQ4 + + S9xPackStatus IRQ2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte IRQ5 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #6, CYCLES +#else + add #6, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0x2,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + lds.l @r15+,pr + jmp @r3 + extu.w r0,r4 + + .align 2 +.emflag1: + .word Emulation + + .align 2 +.FillRAM2: + .long FillRAM +.n2209: + .word 0x2209 + + + .align 5 +.globl S9xOpcode_NMI_r + +S9xOpcode_NMI_r: + mov.w .emflag2,r0 + sts.l pr,@-r15 + tst r0,FLAGS16 + bf .NMI_EMULATION +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushByte NMI1 + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord NMI2 + + S9xPackStatus NMI + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte NMI3 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #12, CYCLES +#else + add #8, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0x16,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + lds.l @r15+,pr + jmp @r3 + extu.w r0,r4 +.NMI_EMULATION: + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord NMI4 + + S9xPackStatus NMI2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte NMI5 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #6, CYCLES +#else + add #6, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0x6,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + lds.l @r15+,pr + jmp @r3 + extu.w r0,r4 + + .align 2 +.emflag2: + .word Emulation + + .align 2 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op02: + mov.w .emflag25,r0 + tst r0,FLAGS16 + bf .COP_EMULATION +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushByte COP1 + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord COP2 + + S9xPackStatus COP + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte COP3 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #12, CYCLES +#else + add #8, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0x1c,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink +.COP_EMULATION: + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord COP4 + + S9xPackStatus COP2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte COP5 + mov.l ICPU,r3 + mov #0,r0 + mov.l r0,@(16,r3) +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #6, CYCLES +#else + add #6, CYCLES +#endif + mov.l S9xGetWord,r3 + mov #-0xc,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink + + .align 2 +.emflag25: + .word Emulation + + + .align 2 +/* JML */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDC: + AbsoluteIndirectLong8 JML + mov.l ICPU,r3 + mov.l r0,@(16,r3) + shlr16 r0 + mov.l S9xSetPCBase,r3 +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + Xlink + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op5C: + AbsoluteLong8 JML + mov.l ICPU,r3 + mov.l r0,@(16,r3) + shlr16 r0 + mov.l S9xSetPCBase,r3 +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif + Xlink + +/* JMP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op4C: + Absolute8 JMP + mov.l ICPU,r3 + extu.w r4,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6C: + AbsoluteIndirect8 JMP + mov.l ICPU,r3 + extu.w r4,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op7C: + AbsoluteIndexedIndirect8 JMP +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.l ICPU,r3 + extu.w r4,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op22: +#ifndef USE_REGISTER_AS_PB + mov.b PB, r0 +#else + extu.b PB, r0 +#endif + PushByte JSL_ABSL + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #2,r0 + PushWord JSL_ABSL + AbsoluteLong8 JSL + mov.l ICPU,r3 + mov.l r0,@(16,r3) + shlr16 r0 + mov.l S9xSetPCBase,r3 +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif + Xlink + +/* RTL */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op6B: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullWord RTL + mov.l r0,@-r15 + PullByte RTL + mov.l @r15+,r4 +#ifndef USE_REGISTER_AS_PB + mov.b r0, PB +#else + mov r0, PB +#endif + add #1,r4 + shll16 r0 + extu.w r4,r4 + mov.l ICPU,r3 + mov.l r0,@(16,r3) + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSR ABS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op20: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord JSR_ABS + Absolute8 JSR_ABS + mov.l ICPU,r3 + extu.w r4,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSR ABS INDEXED INDIRECT */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpFC: +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + mov.l PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord JSR_AII + AbsoluteIndexedIndirect8 JSR + mov.l ICPU,r3 + extu.w r4,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* RTS */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op60: +#ifdef VAR_CYCLES + add #6 * 3, CYCLES +#endif + PullWord RTS + add #1,r0 + mov.l ICPU,r3 + extu.w r0,r4 + mov.l @(16,r3),r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* MVN */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op54X1: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES + add #12,CYCLES +#else + add #28,CYCLES +#endif +#endif + mov.b @PC+,r0 +#ifndef USE_REGISTER_AS_DB + mov.b r0,DB +#else + mov r0, DB +#endif + extu.b r0,r0 + mov.l ICPU,r1 + shll16 r0 + mov.l r0,ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + jsr @r3 + add r0,r4 +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + mov r5,r0 +#else + mov r0,r3 + mov.w YY,r0 + extu.w r0,r1 + mov r3,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 +#endif + jsr @r3 + add r1,r4 + mov.b XL,r0 + add #1,r0 + mov.b r0,XL + mov.b YL,r0 + add #1,r0 + mov.b r0,YL + add #-1,A + cmp/pz A + bf/s .MVN_EXIT8 + extu.w A,A + jmp @r13 + add #-3,PC +.MVN_EXIT8: + jmp @r13 + nop + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op54X0: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES + add #12,CYCLES +#else + add #28,CYCLES +#endif +#endif + mov.b @PC+,r0 +#ifndef USE_REGISTER_AS_DB + mov.b r0,DB +#else + mov r0, DB +#endif + extu.b r0,r0 + mov.l ICPU,r1 + shll16 r0 + mov.l r0,ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r1 + add #1,r0 + add r1,r4 + jsr @r3 + mov.w r0,XX +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + add #1,r0 + add r1,r4 + mov.w r0,YY + jsr @r3 + mov r5,r0 +#else + mov r0,r1 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r3 + add #1,r0 + add r3,r4 + mov.l S9xSetByte,r3 + mov.w r0,YY + jsr @r3 + mov r1,r0 +#endif + add #-1,A + cmp/pz A + bf/s .MVN_EXIT16 + extu.w A,A + jmp @r13 + add #-3,PC +.MVN_EXIT16: + jmp @r13 + nop + +/* MVP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op44X1: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES + add #12,CYCLES +#else + add #28,CYCLES +#endif +#endif + mov.b @PC+,r0 +#ifndef USE_REGISTER_AS_DB + mov.b r0,DB +#else + mov r0, DB +#endif + extu.b r0,r0 + mov.l ICPU,r1 + shll16 r0 + mov.l r0,ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + jsr @r3 + add r0,r4 +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + mov r5,r0 + jsr @r3 + add r1,r4 +#else + mov r0,r3 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r1 + mov r3,r0 + mov.l S9xSetByte,r3 + jsr @r3 + add r1,r4 +#endif + mov.b XL,r0 + add #-1,r0 + mov.b r0,XL + mov.b YL,r0 + add #-1,r0 + mov.b r0,YL + add #-1,A + cmp/pz A + bf/s .MVP_EXIT8 + extu.w A,A + jmp @r13 + add #-3,PC +.MVP_EXIT8: + jmp @r13 + nop + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op44X0: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeedx2,r2 + add r2,CYCLES + add #12,CYCLES +#else + add #28,CYCLES +#endif +#endif + mov.b @PC+,r0 +#ifndef USE_REGISTER_AS_DB + mov.b r0,DB +#else + mov r0, DB +#endif + extu.b r0,r0 + mov.l ICPU,r1 + shll16 r0 + mov.l r0,ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r1 + add #-1,r0 + add r1,r4 + jsr @r3 + mov.w r0,XX +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + add #-1,r0 + add r1,r4 + mov.w r0,YY + jsr @r3 + mov r5,r0 +#else + mov r0,r3 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r1 + add #-1,r0 + mov.w r0,YY + mov r3,r0 + mov.l S9xSetByte,r3 + jsr @r3 + add r1,r4 +#endif + add #-1,A + cmp/pz A + bf/s .MVP_EXIT16 + extu.w A,A + jmp @r13 + add #-3,PC +.MVP_EXIT16: + jmp @r13 + nop + +/* REP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpC2: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6,CYCLES +#else + add #14,CYCLES +#endif +#endif + mov.b @PC+,r0 + mov #Zero,r1 + extu.b r0,r0 + mov #-1,r2 + and r0,r1 + not r0,r0 + or r1,r7 + and r0,FLAGS + extu.w r2,r2 + exts.b r0,r1 + mov.w .emflag3,r0 + or r2,r1 + tst r0,FLAGS16 + bt/s .REP_NO_EMU + and r1,r7 + mov #(MemoryFlag | IndexFlag), r0 + or r0, FLAGS + +.REP_NO_EMU: + mov #IndexFlag,r0 + tst r0,FLAGS + bt .REP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.REP16: +#ifdef USE_ASM_SMALL + bra .Op40_FixCycles + nop +#else + S9xFixCycles REP + CheckForIrqjmp REP /* Removed in 1.39. See asmops.h */ +#endif + +/* SEP */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpE2: +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l MemSpeed,r2 + add r2,CYCLES + add #6,CYCLES +#else + add #14,CYCLES +#endif +#endif + mov.b @PC+,r0 + mov #Zero,r1 + extu.b r0,r0 + and r0,r1 + exts.b r0,r2 + shll8 r1 + or r0,FLAGS + shlr2 r1 + extu.w r2,r0 + exts.b r1,r1 + sub r0,r2 + shlr16 r1 + or r2,r7 + mov.w .emflag3,r0 + not r1,r1 + tst r0,FLAGS16 + bt/s .SEP_NO_EMU + and r1,r7 + + mov #(MemoryFlag | IndexFlag), r0 + or r0, FLAGS + +.SEP_NO_EMU: + mov #IndexFlag,r0 + tst r0,FLAGS + bt .SEP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.SEP16: + S9xFixCycles SEP + jmp @r13 + nop + + +/* XBA */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpEB: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + swap.b A,A + SetZNjmp A + +/* RTI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op40: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + PullByte RTI + extu.b FLAGS,r1 + add r0,FLAGS + sub r1,FLAGS + PullWord RTI + mov.w .emflag3,r1 + mov.l r0,@-r15 + tst r1, FLAGS16 + bf .RTI_EMU + PullByte RTI2 + bra .RTI_SKIP_EMU + extu.b r0,r0 +.RTI_EMU: + mov #(MemoryFlag | IndexFlag), r0 + mov.l ICPU,r3 + or r0,FLAGS + /*XXX: HERE xorl %eax, %eax*/ + mov.l @(16,r3),r0 + shlr16 r0 +.RTI_SKIP_EMU: +#ifndef USE_REGISTER_AS_PB + mov.b r0,PB +#else + mov r0,PB +#endif + mov.l @r15+,r4 + shll16 r0 + mov.l ICPU,r3 + mov.l r0,@(16,r3) + + mov.l S9xSetPCBase,r3 + jsr @r3 + or r0,r4 + mov #IndexFlag,r0 + tst r0,FLAGS + bt .RTI16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.RTI16: + S9xUnpackStatus RTI +#ifdef USE_ASM_SMALL +.Op40_FixCycles: +#endif + S9xFixCycles RTI +#ifdef USE_ASM_SMALL +.Op40_CheckForIrqjmp: +#endif + CheckForIrqjmp RTI /* Removed in 1.39. See asmops.h */ + + .align 2 +.emflag3: + .word Emulation + + .align 2 +/* WAI */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpCB: +#ifdef USE_NO_WAIT_WHEN_IRQ +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b IRQActive,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .OpCB_normal + jmp @r13 +#ifdef VAR_CYCLES + add #12,CYCLES +#else + add #2,CYCLES +#endif +#endif + +.OpCB_normal: + mov #1,r0 + add #-1,PC +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0, WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + + mov.l Settings,r1 + mov.b Shutdown,r0 + tst r0,r0 + bt .NoShutdown + +#ifdef ARMAPU + mov #0,r2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent, CYCLES +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + jmp @r13 + mov.l r2,WaitAddress +#else + mov.l IAPU,r1 + mov #0,r2 + mov.b APUExecuting,r0 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent, CYCLES +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + mov.l r2,WaitAddress + bt .EndWAIShutdown + + mov.l ICPU,r1 + mov #0,r0 + mov.b r0, CPUExecuting +.WAITExecAPU: +#ifdef SPC700_C + mov.l IAPU,r1 + SAVE_CYCLES + mov.l APUPC,r0 + + PUSH_REGISTERS + mov.b @r0,r0 +#else + mov.b @APUPC,r0 +#endif + mov.l .WAIAPUCycles,r1 + extu.b r0,r0 + mov.l .WAIApuOpcodes,r2 + shll2 r0 + mov.l @(r0,r1),r4 + mov.l @(r0,r2),r0 + mov.l APU,r1 + mov.l APUCycles,r2 + add r4,r2 + jsr @r0 + mov.l r2,APUCycles +#ifdef SPC700_C + POP_REGISTERS + LOAD_CYCLES +#endif + mov.l APU,r1 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.l NextEvent,r2 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.l APUCycles,r3 + cmp/ge r2,r3 + bf .WAITExecAPU + mov.l ICPU,r1 + mov #1,r0 + jmp @r13 + mov.b r0, CPUExecuting + +.EndWAIShutdown: + jmp @r13 + nop + + .align 2 +.WAIAPUCycles: + .long _S9xAPUCycles +.WAIApuOpcodes: + .long _S9xApuOpcodes +#endif /* ARMAPU */ + +.NoShutdown: + jmp @r13 +#ifdef VAR_CYCLES + add #12, CYCLES +#else + add #2, CYCLES +#endif + .align 2 + +/* ??? */ +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +OpDB: + mov.l Flags,r0 + add #-1,PC + or #DEBUG_MODE_FLAG, r0 + jmp @r13 + mov.l r0,Flags + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#endif +Op42: + jmp @r13 + nop + +.globl _S9xOpcodesM1X1 +.globl _S9xOpcodesE1 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#else + .align 2 +#endif +_S9xOpcodesM1X1: +_S9xOpcodesE1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl _S9xOpcodesM1X0 +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#else + .align 2 +#endif +_S9xOpcodesM1X0: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X0 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X0 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X0 + .long Op85M1 + .long Op86X0 + .long Op87M1 + .long Op88X0 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX0 + .long Op8DM1 + .long Op8EX0 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X0 + .long Op95M1 + .long Op96X0 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX0 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X0 + .long OpA1M1 + .long OpA2X0 + .long OpA3M1 + .long OpA4X0 + .long OpA5M1 + .long OpA6X0 + .long OpA7M1 + .long OpA8X0 + .long OpA9M1 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM1 + .long OpAEX0 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X0 + .long OpB5M1 + .long OpB6X0 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM1 + .long OpBEX0 + .long OpBFM1 + .long OpC0X0 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X0 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X0 + .long OpC9M1 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X0 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X0 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X0 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl _S9xOpcodesM0X0 +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#else + .align 2 +#endif +_S9xOpcodesM0X0: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X0 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X0 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X0 + .long Op85M0 + .long Op86X0 + .long Op87M0 + .long Op88X0 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX0 + .long Op8DM0 + .long Op8EX0 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X0 + .long Op95M0 + .long Op96X0 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX0 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X0 + .long OpA1M0 + .long OpA2X0 + .long OpA3M0 + .long OpA4X0 + .long OpA5M0 + .long OpA6X0 + .long OpA7M0 + .long OpA8X0 + .long OpA9M0 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM0 + .long OpAEX0 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X0 + .long OpB5M0 + .long OpB6X0 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM0 + .long OpBEX0 + .long OpBFM0 + .long OpC0X0 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X0 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X0 + .long OpC9M0 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X0 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X0 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X0 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + +.globl _S9xOpcodesM0X1 +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#else + .align 2 +#endif +_S9xOpcodesM0X1: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X1 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X1 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X1 + .long Op85M0 + .long Op86X1 + .long Op87M0 + .long Op88X1 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX1 + .long Op8DM0 + .long Op8EX1 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X1 + .long Op95M0 + .long Op96X1 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX1 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X1 + .long OpA1M0 + .long OpA2X1 + .long OpA3M0 + .long OpA4X1 + .long OpA5M0 + .long OpA6X1 + .long OpA7M0 + .long OpA8X1 + .long OpA9M0 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM0 + .long OpAEX1 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X1 + .long OpB5M0 + .long OpB6X1 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM0 + .long OpBEX1 + .long OpBFM0 + .long OpC0X1 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X1 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X1 + .long OpC9M0 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X1 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X1 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X1 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + +#ifdef USE_ASM_ALIGN_OPCODES +.align 5 +#else + .align 2 +#endif + diff --git a/src/sh/getset.S b/src/sh/getset.S new file mode 100644 index 0000000..672b1eb --- /dev/null +++ b/src/sh/getset.S @@ -0,0 +1,2288 @@ +/*** Renesas SH assembler ***************************************************** + SH assembler code partly based on x86 assembler code + + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) +******************************************************************************/ + +/****************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +******************************************************************************/ + +.text + + .align 5 +.globl S9xGetByte_r, _S9xGetByte_callback, _S9xGetByte_callback_jmp + + ! GetByte preserves r4 + +#ifdef USE_MMU_DIRECT_INDEX +#ifdef VAR_CYCLES + add #8,CYCLES +#else + nop +#endif + mov.b @r4,r0 + rts + extu.b r0,r0 +#endif +S9xGetByte_r: +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) || defined(USE_BLOCK_RAM) + mov r4,r0 + mov #-MEMMAP_SHIFT,r3 + shld r3,r0 + mov.w .MEMMAP_MSK1,r3 + and r3,r0 ! r0=block +#endif +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l .MemorySpeed0,r3 + mov.b @(r0,r3),r1 +#else + add #8, CYCLES +#endif +#endif +#if defined(CPU_SHUTDOWN) && defined(USE_BLOCK_RAM) + mov.l .BlockIsRAM0,r3 + mov.b @(r0,r3),r2 +#ifdef USE_MMU + tst r2,r2 + bt .GBNotRAM0 + mov.l PCAtOpcodeStart,r0 + mov.l r0,WaitAddress +.GBNotRAM0: +#endif +#endif + +#ifdef USE_MMU +#ifdef USE_MMU_MASK + mov.l .MMUMASK1, r3 + and r4, r3 +#else +#ifdef USE_ASM_PREFETCH + pref @r4 +#endif + mov #-12,r0 + mov r4,r3 + shld r0,r3 + mov #1,r0 + cmp/hi r0,r3 + bf.s _S9xGetByte_callback + add #2,r0 + cmp/hi r0,r3 + bf.s .GBPPU + add #2,r0 + cmp/hi r0,r3 + bf .GBCPU +#endif +_S9xGetByte_callback: +#ifdef USE_MMU_MASK + mov.b @r3,r0 +#else + mov.b @r4,r0 +#endif + rts + extu.b r0,r0 +#ifdef USE_MMU_MASK +.align 2 +.MMUMASK1: .long 0x0fffffff +#endif +.align 2 +_S9xGetByte_callback_jmp: + mov r4,r0 + mov #-MEMMAP_SHIFT,r3 + shld r3,r0 + mov.w .MEMMAP_MSK1,r3 + and r3,r0 ! r0=block +! USE_MMU +#endif + shll2 r0 + mov.l .Map0_MSK1,r3 + mov.l @(r0,r3),r3 +#ifndef USE_MMU + cmp/pz r3 + bt .GBSpecial +#ifdef CPU_SHUTDOWN +#ifdef USE_BLOCK_RAM + tst r2,r2 + bt .GBNotRAM + mov.l PCAtOpcodeStart,r0 + mov.l r0,WaitAddress +.GBNotRAM: + extu.w r4,r2 + add r2,r3 +#else + extu.w r4,r2 + mov.l PCAtOpcodeStart,r0 + add r2,r3 +#ifdef USE_ASM_PREFETCH + pref @r3 +#endif + mov.l r0,WaitAddress +#endif +#else + extu.w r4,r2 + add r2,r3 +#endif +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) +#if defined(USE_BLOCK_RAM) && defined(USE_ASM_PREFETCH) + pref @r3 +#endif + add r1,CYCLES +#endif + mov.b @r3,r0 + rts + extu.b r0,r0 + + .align 2 +.Map0_MSK1: + .long Map +.MEMMAP_MSK1: + .word MEMMAP_MASK + + .align 2 +.GBSpecial: +! USE_MMU +#endif + mova .GBJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 + nop + +#ifdef USE_MMU + .align 2 +.Map0_MSK1: + .long Map +.MEMMAP_MSK1: + .word MEMMAP_MASK + .align 2 +#endif +.GBJmpTable: + .long .GBPPU + .long .GBCPU + .long .GBDSP + .long .GBLSRAM + .long .GBHSRAM + .long .GBNONE + .long .GBDEBUG + .long .GBC4 + .long .GBBWRAM + .long .GBNONE + .long .GBNONE + .long .GBNONE + + .align 2 +.GBPPU: /* MAP_PPU */ +#ifdef USE_ASM_GET_SPC + mov.w .GBPPU_SPC, r0 + mov #63, r3 + add r4, r0 + extu.w r0, r0 + cmp/hi r3, r0 + bt .GBPPU_NO_SPC + +#ifndef USE_ALWAYS_APU_SYNC + mov.l .GBPPU_SPC_SND, r0 + mov.l @r0,r0 + mov #1, r3 + cmp/hi r3,r0 + bt .GBPPU_SPC_MAJOR + mov.l APU,r1 + mov.l APUCycles,r0 + cmp/gt CYCLES,r0 + bf .GBPPU_NO_SPC +.GBPPU_SPC_MAJOR: +#endif + + mov.l IAPU,r2 + mov.l @(12,r2),r1 + add #1, r1 + mov.l r1,@(12,r2) + + mov.l Settings,r0 + add #3,r2 + mov.b @r0,r0 + mov.b r0,@r2 + + mov #3,r1 + mov.l APU,r0 + add #7,r0 + and r4,r1 + mov.b @(r0,r1),r0 + rts + extu.b r0,r0 + +.GBPPU_SPC: .word 0xdec0 + .align 2 +#ifndef USE_ALWAYS_APU_SYNC +.GBPPU_SPC_SND: .long _snes4all_sound_enable +#endif +.GBPPU_NO_SPC: +#endif +#ifdef USE_GETPPU_TABLE + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetPPU_func,r3 + extu.w r4, r0 + shll2 r0 + mov.l @(r0,r3),r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + extu.b r0,r0 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xGetPPU_func: + .long _S9xGetPPU_func +#else +#ifdef VAR_CYCLES +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b InDMA,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .GBPPU_NOADD + add #6, CYCLES +.GBPPU_NOADD: +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetPPU_NOADD,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + extu.b r0,r0 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xGetPPU_NOADD: + .long _S9xGetPPU +#endif + + .align 2 + +.GBCPU: /* MAP_CPU */ +#ifdef VAR_CYCLES + add #6, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetCPU_BG,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + extu.b r0,r0 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xGetCPU_BG: + .long _S9xGetCPU + + .align 2 +.GBDSP: /* MAP_DSP */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetDSP_GB,r3 +#ifndef USE_OLD_DSP1 + mov.l @r3, r3 +#endif + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + extu.b r0,r0 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xGetDSP_GB: +#ifndef USE_OLD_DSP1 + .long _GetDSP +#else + .long _S9xGetDSP +#endif + + .align 2 +.GBLSRAM: /* MAP_LOROM_SRAM */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + mov.l .SRAM_GBLSRAM,r3 + mov.l .SRAMMask_GBLSRAM,r2 + mov.w @r2,r2 + extu.w r2,r2 + and r4,r2 + add r2,r3 + mov.b @r3,r0 + rts + extu.b r0,r0 + + .align 2 +.SRAM_GBLSRAM: + .long SRAM + .align 2 +.SRAMMask_GBLSRAM: + .long SRAMMask + + .align 2 +.GBHSRAM: /* MAP_HIROM_SRAM */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + mov.w .n7fffA_GBHSRAM,r3 + and r4,r3 + mov.w .n6000A,r2 + sub r2,r3 + mov.l .nf0000_GBHSRAM,r2 + and r4,r2 + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM_GBHSRAM,r0 + mov.l .SRAMMask_GBHSRAM,r2 + mov.w @r2,r2 + extu.w r2,r2 + and r3,r2 + mov.b @(r0,r2),r0 + rts + extu.b r0,r0 + + .align 2 +.n7fffA_GBHSRAM: + .word 0x7fff +.n6000A_GBHSRAM: + .word 0x6000 +.nf0000_GBHSRAM: + .long 0xf0000 +.SRAMMask_GBHSRAM: + .long SRAMMask +.SRAM_GBHSRAM: + .long SRAM + + .align 2 +.GBNONE: + extu.w r4,r0 +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + rts + shlr8 r0 + + .align 2 +.GBDEBUG: /* MAP_DEBUG */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + rts + mov #0,r0 + + .align 2 +.GBC4: /* MAP_C4 */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + mov.l .RAMGetC4_GBC4, r0 + mov.b @r0, r0 + rts + extu.b r0, r0 + .align 2 +.RAMGetC4_GBC4: + .long C4RAM - 0x6000 + + .align 2 +.GBBWRAM: /* MAP_BWRAM */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + mov.w .n7fffA,r3 + and r4,r3 + mov.w .n6000A,r2 + sub r2,r3 + mov.l .BWRAM_GBBWRAM,r0 + mov.l @r0, r0 + mov.b @(r0,r3),r0 + rts + extu.b r0,r0 + + .align 2 +.n7fffA: + .word 0x7fff +.n6000A: + .word 0x6000 +.BWRAM_GBBWRAM: + .long BWRAM + + .align 5 + +.globl S9xGetWord_r, _S9xGetWord_callback, _S9xGetWord_callback_jmp + + ! GetWord preserves r4 +#ifdef USE_MMU_DIRECT_INDEX +#ifdef VAR_CYCLES + add #16,CYCLES +#else + nop +#endif + mov.b @r4+,r0 + extu.b r0, r3 + mov.b @r4,r0 + shll8 r0 + or r3,r0 + rts + extu.w r0,r0 +#endif +S9xGetWord_r: +#if !defined(USE_MMU) || defined(USE_MMU_BOUNDARY) +#if 0 + mov r4,r2 + mov.w .n1fff,r3 + and r3,r2 + cmp/eq r3,r2 + bf .GWNotAtBlockBoundary + sts.l pr,@-r15 + bsr S9xGetByte_r + nop + mov.l r0,@-r15 + bsr S9xGetByte_r + add #1,r4 + mov.l @r15+,r2 + shll8 r0 + lds.l @r15+,pr + add #-1,r4 + rts + or r2,r0 + + .align 2 +.n1fff: + .word 0x1fff + .align 2 + +.GWNotAtBlockBoundary: +#endif +#endif +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) || defined(USE_BLOCK_RAM) + mov r4,r0 + mov #-MEMMAP_SHIFT,r3 + shld r3,r0 + mov.w .MEMMAP_MSK15,r3 + and r3,r0 ! r0=block +#endif +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l .MemorySpeed0,r3 + mov.b @(r0,r3),r1 +#else + add #16,CYCLES +#endif +#endif +#if defined(CPU_SHUTDOWN) && defined(USE_BLOCK_RAM) + mov.l .BlockIsRAM0,r3 + mov.b @(r0,r3),r2 +#ifdef USE_MMU + tst r2,r2 + bt .GWNotRAM + mov.l PCAtOpcodeStart,r2 + mov.l r2,WaitAddress +.GWNotRAM: +#endif +#endif + +#ifdef USE_MMU +#ifdef USE_MMU_MASK + mov.l .MMUMASK2, r3 + and r4, r3 + mov r3, r2 +#else +#ifdef USE_ASM_PREFETCH + pref @r4 +#endif + mov r4, r2 + mov #-12,r0 + mov r4,r3 + shld r0,r3 + mov #1,r0 + cmp/hi r0,r3 + bf.s _S9xGetWord_callback + add #2,r0 + cmp/hi r0,r3 + bf.s .GWPPU + add #2,r0 + cmp/hi r0,r3 + bf .GWCPU +#endif +_S9xGetWord_callback: +#ifdef USE_MMU_MASK + mov.b @r3, r0 +#else + mov.b @r4, r0 +#endif + add #1, r2 + mov.b @r2, r2 + extu.b r0, r0 + extu.b r2, r2 + shll8 r2 + rts + or r2, r0 +#ifdef USE_MMU_MASK +.align 2 +.MMUMASK2: .long 0x0fffffff +#endif +.align 2 +_S9xGetWord_callback_jmp: + mov r4,r0 + mov #-MEMMAP_SHIFT,r3 + shld r3,r0 + mov.w .MEMMAP_MSK15,r3 + and r3,r0 ! r0=block +! USE_MMU +#endif + shll2 r0 + mov.l .Map0_MSK15,r3 + mov.l @(r0,r3),r3 +#ifndef USE_MMU + cmp/pz r3 + bt .GWSpecial +#ifdef CPU_SHUTDOWN +#ifdef USE_BLOCK_RAM + tst r2,r2 + bt .GWNotRAM + mov.l PCAtOpcodeStart,r2 + mov.l r2,WaitAddress +.GWNotRAM: + extu.w r4,r2 + add r2,r3 +#else + extu.w r4,r2 + mov.l PCAtOpcodeStart,r0 + add r2,r3 +#ifdef USE_ASM_PREFETCH + pref @r3 +#endif + mov.l r0,WaitAddress +#endif +#else + extu.w r4,r2 + add r2,r3 +#endif +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) +#if defined(USE_BLOCK_RAM) && defined(USE_ASM_PREFETCH) + pref @r3 +#endif + add r1,CYCLES + add r1,CYCLES +#endif + mov.b @r3+,r2 + mov.b @r3,r0 + extu.b r2,r2 + shll8 r0 + or r2,r0 + rts + extu.w r0,r0 + + .align 2 +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) +.MemorySpeed0: + .long MemorySpeed +#endif +#if defined(CPU_SHUTDOWN) && defined(USE_BLOCK_RAM) +.BlockIsRAM0: + .long BlockIsRAM +#endif +.Map0_MSK15: + .long Map +.MEMMAP_MSK15: + .word MEMMAP_MASK + .align 2 + +.GWSpecial: +! USE_MMU +#endif + mova .GWJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 + nop + + .align 2 +#ifdef USE_MMU +.Map0_MSK15: + .long Map +.MEMMAP_MSK15: + .word MEMMAP_MASK + .align 2 +#endif +.GWJmpTable: + .long .GWPPU + .long .GWCPU + .long .GWDSP + .long .GWLSRAM + .long .GWHSRAM + .long .GWNONE + .long .GWDEBUG + .long .GWC4 + .long .GWBWRAM + .long .GWNONE + .long .GWNONE + .long .GWNONE + + .align 2 +.GWPPU: /* MAP_PPU */ +#ifdef USE_GETPPU_TABLE + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetPPU_func2,r3 + extu.w r4,r0 + shll2 r0 + mov.l @(r0,r3),r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15,r4 + mov.l r0,@-r15 + mov.l .S9xGetPPU_func2,r3 + add #1,r4 + extu.w r4,r0 + shll2 r0 + mov.l @(r0,r3),r3 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r1 + shll8 r0 + mov.l @r15+,r4 + or r1,r0 + lds.l @r15+,pr + POP_REGISTERS + LOAD_CYCLES + rts + extu.w r0,r0 + .align 2 +.S9xGetPPU_func2: + .long _S9xGetPPU_func +#else +#ifdef VAR_CYCLES +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b InDMA,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .GWPPU_NOADD + add #12, CYCLES +.GWPPU_NOADD: +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetPPU,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15,r4 + mov.l r0,@-r15 + mov.l .S9xGetPPU,r3 + add #1,r4 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r1 + shll8 r0 + mov.l @r15+,r4 + or r1,r0 + lds.l @r15+,pr + POP_REGISTERS + LOAD_CYCLES + rts + extu.w r0,r0 + + .align 2 +.S9xGetPPU: + .long _S9xGetPPU +#endif + + .align 2 +.GWCPU: /* MAP_CPU */ +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetCPU,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15,r4 + mov.l r0,@-r15 + mov.l .S9xGetCPU,r3 + add #1,r4 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r1 + shll8 r0 + mov.l @r15+,r4 + or r1,r0 + lds.l @r15+,pr + POP_REGISTERS + LOAD_CYCLES + rts + extu.w r0,r0 + + .align 2 +.S9xGetCPU: + .long _S9xGetCPU + + .align 2 +.GWDSP: /* MAP_DSP */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetDSP,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15,r4 + mov.l r0,@-r15 + mov.l .S9xGetDSP,r3 + add #1,r4 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r1 + shll8 r0 + mov.l @r15+,r4 + or r1,r0 + lds.l @r15+,pr + POP_REGISTERS + LOAD_CYCLES + rts + extu.w r0,r0 + + .align 2 +.GWLSRAM: /* MAP_LOROM_SRAM */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + mov.l .SRAM0,r0 + mov.l .SRAMMask0,r2 + mov.w @r2,r2 + extu.w r2,r2 + mov r2,r1 + and r4,r1 + mov.b @(r0,r1),r1 + add #1,r4 + extu.b r1,r1 + and r4,r2 + add #-1,r4 + mov.b @(r0,r2),r0 + shll8 r0 + or r1,r0 + rts + extu.w r0,r0 + + .align 2 +.GWHSRAM: /* MAP_HIROM_SRAM */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + mov.w .n7fff_GWHSRAM,r3 + and r4,r3 + mov.w .n6000_GWHSRAM,r2 + sub r2,r3 + mov.l .nf0000_GWHSRAM,r2 + and r4,r2 + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM0,r1 + mov.l .SRAMMask0,r2 + mov.w @r2,r2 + extu.w r2,r2 + and r3,r2 + add r2,r1 + mov.b @r1+,r2 + mov.b @r1,r0 + extu.b r2,r2 + shll8 r0 + or r2,r0 + rts + extu.w r0,r0 + + .align 2 +.n7fff_GWHSRAM: + .word 0x7fff +.n6000_GWHSRAM: + .word 0x6000 +.nf0000_GWHSRAM: + .long 0xf0000 + + .align 2 +.GWNONE: + extu.w r4,r0 + extu.b r4,r1 + mov r0,r2 +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + shlr8 r0 + add r2,r0 + rts + sub r1,r0 + + .align 2 + +.GWDEBUG: /* MAP_DEBUG */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + rts + mov #0,r0 + + .align 2 +.GWC4: +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + mov.l .RAMGetC4, r0 + mov.b @r0, r2 + extu.b r2, r2 + mov r2, r0 + shll8 r2 + rts + or r2, r0 +.RAMGetC4: + .long C4RAM - 0x6000 + + .align 2 + +.GWBWRAM: /* MAP_BWRAM */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + mov.w .n7fff,r3 + and r4,r3 + mov.w .n6000,r2 + sub r2,r3 + mov.l .BWRAM2,r2 + mov.l @r2,r2 + add r2,r3 + mov.b @r3+,r2 + mov.b @r3,r0 + extu.b r2,r2 + shll8 r0 + or r2,r0 + rts + extu.w r0,r0 + + .align 2 +.BWRAM2: + .long BWRAM +.S9xGetDSP: +#ifndef USE_OLD_DSP1 +.global _GetDSP +_GetDSP: + .long 0 +#else + .long _S9xGetDSP +#endif +.S9xGetC4: + .long _S9xGetC4 +.SRAM0: + .long SRAM +.n7fff: + .word 0x7fff +.n6000: + .word 0x6000 + + .align 5 +.globl S9xSetByte_r, _S9xSetByte_callback, _S9xSetByte_callback_jmp +#ifdef USE_MMU_DIRECT_INDEX +#ifdef VAR_CYCLES + add #8,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 + mov.l r3,WaitAddress +#else + nop + nop +#endif + rts + mov.b r0,@r4 + nop +#endif +S9xSetByte_r: +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) + mov r4,r2 +#endif +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK175,r3 + and r3,r2 ! r2 = block +#endif +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l .MemorySpeed3,r3 + add r2,r3 +#ifndef USE_ASM_R5 +#error IMPOSIBLE_NO_R5_Y_MEMORY_SPEED +#endif + mov.b @r3,r5 +#ifdef USE_MMU + add r5, CYCLES +#endif +#else + add #8,CYCLES +#endif +#endif + +#ifdef USE_MMU +#ifdef USE_MMU_MASK + mov.l .MMUMASK3, r3 + and r4, r3 +#else + mov #-12,r2 + mov r4,r3 + shld r2,r3 + mov #1,r2 + cmp/hi r2,r3 + bf.s _S9xSetByte_callback + add #2,r2 + cmp/hi r2,r3 + bf.s .SBPPU_direct + add #2,r2 + cmp/hi r2,r3 + bf .SBCPU_direct +#endif +_S9xSetByte_callback: + rts +#ifdef USE_MMU_MASK + mov.b r0, @r3 +#else + mov.b r0, @r4 +#endif +#ifdef USE_MMU_MASK +.align 2 +.MMUMASK3: .long 0x0fffffff +#endif +.align 2 +_S9xSetByte_callback_jmp: + mov r4,r2 + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK175,r3 + and r3,r2 ! r2 = block +! USE_MMU +#endif + shll2 r2 + mov.l .WriteMap0,r3 + add r2,r3 + mov.l @r3,r3 +#ifndef USE_MMU + cmp/pz r3 + bt .SBSpecial + extu.w r4,r2 +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + add r5, CYCLES +#endif +#ifdef CPU_SHUTDOWN + mov.l SA1,r1 + add r2,r3 + mov.l SA1WaitByteAddress1,r2 + cmp/eq r2,r3 + bt .Matched + mov.l SA1WaitByteAddress2,r2 + cmp/eq r2,r3 + bf .NoMatch +.Matched: + mov.l SA1Opcodes,r2 + mov.b r0,@r3 + mov #0,r0 + cmp/hi r0,r2 + mov.l r0,SA1WaitCounter + rotcl r0 + rts + mov.b r0,SA1Executing +.NoMatch: + rts + mov.b r0,@r3 +#else + add r2,r3 + rts + mov.b r0,@r3 +#endif + .align 2 + +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) +.MemorySpeed3: + .long MemorySpeed +#endif +.MEMMAP_MSK175: + .word MEMMAP_MASK + .align 2 + +.SBSpecial: +! USE_MMU +#endif + mov r4,r2 + extu.b r0,r4 + mova .SBJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 +#ifdef USE_ASM_R5 + extu.w r2,r5 +#else + nop +#endif + .align 2 +#ifdef USE_MMU +.MEMMAP_MSK175: + .word MEMMAP_MASK + .align 2 +#endif +.SBJmpTable: + .long .SBPPU + .long .SBCPU + .long .SBDSP + .long .SBLSRAM + .long .SBHSRAM + .long .SBNONE + .long .SBDEBUG + .long .SBC4 + .long .SBBWRAM + .long .SBNONE + .long .SBNONE + .long .SBNONE + + .align 2 +#ifdef USE_MMU +.SBPPU_direct: + mov r4,r2 + extu.b r0,r4 +#endif +.SBPPU: /* MAP_PPU */ +#ifdef USE_ASM_SET_MATRIX + mov.w .SBPPU_MATRIX, r0 + mov #3, r3 +#ifdef USE_ASM_R5 + add r5, r0 +#else + add r2, r0 +#endif + extu.w r0, r0 + cmp/hi r3, r0 + bt .SBPPU_NO_MATRIX +#ifndef USE_ASM_R5 + extu.w r2, r3 +#else + extu.w r5, r3 +#endif + and #3, r0 + shll r0 + mov.l PPU,r1 + add r0, r1 + add #62, r1 + extu.b r4, r2 + shll8 r2 + mov.w @r1, r0 + shlr8 r0 + extu.b r0, r0 + or r2,r0 + mov.w r0,@r1 + + mov.l PPU,r1 + mov #1,r0 + add #51,r1 + mov.b r0,@r1 + + mov.l .SBPPU_FillRAM,r0 + rts + mov.b r4,@(r0,r3) + +.SBPPU_FillRAM: + .long FillRAM +.SBPPU_MATRIX: .word 0xdee5 + .align 2 +.SBPPU_NO_MATRIX: +#endif +#ifdef USE_SETPPU_TABLE + mov.l .S9xSetPPU_func,r3 +#ifdef USE_ASM_R5 + extu.w r5, r0 +#else + extu.w r2, r0 +#endif + shll2 r0 + add r0,r3 +#ifdef USE_ASM_PREFETCH + pref @r3 +#endif + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l @r3,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS_i + rts + POP_REGISTERS_f + +#else +#ifdef VAR_CYCLES +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b InDMA,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .SBPPU_NOADD + add #6, CYCLES +.SBPPU_NOADD: +#endif + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetPPU,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS_i + rts + POP_REGISTERS_f +#endif + + .align 2 +#ifdef USE_MMU +.SBCPU_direct: + mov r4,r2 + extu.b r0,r4 +#endif +.SBCPU: /* MAP_CPU */ +#ifdef VAR_CYCLES + add #6, CYCLES +#endif +#ifdef USE_REGISTER_LEFT_TIMESLICE + mov #2, USE_REGISTER_LEFT_TIMESLICE +#else + mov.l .left_timeslice,r0 + mov #1, r1 + mov.l r1,@r0 +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetCPU,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +#ifndef USE_REGISTER_LEFT_TIMESLICE +.left_timeslice: .long left_timeslice +#endif + +.SBDSP: /* MAP_DSP */ +#ifdef VAR_CYCLES + add #8, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetDSP,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.SBLSRAM: /* MAP_LOROM_SRAM */ + mov.l .SRAM1,r0 +#ifdef USE_ASM_R5 + mov.l .SRAMMask0,r5 + mov.l @r5,r5 + extu.w r5,r5 + tst r5,r5 + and r5,r2 +#else + mov.l .SRAMMask0,r3 + mov.l @r3,r3 + extu.w r3,r3 + tst r3,r3 + and r3,r2 +#endif + bt .SBLSRAM_SKIP + mov.b r4,@(r0,r2) +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +.SBLSRAM_SKIP: + rts +#ifdef VAR_CYCLES + add #8, CYCLES +#else + nop +#endif + .align 2 + +.SBHSRAM: /* MAP_HIROM_SRAM */ + mov.w .n7fff15,r3 + and r2,r3 +#ifdef USE_ASM_R5 + mov.w .n600015,r5 + sub r5,r3 + mov.l .nf00002,r5 + and r5,r2 +#else + mov.w .n600015,r0 + sub r0,r3 + mov.l .nf00002,r0 + and r0,r2 +#endif + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM1,r0 + mov.l .SRAMMask0,r2 + mov.l @r2,r2 + extu.w r2,r2 + tst r2,r2 + and r3,r2 + bt .SBHSRAM_SKIP + mov.b r4,@(r0,r2) +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +.SBHSRAM_SKIP: + rts +#ifdef VAR_CYCLES + add #8, CYCLES +#else + nop +#endif + .align 2 +.SRAM1: + .long SRAM +.SRAMMask0: + .long SRAMMask + .align 2 + +.SBNONE: +.SBDEBUG: /* MAP_DEBUG */ + rts +#ifdef VAR_CYCLES + add #8, CYCLES +#else + nop +#endif + .align 2 + +.SBC4: /* MAP_C4 */ + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetC4,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS + rts +#ifdef VAR_CYCLES + add #6, CYCLES +#else + nop +#endif + .align 2 + + +.SBBWRAM: /* MAP_BWRAM */ + mov.w .n7fff15,r0 + and r2,r0 + mov.w .n600015,r2 + sub r2,r0 + mov.l BWRAM,r2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r2, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + mov.b r4,@(r0,r2) + rts +#ifdef VAR_CYCLES + add #8, CYCLES +#else + nop +#endif + .align 2 + +.n7fff15: + .word 0x7fff +.n600015: + .word 0x6000 + + .align 5 +.globl S9xSetWord_r, _S9xSetWord_callback, _S9xSetWord_callback_jmp + +#ifdef USE_MMU_DIRECT_INDEX +#ifdef VAR_CYCLES + add #8,CYCLES +#else + nop +#endif +#ifdef CPU_SHUTDOWN + mov #0,r3 + mov.l r3,WaitAddress +#else + nop + nop +#endif + mov.b r0,@r4 + shlr8 r0 + rts + mov.b r0,@(1,r4) + nop +#endif +S9xSetWord_r: +#ifdef CPU_SHUTDOWN + mov #0,r3 +#endif +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) + mov r4,r2 +#endif +#ifdef CPU_SHUTDOWN + mov.l r3,WaitAddress +#endif +#if !defined(USE_MMU) || defined(USE_MEMORY_SPEED) + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK19,r3 + and r3,r2 +#endif +#ifdef VAR_CYCLES +#ifdef USE_MEMORY_SPEED + mov.l .MemorySpeed2,r3 + add r2,r3 +#ifndef USE_ASM_R5 +#error IMPOSIBLE_NO_R5_Y_MEMORY_SPEED +#endif + mov.b @r3,r5 +#ifdef USE_MMU + add r5, CYCLES + add r5, CYCLES +#endif +#else + add #16,CYCLES +#endif +#endif + +#ifdef USE_MMU +#ifdef USE_MMU_MASK + mov.l .MMUMASK4, r3 + and r4, r3 +#else + mov #-12,r2 + mov r4,r3 + shld r2,r3 + mov #1,r2 + cmp/hi r2,r3 + bf.s _S9xSetWord_callback + add #2,r2 + cmp/hi r2,r3 + bf.s .SWPPU_direct + add #2,r2 + cmp/hi r2,r3 + bf .SWCPU_direct +#endif +_S9xSetWord_callback: +#ifdef USE_MMU_MASK + mov.b r0,@r3 +#else + mov.b r0,@r4 +#endif + shlr8 r0 + rts + mov.b r0,@(1,r4) +#ifdef USE_MMU_MASK +.align 2 +.MMUMASK4: .long 0x0fffffff +#endif +.align 2 +_S9xSetWord_callback_jmp: + mov r4,r2 + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK19,r3 + and r3,r2 +! USE_MMU +#endif + shll2 r2 + mov.l .WriteMap0,r3 + add r2,r3 + mov.l @r3,r3 +#ifndef USE_MMU + cmp/pz r3 + bt .SWSpecial + extu.w r4,r2 +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + add r5, CYCLES + add r5, CYCLES +#endif +#ifdef CPU_SHUTDOWN + mov.l SA1,r1 + add r2,r3 + mov.l SA1WaitByteAddress1,r2 + mov.b r0,@r3 + cmp/eq r2,r3 + bt/s .Matched2 + shlr8 r0 + mov.l SA1WaitByteAddress2,r2 + cmp/eq r2,r3 + bf .NoMatch2 +.Matched2: + mov.l SA1Opcodes,r2 + mov.b r0,@(1,r3) + mov #0,r0 + cmp/hi r0,r2 + mov.l r0,SA1WaitCounter + rotcl r0 + rts + mov.b r0,SA1Executing +.NoMatch2: + rts + mov.b r0,@(1,r3) +#else + add r2,r3 + mov.b r0,@r3 + shlr8 r0 + rts + mov.b r0,@(1,r3) +#endif + + .align 2 +.WriteMap0: + .long WriteMap +.MEMMAP_MSK19: + .word MEMMAP_MASK + .align 2 + +.SWSpecial: +! USE_MMU +#endif + mov r4,r2 + extu.w r0,r4 + mova .SWJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 +#ifdef USE_ASM_R5 + extu.w r2,r5 +#else + nop +#endif + .align 2 +#ifdef USE_MMU +.WriteMap0: + .long WriteMap +.MEMMAP_MSK19: + .word MEMMAP_MASK + .align 2 +#endif +.SWJmpTable: + .long .SWPPU + .long .SWCPU + .long .SWDSP + .long .SWLSRAM + .long .SWHSRAM + .long .SWNONE + .long .SWDEBUG + .long .SWC4 + .long .SWBWRAM + .long .SWNONE + .long .SWNONE + .long .SWNONE + + .align 2 +#ifdef USE_MMU +.SWPPU_direct: + mov r4,r2 + extu.w r0,r4 +#endif +.SWPPU: /* MAP_PPU */ +#ifdef USE_ASM_SET_MATRIX + mov.w .SWPPU_MATRIX, r0 + mov #3, r3 +#ifdef USE_ASM_R5 + add r5, r0 +#else + add r2, r0 +#endif + extu.w r0, r0 + cmp/hi r3, r0 + bt .SWPPU_NO_MATRIX +#ifndef USE_ASM_R5 + extu.w r2, r3 +#else + extu.w r5, r3 +#endif + and #3, r0 + shll r0 + mov.l PPU,r1 + add r0, r1 + add #62, r1 + extu.w r4, r2 + shlr8 r2 + shll8 r2 + mov.w @r1, r0 + shlr8 r0 + extu.b r0, r0 + or r2,r0 + mov.w r0,@r1 + + add #2,r1 + extu.b r4,r2 + mov.w @r1, r0 + shlr8 r0 + extu.b r0, r0 + or r2,r0 + mov.w r0,@r1 + + mov.l PPU,r1 + mov #1,r0 + add #51,r1 + mov.b r0,@r1 + + mov.l .FillRAM0,r0 + rts + mov.b r4,@(r0,r3) + +.SWPPU_MATRIX: .word 0xdee5 + .align 2 +.SWPPU_NO_MATRIX: +#endif +#ifdef USE_SETPPU_TABLE + mov.l .S9xSetPPU_func,r3 +#ifdef USE_ASM_R5 + extu.w r5,r0 +#else + extu.w r2,r0 +#endif + shll2 r0 + add r0,r3 +#ifdef USE_ASM_PREFETCH + pref @r3 +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l @r3,r3 +#ifndef USE_ASM_R5 + extu.w r2,r5 +#endif + mov.l r4,@-r15 + mov.l r5,@-r15 + jsr @r3 + extu.b r4,r4 + mov.l .S9xSetPPU_func,r3 + mov.l @r15+,r5 + mov.l @r15+,r4 + add #1,r5 + extu.w r5,r0 + shll2 r0 + mov.l @(r0,r3),r3 + shlr8 r4 + jsr @r3 + extu.w r5,r5 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xSetPPU_func: + .long _S9xSetPPU_func + +#else +#ifdef VAR_CYCLES +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b InDMA,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bf .SWPPU_NOADD + add #12, CYCLES +.SWPPU_NOADD: +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetPPU,r3 +#ifndef USE_ASM_R5 + extu.w r2,r5 +#endif + mov.l r4,@-r15 + mov.l r5,@-r15 + jsr @r3 + extu.b r4,r4 + mov.l .S9xSetPPU,r3 + mov.l @r15+,r5 + mov.l @r15+,r4 + add #1,r5 + shlr8 r4 + jsr @r3 + extu.w r5,r5 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xSetPPU: + .long _S9xSetPPU +#endif + + .align 2 +#ifdef USE_MMU +.SWCPU_direct: + mov r4,r2 + extu.w r0,r4 +#endif +.SWCPU: /* MAP_CPU */ +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetCPU,r3 + mov.l r4,@-r15 +#ifndef USE_ASM_R5 + extu.w r2,r5 +#endif + mov.l r5,@-r15 + jsr @r3 + extu.b r4,r4 + mov.l .S9xSetCPU,r3 + mov.l @r15+,r5 + mov.l @r15+,r4 + add #1,r5 + shlr8 r4 + jsr @r3 + extu.w r5,r5 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xSetCPU: + .long _S9xSetCPU + .align 2 +.SWDSP: /* MAP_DSP */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetDSP,r3 + mov.l r4,@-r15 +#ifndef USE_ASM_R5 + extu.w r2,r5 +#endif + mov.l r5,@-r15 + jsr @r3 + extu.b r4,r4 + mov.l .S9xSetDSP,r3 + mov.l @r15+,r5 + mov.l @r15+,r4 + add #1,r5 + shlr8 r4 + jsr @r3 + extu.w r5,r5 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 +.S9xSetDSP: +#ifndef USE_OLD_DSP1 +.global _SetDSP +_SetDSP: + .long 0 +#else + .long _S9xSetDSP +#endif + .align 2 +.SWLSRAM: /* MAP_LOROM_SRAM */ + mov.l .SRAM2,r0 +#ifdef USE_ASM_R5 + mov.l .SRAMMask1,r5 + mov.l @r5,r5 + extu.w r5,r1 + tst r1,r1 + mov r1,r5 + and r2,r1 + bt/s .SWLSRAM_SKIP + mov.b r4,@(r0,r1) + add #1,r2 + shlr8 r4 + and r2,r5 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + rts + mov.b r4,@(r0,r5) +#else + mov.w SRAMMask,r1 + extu.w r1,r1 + tst r1,r1 + mov r1,r3 + and r2,r1 + bt/s .SWLSRAM_SKIP + mov.b r4,@(r0,r1) + add #1,r2 + shlr8 r4 + and r2,r3 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + rts + mov.b r4,@(r0,r3) +#endif +.SWLSRAM_SKIP: + rts +#ifdef VAR_CYCLES + add #16, CYCLES +#else + nop +#endif +#ifdef USE_ASM_R5 + .align 2 +.SRAMMask1: + .long SRAMMask +#endif + .align 2 + +.SWHSRAM: /* MAP_HIROM_SRAM */ + mov.w .n7fff2,r3 + and r2,r3 +#ifdef USE_ASM_R5 + mov.w .n60003,r5 + sub r5,r3 + mov.l .nf00002,r5 + and r5,r2 +#else + mov.w .n60003,r0 + sub r0,r3 + mov.l .nf00002,r0 + and r0,r2 +#endif + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM2,r0 + mov.w SRAMMask,r2 + extu.w r2,r2 + tst r2,r2 + and r3,r2 + bt .SWHSRAM_SKIP + mov.b r4,@(r0,r2) + add #1,r2 + shlr8 r4 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + rts + mov.b r4,@(r0,r2) +.SWHSRAM_SKIP: + rts +#ifdef VAR_CYCLES + add #16, CYCLES +#else + nop +#endif + .align 2 +.nf00002: + .long 0xf0000 +.global SRAMMask +SRAMMask: + .long 0 + .align 2 + +.SWNONE: +.SWDEBUG: /* MAP_DEBUG */ + rts +#ifdef VAR_CYCLES + add #16, CYCLES +#else + nop +#endif + .align 2 + +.SWC4: /* MAP_C4 */ +#ifdef VAR_CYCLES + add #12, CYCLES +#endif + SAVE_CYCLES + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetC4,r3 + mov.l r4,@-r15 +#ifndef USE_ASM_R5 + extu.w r2,r5 +#endif + mov.l r5,@-r15 + jsr @r3 + extu.b r4,r4 + mov.l .S9xSetC4,r3 + mov.l @r15+,r5 + mov.l @r15+,r4 + add #1,r5 + shlr8 r4 + jsr @r3 + extu.w r5,r5 + lds.l @r15+,pr + POP_REGISTERS + rts + LOAD_CYCLES + + .align 2 + +.SWBWRAM: /* MAP_BWRAM */ +#ifdef VAR_CYCLES + add #16, CYCLES +#endif + mov.w .n7fff2,r3 + and r2,r3 + mov.w .n60002,r2 + sub r2,r3 + mov.l BWRAM,r0 + mov.b r4,@(r0,r3) + add #1,r3 + shlr8 r4 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r4, SRAMModified +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + rts + mov.b r4,@(r0,r3) + .align 2 +.global BWRAM +BWRAM: + .long 0 +.S9xSetC4: + .long _S9xSetC4 + + .align 5 +.globl S9xSetPCBase_r + +S9xSetPCBase_r: + mov r4,r2 + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK2,r3 + and r3,r2 ! r2 = block +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov.l .MemorySpeed2,r3 + add r2,r3 + mov.b @r3,r1 +#endif + + shll2 r2 + mov.l .Map2,r3 + add r2,r3 + mov.l @r3,r3 + cmp/pz r3 + bt .SPCSpecial + extu.w r4,r2 +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov.l r1,MemSpeed + shll r1 + mov.l r1,MemSpeedx2 +#endif +#ifdef USE_MMU + mov.l .SPCMask,r3 + and r4,r3 + mov.l r3,PCBase +#ifdef USE_MMU_MASK + mov.l .MMUMASK5, r3 + and r4,r3 + rts + mov r3,PC +#else + rts + mov r4,PC +#endif +.align 2 +.SPCMask: + .long 0x0fff0000 +#ifdef USE_MMU_MASK +.MMUMASK5: .long 0x0fffffff +#endif +#else + mov.l r3,PCBase + add r2,r3 + rts + mov r3,PC +#endif + +.SPCSpecial: + mova .SPCJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 + nop + + .align 2 +.SPCJmpTable: + .long .SPCPPU + .long .SPCCPU + .long .SPCDSP + .long .SPCLSRAM + .long .SPCHSRAM + .long .SPCNONE + .long .SPCDEBUG + .long .SPCC4 + .long .SPCBWRAM + .long .SPCNONE + .long .SPCNONE + .long .SPCNONE + +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) +.MemorySpeed2: + .long MemorySpeed +#endif +.n7fff2: + .word 0x7fff +.n60003: + .word 0x6000 + + .align 2 +.SPCPPU: /* MAP_PPU */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #6,r1 + mov.l r1, MemSpeed + mov #12,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .FillRAM0,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAM0,PC + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SPCCPU: /* MAP_CPU */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #6,r1 + mov.l r1, MemSpeed + mov #12,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .FillRAM0,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAM0,PC + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SPCDSP: /* MAP_DSP */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .FillRAM0,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAM0,PC + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SPCLSRAM: /* MAP_LOROM_SRAM */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .SRAM2,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .SRAM2,PC + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SPCHSRAM: /* MAP_HIROM_SRAM */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .SRAM2,r3 + mov.w .n60002,r2 +// mov.l r3,PC + mov.l .SRAM2,PC + add r2,PC + extu.w r4,r2 + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SPCNONE: +.SPCDEBUG: /* MAP_DEBUG */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: + mov.l .SRAM2,PC + extu.w r4,r2 + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SRAM2: + .long SRAM + .align 2 +.SPCC4: /* MAP_C4 */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: +// mov.l .C4RAM0, r3 + mov.w .n60002,r2 +// mov.l r3,PC + mov.l .C4RAM0,PC + sub r2,PC + extu.w r4,r2 + mov.l PC,PCBase + rts + add r2,PC + + + .align 2 +.SPCBWRAM: /* MAP_BWRAM */ +#if defined(VAR_CYCLES) && defined(USE_MEMORY_SPEED) + mov #8,r1 + mov.l r1, MemSpeed + mov #16,r1 + mov.l r1, MemSpeedx2 +#endif +// CUIDADO: + mov.l .SRAM2_,r3 + mov.w .n60002,r2 + add r2,r3 + extu.w r4,r2 +// mov.l r3,PC + mov r3,PC + mov.l PC,PCBase + rts + add r2,PC + + .align 2 +.SRAM2_: + .long SRAM +.Map2: + .long Map +.FillRAM0: + .long FillRAM +.C4RAM0: + .long C4RAM +.n60002: + .word 0x6000 +.MEMMAP_MSK2: + .word MEMMAP_MASK + + .align 2 + + diff --git a/src/sh/offsets.h b/src/sh/offsets.h new file mode 100644 index 0000000..ecc7585 --- /dev/null +++ b/src/sh/offsets.h @@ -0,0 +1,321 @@ + +#ifdef USE_ASM_R12 +#define Flags @(20, r12) +#define BranchSkip @(3, r12) +#define NMIActive @(4, r12) +#define IRQActive @(5, r12) +#define WaitingForInterrupt @(6, r12) +#define InDMA @(7, r12) +#define WhichEvent @(8, r12) +#define PCS @(24, r12) +#define PCBase @(28, r12) +#define PCAtOpcodeStart @(32, r12) +#define WaitAddress @(36, r12) +#define WaitCounter @(40, r12) +#define Cycles @(44, r12) +#define NextEvent @(48, r12) +#define V_Counter @(52, r12) +#define MemSpeed @(56, r12) +#define MemSpeedx2 @(60, r12) +#define FastROMSpeed @(64, r12) +#define AutoSaveTimer @(68, r12) +#define SRAMModified @r12 +#define NMITriggerPoint @(72, r12) +#define TriedInterleavedMode2 @(2, r12) +#define BRKTriggered @(1, r12) +#define NMICycleCount @(12, r12) +#define IRQCycleCount @(16, r12) +#else +#define Flags @(20+16, r11) +#define BranchSkip @(3, r11) +#define NMIActive @(4, r11) +#define IRQActive @(5, r11) +#define WaitingForInterrupt @(6, r11) +#define InDMA @(7, r11) +#define WhichEvent @(8, r11) +#define PCS @(24+16, r11) +#define PCBase @(28+16, r11) +#define PCAtOpcodeStart @(32+16, r11) +#define WaitAddress @(36+16, r11) +#define WaitCounter @(40+16, r11) +#define Cycles @(44+16, r11) +#define NextEvent @(48, r11) +#define V_Counter @(52, r11) +#define MemSpeed @(56+16, r11) +#define MemSpeedx2 @(60+16, r11) +#define FastROMSpeed @(64+16, r11) +#define AutoSaveTimer @(68+16, r11) +#define SRAMModified @r11 +#define NMITriggerPoint @(72+16, r11) +#define TriedInterleavedMode2 @(2+16, r11) +#define BRKTriggered @(1, r11) +#define NMICycleCount @(12+16, r11) +#define IRQCycleCount @(16+16, r11) +#endif +#define PB @r11 +#define PBMEM @r11 +#define DB @(1, r11) +#define DBMEM @(1, r11) +#define PP @(2, r11) +#define PL @(2, r11) +#define PH @(3, r11) +#define AA @(4, r11) +#define AL @(4, r11) +#define AH @(5, r11) +#define DD @(6, r11) +#define DL @(6, r11) +#define DH @(7, r11) +#define SS @(8, r11) +#define SL @(8, r11) +#define SH @(9, r11) +#define XX @(10, r11) +#define XL @(10, r11) +#define XH @(11, r11) +#define YY @(12, r11) +#define YL @(12, r11) +#define YH @(13, r11) +#define PCR @(14, r11) +#define RAM _CMemory_RAM +#define VRAM _CMemory_VRAM +#define SRAM _CMemory_SRAM +#define BWRAM _CMemory_BWRAM +#define FillRAM _CMemory_FillRAM +#define ROM _CMemory_FillRAM + 0x200 +#define C4RAM _CMemory_FillRAM + 0x8000 + 0x400000 + 0x10000 +#define SRAMMask _CMemory_SRAMMask +#define Map _CMemory_Map +#define WriteMap _CMemory_WriteMap +#define MemorySpeed _CMemory_MemorySpeed +#define BlockIsRAM _CMemory_BlockIsRAM +#define APUPCS @(16, r1) +#define APURAM @(20, r1) +#define APUExecuting @(3, r1) +#define APUDirectPage @(24, r1) +#define APUBit @(4, r1) +#define APUAddress @(8, r1) +#define APUWaitAddress1 @(28, r1) +#define APUWaitAddress2 @(32, r1) +#define APUWaitCounter @(12, r1) +#define APUShadowRAM @(36, r1) +#define APUCachedSamples @(40, r1) +#define APU_Carry @r1 +#define APU_Zero @(1, r1) +#define APU_Overflow @(2, r1) +#define APUTimerErrorCounter @(44, r1) +#define NextAPUTimerPos @(48, r1) +#define APUTimerCounter @(52, r1) +#define APUCycles @r1 +#define APUShowROM @(4, r1) +#define APUFlags @(5, r1) +#define APUKeyedChannels @(6, r1) +#define APUOutPorts @(7, r1) +#define APUDSP @(11, r1) +#define APUExtraRAM 139 +#define APUTimer 204 +#define APUTimerTarget 210 +#define APUTimerEnabled 216 +#define TimerValueWritten 219 +#define CPUSpeed @r1 +#define CPUOpcodes @(4, r1) +#define _Carry @(8, r1) +#define _Zero @(9, r1) +#define _Negative @(10, r1) +#define _Overflow @(11, r1) +#define ShiftedDB @(20, r1) +#define ShiftedPB @(16, r1) +#define CPUExecuting @(12, r1) +#define Scanline @(28, r1) +#define Frame @(24, r1) +#define APUEnabled @r1 +#define Shutdown @(1, r1) +#define H_Max @(20, r1) +#define HBlankStart @(24, r1) +#define CyclesPercentage @(28, r1) +#define DisableIRQ @(2, r1) +#define Paused @(3, r1) +#define PAL @(7, r1) +#define SA1Enabled @(82, r1) +#define SuperFXEnabled @(80, r1) +#define ApuP @r1 +#define ApuYA @(2, r1) +#define ApuA @(2, r1) +#define ApuY @(3, r1) +#define ApuX @(4, r1) +#define ApuS @(5, r1) +#define ApuPC @(6, r1) +#define APUPCR @(6, r1) +#define BGMode @(18, r1) +#define BG3Priority @(19, r1) +#define Brightness @(14, r1) +#define GHight @(84, r1) +#define GInc @(85, r1) +#define GAddress @(86, r1) +#define GMask1 @(88, r1) +#define GFullGraphicCount @(90, r1) +#define GShift @(92, r1) +#define CGFLIP @(20, r1) +#define CGDATA @(184, r1) +#define FirstSprite @(11, r1) +#define LastSprite @(21, r1) +#define OBJ @(696, r1) +#define OAMPriorityRotation @(22, r1) +#define OAMAddr @r1 +#define OAMFlip @(12, r1) +#define OAMTileAddress @(54, r1) +#define IRQVBeamPos @(16, r1) +#define IRQHBeamPos @(56, r1) +#define VBeamPosLatched @(58, r1) +#define HBeamPosLatched @(60, r1) +#define HBeamFlip @(24, r1) +#define VBeamFlip @(25, r1) +#define HVBeamCounterLatched @(13, r1) +#define MatrixA @(62, r1) +#define MatrixB @(64, r1) +#define MatrixC @(66, r1) +#define MatrixD @(68, r1) +#define CentreX @(70, r1) +#define CentreY @(72, r1) +#define Joypad1ButtonReadPos @(26, r1) +#define Joypad2ButtonReadPos @(27, r1) +#define CGADD @(28, r1) +#define FixedColourGreen @(30, r1) +#define FixedColourRed @(29, r1) +#define FixedColourBlue @(31, r1) +#define SavedOAMAddr @(2, r1) +#define ScreenHeight @(4, r1) +#define WRAM @(80, r1) +#define BG_Forced @(32, r1) +#define ForcedBlanking @(8, r1) +#define OBJThroughMain @(33, r1) +#define OBJThroughSub @(34, r1) +#define OBJSizeSelect @(35, r1) +#define OBJNameBase @(76, r1) +#define OAMReadFlip @(37, r1) +#define OAMData @(2232, r1) +#define VTimerEnabled @(9, r1) +#define HTimerEnabled @(10, r1) +#define HTimerPosition @(6, r1) +#define Mosaic @(38, r1) +#define BGMosaic @(142, r1) +#define Mode7HFlip @(39, r1) +#define Mode7VFlip @(40, r1) +#define Mode7Repeat @(41, r1) +#define Window1Left @(42, r1) +#define Window1Right @(43, r1) +#define Window2Left @(44, r1) +#define Window2Right @(50, r1) +#define ClipWindowOverlapLogic @(152, r1) +#define ClipWindow1Enable @(158, r1) +#define ClipWindow2Enable @(164, r1) +#define ClipWindow1Inside @(170, r1) +#define ClipWindow2Inside @(176, r1) +#define RecomputeClipWindows @(45, r1) +#define CGFLIPRead @(46, r1) +#define OBJNameSelect @(78, r1) +#define Need16x8Mulitply @(51, r1) +#define Joypad3ButtonReadPos @(52, r1) +#define MouseSpeed @(182, r1) +#define RangeTimeOver @(23, r1) +#define ColorsChanged @r1 +#define HDMA @(1, r1) +#define HDMAStarted @(2, r1) +#define MaxBrightness @(3, r1) +#define LatchedBlanking @(4, r1) +#define OBJChanged @(5, r1) +#define RenderThisFrame @(6, r1) +#define SkippedFrames @(20, r1) +#define FrameSkip @(24, r1) +#define TileCache @(28, r1) +#define TileCached @(40, r1) +#define FirstVRAMRead @(52, r1) +#define Interlace @(54, r1) +#define DoubleWidthPixels @(56, r1) +#define RenderedScreenHeight @(60, r1) +#define RenderedScreenWidth @(64, r1) +#define Red @(68, r1) +#define Green @(1092, r1) +#define Blue @(2116, r1) +#define XB @(3140, r1) +#define ScreenColors @(3144, r1) +#define PreviousLine @(3656, r1) +#define CurrentLine @(3660, r1) +#define Joypads @(3668, r1) +#define SuperScope @(3688, r1) +#define Mouse @(3692, r1) +#define PrevMouseX @(3700, r1) +#define PrevMouseY @(3708, r1) +#define Clip @(3716, r1) +#define SA1Opcodes @(16, SA1REG) +#define SA1_Carry @SA1REG +#define SA1_Zero @(1, SA1REG) +#define SA1_Negative @(2, SA1REG) +#define SA1_Overflow @(3, SA1REG) +#define SA1CPUExecuting @(4, SA1REG) +#define SA1ShiftedPB @(20, SA1REG) +#define SA1ShiftedDB @(24, SA1REG) +#define SA1Flags @(28, SA1REG) +#define SA1Executing @(5, SA1REG) +#define SA1NMIActive @(6, SA1REG) +#define SA1IRQActive @(7, SA1REG) +#define SA1WaitingForInterrupt @(8, SA1REG) +#define SA1PCS @(36, SA1REG) +#define SA1PCBase @(40, SA1REG) +#define SA1PCAtOpcodeStart @(48, SA1REG) +#define SA1WaitAddress @(52, SA1REG) +#define SA1WaitCounter @(32, SA1REG) +#define SA1WaitByteAddress1 @(56, SA1REG) +#define SA1WaitByteAddress2 @(60, SA1REG) +#define SA1BWRAM @(44, SA1REG) +#define SA1Map @(64, SA1REG) +#define SA1WriteMap @(16448, SA1REG) +#define SA1op1 @(32832, SA1REG) +#define SA1op2 @(32834, SA1REG) +#define SA1arithmetic_op @(32836, SA1REG) +#define SA1sum @(32840, SA1REG) +#define SA1overflow @(10, SA1REG) +#define VirtualBitmapFormat @(11, SA1REG) +#define SA1_in_char_dma @(12, SA1REG) +#define SA1variable_bit_pos @(13, SA1REG) +#define SA1PB @r11 +#define SA1DB @(1, r11) +#define SA1PP @(2, r11) +#define SA1PL @(2, r11) +#define SA1PH SA1PL + 1 +#define SA1AA @(4, r11) +#define SA1AL @(4, r11) +#define SA1AH SA1AL + 1 +#define SA1DD @(6, r11) +#define SA1DL @(6, r11) +#define SA1DH SA1DL + 1 +#define SA1SS @(8, r11) +#define SA1SL @(8, r11) +#define SA1SH SA1SL + 1 +#define SA1XX @(10, r11) +#define SA1XL @(10, r11) +#define SA1XH SA1XL + 1 +#define SA1YY @(12, r11) +#define SA1YL @(12, r11) +#define SA1YH SA1YL + 1 +#define SA1PCR @(14, r11) +#define S9xGetByte @(4, r14) +#define S9xSetByte @(8, r14) +#define S9xGetWord @(12, r14) +#define S9xSetWord @(16, r14) +#define S9xOpcode_IRQ @(20, r14) +#define S9xOpcode_NMI @(24, r14) +#define S9xSetPCBase @(28, r14) +#define ICPU @(32, r14) +#define IAPU @(36, r14) +#define APU @(40, r14) +#define SA1 @(44, r14) +#define APURegisters @(48, r14) +#define Settings @(52, r14) +#define IPPU @(56, r14) +#define PPU @(60, r14) +#define SA1Map_offs 64 +#define SA1WriteMap_offs 16448 +#ifdef USE_ASM_R12 +#define NMITriggerPoint_offs 72 +#else +#define NMITriggerPoint_offs 72+16 +#endif diff --git a/src/sh/sa1addr.h b/src/sh/sa1addr.h new file mode 100644 index 0000000..93a55b3 --- /dev/null +++ b/src/sh/sa1addr.h @@ -0,0 +1,776 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro GetCarry + mov FLAGS,r1 + shlr r1 +.endm + +.macro GetNotCarry + mov #Carry,r1 + tst r1,FLAGS +.endm + +.macro SetZNjmp R + jmp @r13 + exts.b \R,r7 +.endm + +.macro Set16ZNjmp R + jmp @r13 + exts.w \R,r7 +.endm + +.macro SetZNlink R + lds r13,pr + jmp @r3 + exts.b \R,r7 +.endm + +.macro Set16ZNlink R + lds r13,pr + jmp @r3 + exts.w \R,r7 +.endm + +.macro Xlink + jmp @r3 + lds r13,pr +.endm + +#if 0 +.macro SetZNC + setc _Carry + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNC + setc _Carry + setnz _Zero + movb %ah, _Negative +.endm + +.macro SetZNCV + setc _Carry + seto _Overflow + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNCV + setc _Carry + seto _Overflow + setnz _Zero + movb %ah, _Negative +.endm + +.macro SetZNV + seto _Overflow + movb %al, _Negative + movb %al, _Zero +.endm + +.macro Set16ZNV + seto _Overflow + setnz _Zero + movb %ah, _Negative +.endm +#endif + +/************* IMMEDIATE8 ****************/ +.Macro Immediate8 K + mov.b @PC+,r0 + extu.b r0,r0 +.endm + +/************* IMMEDIATE16 ****************/ +.macro Immediate16 K + mov.b @PC+,r0 + shll8 r0 + mov.b @PC+,r2 + extu.b r2,r2 + or r2,r0 + swap.b r0,r0 + extu.w r0,r0 +.endm + +/************* Relative ****************/ +.macro Relative K + mov.b @PC+,r4 +! mov.l SA1,r1 +! exts.b r4,r4 + mov.l SA1PCBase,r2 + add PC,r4 + sub r2,r4 +.endm + +/************* RelativeLong ****************/ +.macro RelativeLong K + mov.b @PC+,r4 + extu.b r4,r4 + mov.b @PC+,r0 +! mov.l SA1,r1 + shll8 r0 + mov.l SA1PCBase,r2 + or r0,r4 + add PC,r4 + sub r2,r4 +.endm + + +/************* AbsoluteIndexedIndirect8 ****************/ +.macro AbsoluteIndexedIndirect8 K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 + mov.w XX,r0 + add r2,r4 + add r0,r4 + mov.l S9xSA1GetWord,r3 + extu.w r4,r4 + mov.l SA1ShiftedPB,r2 + jsr @r3 + or r2,r4 + extu.w r0,r4 +.endm + +/************* AbsoluteIndirectLong8 ****************/ +.macro AbsoluteIndirectLong8 K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 + mov.l S9xSA1GetWord,r3 + or r2,r4 + jsr @r3 + extu.w r4,r4 + mov.l r0,@-r15 + mov.l S9xSA1GetByte,r3 + add #2,r4 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + shll16 r0 + or r0,r4 +.endm + +.macro AbsoluteIndirect8 K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + shll8 r4 + mov.l S9xSA1GetWord,r3 + or r2,r4 + jsr @r3 + extu.w r4,r4 + extu.w r0,r4 +.endm + +.macro Absolute8_i K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l SA1ShiftedDB,r4 + or r2,r3 + extu.w r3,r3 +#ifndef SA1ADDR_NOP_PATCH + add r3,r4 +#endif +.endm + +.macro Absolute8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r3,r4 +#endif +.endm + +.macro Absolute8 K + Absolute8_i \K +#ifdef SA1ADDR_NOP_PATCH + Absolute8_f +#endif +.endm + +.macro AbsoluteLong8_i K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r4 + extu.b r4,r4 + mov.b @PC+,r0 + extu.b r0,r0 + shll16 r0 + shll8 r4 + or r0,r2 +#ifndef SA1ADDR_NOP_PATCH + or r2,r4 +#endif +.endm + +.macro AbsoluteLong8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + or r2,r4 +#endif +.endm + +.macro AbsoluteLong8 K + AbsoluteLong8_i \K +#ifdef SA1ADDR_NOP_PATCH + AbsoluteLong8_f +#endif +.endm + +.macro Direct8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 +#ifndef SA1ADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro Direct8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro Direct8 K + Direct8_i \K +#ifdef SA1ADDR_NOP_PATCH + Direct8_f +#endif +.endm + +.macro DirectIndirectIndexed8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xSA1GetWord,r3 + jsr @r3 + extu.w r4,r4 + mov.l SA1,r3 + mov.l @(16,r3),r4 + add r0,r4 + mov.w YY,r0 + extu.w r0,r0 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexed8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexed8 K + DirectIndirectIndexed8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndirectIndexed8_f +#endif +.endm + +.macro DirectIndirectIndexedLong8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xSA1GetWord,r3 + jsr @r3 + extu.w r4,r4 + mov.l r0,@-r15 + mov.l S9xSA1GetByte,r3 + jsr @r3 + add #2,r4 + mov.l @r15+,r4 + shll16 r0 + or r0,r4 + mov.w YY,r0 + extu.w r0,r0 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexedLong8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirectIndexedLong8 K + DirectIndirectIndexedLong8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndirectIndexedLong8_f +#endif +.endm + +.macro DirectIndexedIndirect8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w XX,r0 + add r0,r4 + mov.l S9xSA1GetWord,r3 + jsr @r3 + extu.w r4,r4 + mov.l SA1,r3 + mov.l @(16,r3),r4 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndexedIndirect8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndexedIndirect8 K + DirectIndexedIndirect8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndexedIndirect8_f +#endif +.endm + +.macro DirectIndexedX8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w XX,r0 + add r0,r4 +#ifndef SA1ADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedX8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedX8 K + DirectIndexedX8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndexedX8_f +#endif +.endm + +.macro DirectIndexedY8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.w YY,r0 + add r0,r4 +#ifndef SA1ADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedY8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro DirectIndexedY8 K + DirectIndexedY8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndexedY8_f +#endif +.endm + +.macro AbsoluteIndexedX8_i K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l SA1ShiftedDB,r4 + or r2,r3 + extu.w r3,r3 + mov.w XX,r0 + add r3,r4 + extu.w r0,r0 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedX8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedX8 K + AbsoluteIndexedX8_i \K +#ifdef SA1ADDR_NOP_PATCH + AbsoluteIndexedX8_f +#endif +.endm + +.macro AbsoluteIndexedY8_i K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + shll8 r3 + mov.l SA1ShiftedDB,r4 + or r2,r3 + extu.w r3,r3 + mov.w YY,r0 + add r3,r4 + extu.w r0,r0 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedY8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteIndexedY8 K + AbsoluteIndexedY8_i \K +#ifdef SA1ADDR_NOP_PATCH + AbsoluteIndexedY8_f +#endif +.endm + +.macro AbsoluteLongIndexedX8_i K + mov.b @PC+,r2 + extu.b r2,r2 + mov.b @PC+,r3 + extu.b r3,r3 + mov.b @PC+,r4 + extu.b r4,r4 + shll8 r3 + or r2,r3 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + or r3,r4 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro AbsoluteLongIndexedX8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro AbsoluteLongIndexedX8 K + AbsoluteLongIndexedX8_i +#ifdef SA1ADDR_NOP_PATCH + AbsoluteLongIndexedX8_f +#endif +.endm + +.macro DirectIndirect8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xSA1GetWord,r3 + jsr @r3 + extu.w r4,r4 + mov.l SA1,r3 + mov.l @(16,r3),r4 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro DirectIndirect8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro DirectIndirect8 K + DirectIndirect8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndirect8_f +#endif +.endm + +.macro DirectIndirectLong8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w DD,r0 + add r0,r4 + mov.l S9xSA1GetWord,r3 + jsr @r3 + extu.w r4,r4 + mov.l r0,@-r15 + mov.l S9xSA1GetByte,r3 + jsr @r3 + add #2,r4 + mov.l @r15+,r4 + shll16 r0 +#ifndef SA1ADDR_NOP_PATCH + or r0,r4 +#endif +.endm + +.macro DirectIndirectLong8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + or r0,r4 +#endif +.endm + +.macro DirectIndirectLong8 K + DirectIndirectLong8_i \K +#ifdef SA1ADDR_NOP_PATCH + DirectIndirectLong8_f +#endif +.endm + +.macro StackRelative8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w SS,r0 + add r0,r4 +#ifndef SA1ADDR_NOP_PATCH + extu.w r4,r4 +#endif +.endm + +.macro StackRelative8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + extu.w r4,r4 +#endif +.endm + +.macro StackRelative8 K + StackRelative8_i \K +#ifdef SA1ADDR_NOP_PATCH + StackRelative8_f +#endif +.endm + +.macro StackRelativeIndirectIndexed8_i K + mov.b @PC+,r4 + extu.b r4,r4 + mov.w SS,r0 + mov.l S9xSA1GetWord,r3 + add r0,r4 + jsr @r3 + extu.w r4,r4 + mov.l SA1,r3 + mov.l @(16,r3),r4 + add r0,r4 + mov.w YY,r0 + extu.w r0,r0 +#ifndef SA1ADDR_NOP_PATCH + add r0,r4 +#endif +.endm + +.macro StackRelativeIndirectIndexed8_f +#ifndef SA1ADDR_NOP_PATCH + nop +#else + add r0,r4 +#endif +.endm + +.macro StackRelativeIndirectIndexed8 K + StackRelativeIndirectIndexed8_i \K +#ifdef SA1ADDR_NOP_PATCH + StackRelativeIndirectIndexed8_f +#endif +.endm + +.macro PushBytejmp K + mov r0,r1 + mov.w SS,r0 + extu.w r0,r4 + mov.l S9xSA1SetByte,r3 + add #-1,r0 + mov.w r0,SS + mov r1,r0 + Xlink +.endm + +.macro PushWordjmp K + mov r0,r1 + mov.w SS,r0 + add #-1,r0 + extu.w r0,r4 + mov.l S9xSA1SetWord,r3 + add #-1,r0 + mov.w r0,SS + mov r1,r0 + Xlink +.endm + +.macro PushByte K + mov r0,r1 + mov.w SS,r0 + extu.w r0,r4 + mov.l S9xSA1SetByte,r3 + add #-1,r0 + mov.w r0,SS + jsr @r3 + mov r1,r0 +.endm + +.macro PushWord K + mov r0,r1 + mov.w SS,r0 + add #-1,r0 + extu.w r0,r4 + mov.l S9xSA1SetWord,r3 + add #-1,r0 + mov.w r0,SS + jsr @r3 + mov r1,r0 +.endm + +.macro PullByte K + mov.w SS,r0 + add #1,r0 + mov.l S9xSA1GetByte,r3 + extu.w r0,r4 + jsr @r3 + mov.w r0,SS +.endm + +.macro PullWord K + mov.w SS,r0 + add #1,r0 + mov.l S9xSA1GetWord,r3 + extu.w r0,r4 + add #1,r0 + jsr @r3 + mov.w r0,SS +.endm + diff --git a/src/sh/sa1gs.S b/src/sh/sa1gs.S new file mode 100644 index 0000000..4e0ccbb --- /dev/null +++ b/src/sh/sa1gs.S @@ -0,0 +1,733 @@ +/*** Renesas SH assembler ***************************************************** + SH assembler code partly based on x86 assembler code + + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) +******************************************************************************/ + +/****************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +******************************************************************************/ + +.text + + .align 2 +S9xSA1GetByte_r: + mov r4,r0 + mov #-MEMMAP_SHIFT,r3 + shld r3,r0 + mov.w .MEMMAP_MSK1,r3 + and r3,r0 + shll2 r0 + mov #SA1Map_offs,r3 + add SA1REG,r3 + mov.l @(r0,r3),r3 + cmp/pz r3 + bt .GBSpecial + extu.w r4,r2 + add r2,r3 + mov.b @r3,r0 + rts + extu.b r0,r0 + + .align 2 +.MEMMAP_MSK1: + .word MEMMAP_MASK + .align 2 + +.GBSpecial: + mova .GBJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 + nop + + .align 2 + +.GBPPU: /* MAP_PPU */ + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xGetSA1,r3 + mov.l r4,@-r15 + jsr @r3 + extu.w r4,r4 + mov.l @r15+,r4 + lds.l @r15+,pr + POP_REGISTERS + rts + extu.b r0,r0 + + .align 2 +.GBCPU: /* MAP_CPU */ + +.GBDSP: /* MAP_DSP */ + rts + mov #0,r0 + + .align 2 +.GBLSRAM: /* MAP_LOROM_SRAM */ + mov.l .SRAM0,r3 + mov.l .SRAMMask0,r2 + mov.w @r2,r2 + extu.w r2,r2 + and r4,r2 + add r2,r3 + mov.b @r3,r0 + rts + extu.b r0,r0 + + .align 2 +.GBHSRAM: /* MAP_HIROM_SRAM */ + mov.w .n7fffA,r3 + and r4,r3 + mov.w .n6000A,r2 + sub r2,r3 + mov.l .nf0000,r2 + and r4,r2 + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM0,r0 + mov.l .SRAMMask0,r2 + mov.w @r2,r2 + extu.w r2,r2 + and r3,r2 + mov.b @(r0,r2),r0 + rts + extu.b r0,r0 + + .align 2 +.GBNONE: +.GBDEBUG: /* MAP_DEBUG */ + rts + mov #0,r0 + + .align 2 +.GBBWRAM: /* MAP_BWRAM */ + mov.w .n7fffA,r3 + and r4,r3 + mov.w .n6000A,r2 + sub r2,r3 + mov.l SA1BWRAM,r0 + mov.b @(r0,r3),r0 + rts + extu.b r0,r0 + + .align 2 +.GBBWBITMAP: + mov.l .FillRAM0,r3 + mov.w .n6000A,r2 + mov.w .n223f0,r0 + shll8 r2 + mov.b @(r0,r3),r0 + mov r4,r3 + tst #0x80,r0 + sub r2,r3 + bt .GB4 + + // Depth 2 + mov #3,r2 + shlr2 r3 + and r4,r2 + extu.w r3,r3 +// CUIDADO: + mov.l .SRAM0,r0 + shll r2 + mov.b @(r0,r3),r0 + neg r2,r2 + shld r2,r0 + rts + and #3,r0 + +.GB4: + mov #1,r2 + shlr r3 + and r4,r2 + extu.w r3,r3 +// CUIDADO: + mov.l .SRAM0,r0 + shll2 r2 + mov.b @(r0,r3),r0 + neg r2,r2 + shld r2,r0 + rts + and #15,r0 + + + .align 2 +.GBBWBITMAP2: + mov.l .FillRAM0,r3 + mov.w .n6000A,r2 + mov.w .n223f0,r0 + mov.b @(r0,r3),r0 + extu.w r4,r3 + tst #0x80,r0 + sub r2,r3 + bt .GB42 + + // Depth 2 + mov #3,r2 + shlr2 r3 + and r4,r2 + extu.w r3,r3 + mov.l SA1BWRAM,r0 + shll r2 + mov.b @(r0,r3),r0 + neg r2,r2 + shld r2,r0 + rts + and #3,r0 + +.GB42: + mov #1,r2 + shlr r3 + and r4,r2 + extu.w r3,r3 + mov.l SA1BWRAM,r0 + shll2 r2 + mov.b @(r0,r3),r0 + neg r2,r2 + shld r2,r0 + rts + and #15,r0 + + .align 2 +.n7fffA: + .word 0x7fff +.n6000A: + .word 0x6000 +.n223f0: + .word 0x223f + .align 2 + + +S9xSA1GetWord_r: + sts.l pr,@-r15 + bsr S9xSA1GetByte_r + nop + mov.l r0,@-r15 + bsr S9xSA1GetByte_r + add #1,r4 + mov.l @r15+,r1 + add #-1,r4 + lds.l @r15+,pr + shll8 r0 + rts + or r1,r0 + + .align 2 +S9xSA1SetByte_r: + mov r4,r2 + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK_,r3 + and r3,r2 + + shll2 r2 + mov.w .wSA1WriteMap_offs,r3 + add SA1REG,r3 + add r2,r3 + mov.l @r3,r3 + cmp/pz r3 + bt .SBSpecial + extu.w r4,r2 + add r2,r3 + rts + mov.b r0,@r3 + + .align 2 +.MEMMAP_MSK_: + .word MEMMAP_MASK +.wSA1WriteMap_offs: + .word SA1WriteMap_offs + .align 2 + +.SBSpecial: + mov r4,r2 + extu.b r0,r4 + mova .SBJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 +#ifdef USE_ASM_R5 + extu.w r2,r5 +#else + nop +#endif + + .align 2 + +.SBPPU: /* MAP_PPU */ + PUSH_REGISTERS + sts.l pr,@-r15 + mov.l .S9xSetSA1,r3 + jsr @r3 +#ifdef USE_ASM_R5 + nop +#else + extu.w r2,r5 +#endif + lds.l @r15+,pr + POP_REGISTERS + rts + nop + + .align 2 +.SBCPU: /* MAP_CPU */ + rts + nop + + .align 2 +.SBDSP: /* MAP_DSP */ + rts + nop + + .align 2 +.SBLSRAM: /* MAP_LOROM_SRAM */ + mov.l .SRAM0,r0 +#ifdef USE_ASM_R5 + mov.l .SRAMMask0,r5 + mov.w @r5,r5 + extu.w r5,r5 + tst r5,r5 + and r5,r2 +#else + mov.l .SRAMMask0,r3 + mov.w @r3,r3 + extu.w r3,r3 + tst r3,r3 + and r3,r2 +#endif + bt .SBLSRAM_SKIP + mov.b r4,@(r0,r2) +.SBLSRAM_SKIP: + rts + nop + + .align 2 +.SBHSRAM: /* MAP_HIROM_SRAM */ + mov.w .n7fff,r3 + and r4,r3 +#ifdef USE_ASM_R5 + mov.w .n6000,r5 + sub r5,r3 + mov.l .nf0000,r5 + and r5,r2 +#else + mov.w .n6000,r0 + sub r0,r3 + mov.l .nf0000,r0 + and r0,r2 +#endif + shlr2 r2 + shlr r2 + add r2,r3 + mov.l .SRAM0,r0 + mov.l .SRAMMask0,r2 + mov.w @r2,r2 + extu.w r2,r2 + tst r2,r2 + and r3,r2 + bt .SBHSRAM_SKIP + mov.b r4,@(r0,r2) +.SBHSRAM_SKIP: + rts + nop + + .align 2 +.SBNONE: +.SBDEBUG: /* MAP_DEBUG */ + rts + nop + + .align 2 +.SBBWRAM: /* MAP_BWRAM */ + mov.w .n7fff,r0 + and r2,r0 + mov.w .n6000,r2 + sub r2,r0 + mov.l SA1BWRAM,r2 + rts + mov.b r4,@(r0,r2) + + .align 2 +.SBBWBITMAP: + mov.l .FillRAM0,r0 + mov.w .n223f,r2 + mov.l .nnx600000,r1 + mov.b @(r0,r2),r0 + tst #0x80,r0 + bt/s .SB4 + add r2,r1 + + // Depth 2 + mov #3,r0 + shlr2 r1 + and r2,r0 + extu.w r1,r1 +// CUIDADO: + mov.l .SRAM0,r2 + shll r0 + add r2,r1 + mov #3,r2 + mov #3,r3 + shld r0,r2 + and r4,r3 + not r2,r2 + shld r0,r3 + mov.b @r1,r0 + and r2,r0 + or r3,r0 + rts + mov.b r0,@r1 + +.SB4: + mov #1,r0 + shlr r1 + and r2,r0 + extu.w r1,r1 +// CUIDADO: + mov.l .SRAM0,r2 + shll2 r0 + add r2,r1 + mov #15,r2 + mov #15,r3 + shld r0,r2 + and r4,r3 + not r2,r2 + shld r0,r3 + mov.b @r1,r0 + and r2,r0 + or r3,r0 + rts + mov.b r0,@r1 + + + .align 2 +.SBBWBITMAP2: +#ifndef USE_ASM_R5 + extu.w r2,r3 +#endif + mov.l .FillRAM0,r0 + mov.w .n223f,r2 + mov.w .nnx6000,r1 + mov.b @(r0,r2),r0 + tst #0x80,r0 + bt/s .SB42 +#ifdef USE_ASM_R5 + add r5,r1 +#else + add r3,r1 +#endif + + // Depth 2 + mov #3,r0 + shlr2 r1 +#ifdef USE_ASM_R5 + and r5,r0 +#else + and r3,r0 +#endif + extu.w r1,r1 + mov.l SA1BWRAM,r2 + shll r0 + add r2,r1 + mov #3,r2 + mov #3,r3 + shld r0,r2 + and r4,r3 + not r2,r2 + shld r0,r3 + mov.b @r1,r0 + and r2,r0 + or r3,r0 + rts + mov.b r0,@r1 + +.SB42: + mov #1,r0 + shlr r1 +#ifdef USE_ASM_R5 + and r5,r0 +#else + and r3,r0 +#endif + extu.w r1,r1 + mov.l SA1BWRAM,r2 + shll2 r0 + add r2,r1 + mov #15,r2 + mov #15,r3 + shld r0,r2 + and r4,r3 + not r2,r2 + shld r0,r3 + mov.b @r1,r0 + and r2,r0 + or r3,r0 + rts + mov.b r0,@r1 + + .align 2 + +.GBJmpTable: + .long .GBPPU + .long .GBCPU + .long .GBDSP + .long .GBLSRAM + .long .GBHSRAM + .long .GBNONE + .long .GBDEBUG + .long .GBNONE + .long .GBBWRAM + .long .GBBWBITMAP + .long .GBBWBITMAP2 + +.SBJmpTable: + .long .SBPPU + .long .SBCPU + .long .SBDSP + .long .SBLSRAM + .long .SBHSRAM + .long .SBNONE + .long .SBDEBUG + .long .SBNONE + .long .SBBWRAM + .long .SBBWBITMAP + .long .SBBWBITMAP2 + +.S9xGetSA1: + .long _S9xGetSA1 +.S9xSetSA1: + .long _S9xSetSA1 +.SRAM0: + .long SRAM +.SRAMMask0: + .long SRAMMask +.FillRAM0: + .long FillRAM +.nf0000: + .long 0xf0000 +.nnx600000: + .long -0x600000 +.n7fff: + .word 0x7fff +.n6000: + .word 0x6000 +.nnx6000: + .word -0x6000 +.n223f: + .word 0x223f + .align 2 + +S9xSA1SetWord_r: + sts.l pr,@-r15 + mov.l r0,@-r15 + bsr S9xSA1SetByte_r + mov.l r4,@-r15 + mov.l @r15+,r4 + mov.l @r15+,r0 + add #1,r4 + shlr8 r0 + bra S9xSA1SetByte_r + lds.l @r15+,pr + +S9xSA1SetPCBase_r: + mov r4,r2 + mov #-MEMMAP_SHIFT,r3 + shld r3,r2 + mov.w .MEMMAP_MSK,r3 + and r3,r2 + shll2 r2 + mov #SA1Map_offs,r3 + add SA1REG,r3 + add r2,r3 + mov.l @r3,r3 + cmp/pz r3 + bt .SPCSpecial + extu.w r4,r2 + mov.l r3,SA1PCBase + add r2,r3 + rts + mov r3,PC + + .align 2 +.MEMMAP_MSK: + .word MEMMAP_MASK + .align 2 + +.SPCSpecial: + mova .SPCJmpTable,r0 + shll2 r3 + add r3,r0 + mov.l @r0,r3 + jmp @r3 + nop + + .align 2 +.SPCJmpTable: + .long .SPCPPU + .long .SPCCPU + .long .SPCDSP + .long .SPCLSRAM + .long .SPCHSRAM + .long .SPCNONE + .long .SPCDEBUG + .long .SPCNONE + .long .SPCBWRAM + .long .SPCNONE + .long .SPCNONE + + + .align 2 +.SPCPPU: /* MAP_PPU */ +// CUIDADO: +// mov.l .FillRAMB,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAMB,PC + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SPCCPU: /* MAP_CPU */ +// CUIDADO: +// mov.l .FillRAMB,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAMB,PC + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SPCDSP: /* MAP_DSP */ +// CUIDADO: +// mov.l .FillRAMB,r3 + extu.w r4,r2 +// mov.l r3,PC + mov.l .FillRAMB,PC + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SPCLSRAM: /* MAP_LOROM_SRAM */ + mov.l .SRAM2,r3 + extu.w r4,r2 + mov.l @r3,PC + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SPCHSRAM: /* MAP_HIROM_SRAM */ + mov.l .SRAM2,r3 + mov.w .n60002,r2 + mov.l @r3,PC + add r2,PC + extu.w r4,r2 + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SPCNONE: +.SPCDEBUG: /* MAP_DEBUG */ + mov.l .SRAM2,PC + rts + mov.l PC,SA1PCBase + + .align 2 +.SPCBWRAM: /* MAP_BWRAM */ + mov.l SA1BWRAM,r3 + mov.w .n60002,r2 + add r2,r3 + extu.w r4,r2 + mov.l @r3,PC + mov.l PC,SA1PCBase + rts + add r2,PC + + .align 2 +.SRAM2: + .long SRAM +.FillRAMB: + .long FillRAM +.n60002: + .word 0x6000 + .align 2 + diff --git a/src/sh/sa1ops.S b/src/sh/sa1ops.S new file mode 100644 index 0000000..3e99509 --- /dev/null +++ b/src/sh/sa1ops.S @@ -0,0 +1,4402 @@ +/*** Renesas SH assembler ***************************************************** + SH assembler code partly based on x86 assembler code + + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) +******************************************************************************/ + +/****************************************************************************** + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2003 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2002 - 2003 Matthew Kendora and + Brad Jorsch (anomie@users.sourceforge.net) + + + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and + Nach (n-a-c-h@users.sourceforge.net) + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2003 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman (jweidman@slip.net), + neviksti (neviksti@hotmail.com), and + Kris Bleakley (stinkfish@bigpond.com) + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2003 zsKnight, pagefault (pagefault@zsnes.com) + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar and Gary Henderson. + + + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +******************************************************************************/ +#define Registers SA1Registers +#undef VAR_CYCLES +#include "sa1struc.h" + +#if 0 +#define PCS SA1PCS +#define PB SA1PB +#define PP SA1PP +#define PL SA1PL +#define PH SA1PH +#define AA SA1AA +#define AL SA1AL +#define AH SA1AH +#define DD SA1DD +#define DL SA1DL +#define DH SA1DH +#define SS SA1SS +#define SL SA1SL +#define SH SA1SH +#define XX SA1XX +#define XL SA1XL +#define XH SA1XH +#define YY SA1YY +#define YL SA1YL +#define YH SA1YH +#endif + +#undef _Carry +#define _Carry SA1_Carry +#undef _Zero +#define _Zero SA1_Zero +#undef _Negative +#define _Negative SA1_Negative +#undef _Overflow +#define _Overflow SA1_Overflow + +.text +.little + +#include "sa1addr.h" +#include "sa1ops.h" +#include "sa1gs.S" + + +.data +.zzz: +.string "*** IRQ\n" + +.text + +.macro call_S9xSA1GetByte LASTOPCODE + mov.l S9xGetByte,r3 + jsr @r3 + \LASTOPCODE +.endm + +.macro call_S9xSA1GetWord LASTOPCODE + mov.l S9xGetWord,r3 + jsr @r3 + \LASTOPCODE +.endm + + +.globl _S9xSA1MainLoop +_S9xSA1MainLoop: + mov.l r14,@-r15 + sts.l pr,@-r15 + mov.l r13,@-r15 + mov.l r12,@-r15 + mov.l r11,@-r15 + mov.l r10,@-r15 + mov.l r9,@-r15 + mov.l r8,@-r15 + SETUP_PREDEF + LOAD_REGISTERS + mov.w .nIRQ_PENDING_FLAG,r2 + mov.l SA1Flags,r1 + tst r2,r1 + bt .nosa1irq2 + mov.b SA1IRQActive,r0 + not r2,r2 + tst r0,r0 + bt/s .nosa1irq1 + and r2,r1 + mov #IRQ,r0 + tst r0,FLAGS + bf .nosa1irq2 +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b WaitingForInterrupt,r0 +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + tst r0,r0 + bt .nosa1wait + mov #0,r0 + add #1,PC +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +.nosa1wait: + mov.l S9xOpcode_IRQ,r3 + jsr @r3 + nop + bra .nosa1irq2 + nop +.nosa1irq1: + mov.l r1,SA1Flags +.nosa1irq2: + mov #3,r1 +.instruction_loop: + mov.b SA1Executing,r0 + tst r0,r0 + bt .exit + mov.l r1,@-r15 +#ifdef CPU_SHUTDOWN + mov.l PC, SA1PCAtOpcodeStart +#endif + mov.b @PC+,r0 + extu.b r0,r0 + mov.l SA1Opcodes,r2 + shll2 r0 + mov.l @(r0,r2),r0 + jmp @r0 + nop +.globl S9xSA1MainAsmLoop +S9xSA1MainAsmLoop: + mov.l @r15+,r1 + dt r1 + bf .instruction_loop +.exit: + STORE_REGISTERS + mov.l @r15+,r8 + mov.l @r15+,r9 + mov.l @r15+,r10 + mov.l @r15+,r11 + mov.l @r15+,r12 + mov.l @r15+,r13 + lds.l @r15+,pr + + rts + mov.l @r15+,r14 + +.nIRQ_PENDING_FLAG: + .word IRQ_PENDING_FLAG + .align 2 + + MISC + +/* ADC */ +Op69M1: + Immediate8 ADC + Adc8 IMM8 + +Op69M0: + Immediate16 ADC2 + Adc16 IMM16 + +Op65M1: + Direct8_i ADC2 + call_S9xSA1GetByte Direct8_f + Adc8 DIR8 + +Op65M0: + Direct8_i ADC + call_S9xSA1GetWord Direct8_f + Adc16 DIR16 + +Op75M1: + DirectIndexedX8_i ADC + call_S9xSA1GetByte DirectIndexedX8_f + Adc8 DIX8 + +Op75M0: + DirectIndexedX8_i ADC2 + call_S9xSA1GetWord DirectIndexedX8_f + Adc16 DIX16 + +Op72M1: + DirectIndirect8_i ADC + call_S9xSA1GetByte DirectIndirect8_f + Adc8 DI8 + +Op72M0: + DirectIndirect8 ADC2 + call_S9XSA1GetWord + Adc16 DI16 + +Op61M1: + DirectIndexedIndirect8 ADC + call_S9XSA1GetByte + Adc8 DII8 + +Op61M0: + DirectIndexedIndirect8 ADC2 + call_S9XSA1GetWord + Adc16 DII16 + +Op71M1: + DirectIndirectIndexed8 ADC + call_S9XSA1GetByte + Adc8 DIIY8 + +Op71M0: + DirectIndirectIndexed8 ADC2 + call_S9XSA1GetWord + Adc16 DIIY16 + +Op67M1: + DirectIndirectLong8 ADC + call_S9XSA1GetByte + Adc8 DIL8 + +Op67M0: + DirectIndirectLong8 ADC2 + call_S9XSA1GetWord + Adc16 DIL16 + +Op77M1: + DirectIndirectIndexedLong8 ADC + call_S9XSA1GetByte + Adc8 DIIL8 + +Op77M0: + DirectIndirectIndexedLong8 ADC2 + call_S9XSA1GetWord + Adc16 DIIL8 + +Op6DM1: + Absolute8 ADC + call_S9XSA1GetByte + Adc8 ABS8 + +Op6DM0: + Absolute8 ADC2 + call_S9XSA1GetWord + Adc16 ABS16 + +Op7DM1: + AbsoluteIndexedX8 ADC + call_S9XSA1GetByte + Adc8 ABSX8 + +Op7DM0: + AbsoluteIndexedX8 ADC2 + call_S9XSA1GetWord + Adc16 ABSX16 + +Op79M1: + AbsoluteIndexedY8 ADC + call_S9XSA1GetByte + Adc8 ABSY8 + +Op79M0: + AbsoluteIndexedY8 ADC2 + call_S9XSA1GetWord + Adc16 ABSY16 + +Op6FM1: + AbsoluteLong8 ADC + call_S9XSA1GetByte + Adc8 ABSL8 + +Op6FM0: + AbsoluteLong8 ADC2 + call_S9XSA1GetWord + Adc16 ABSL16 + +Op7FM1: + AbsoluteLongIndexedX8 ADC + call_S9XSA1GetByte + Adc8 ALX8 + +Op7FM0: + AbsoluteLongIndexedX8 ADC2 + call_S9XSA1GetWord + Adc16 ALX16 + +Op63M1: + StackRelative8 ADC + call_S9XSA1GetByte + Adc8 SREL8 + +Op63M0: + StackRelative8 ADC2 + call_S9XSA1GetWord + Adc16 SREL16 + +Op73M1: + StackRelativeIndirectIndexed8 ADC + call_S9XSA1GetByte + Adc8 SRII8 + +Op73M0: + StackRelativeIndirectIndexed8 ADC2 + call_S9XSA1GetWord + Adc16 SRII16 + +/* AND */ +Op29M1: + Immediate8 AND + And8 IMM8 + +Op29M0: + Immediate16 AND + And16 IMM16 + +Op25M1: + Direct8 AND + call_S9XSA1GetByte + And8 DIR8 + +Op25M0: + Direct8 AND2 + call_S9XSA1GetWord + And16 DIR16 + +Op35M1: + DirectIndexedX8 AND + call_S9XSA1GetByte + And8 DIX8 + +Op35M0: + DirectIndexedX8 AND2 + call_S9XSA1GetWord + And16 DIX16 + +Op32M1: + DirectIndirect8 AND + call_S9XSA1GetByte + And8 DI8 + +Op32M0: + DirectIndirect8 AND2 + call_S9XSA1GetWord + And16 DI16 + +Op21M1: + DirectIndexedIndirect8 AND + call_S9XSA1GetByte + And8 DII8 + +Op21M0: + DirectIndexedIndirect8 AND2 + call_S9XSA1GetWord + And16 DII16 + +Op31M1: + DirectIndirectIndexed8 AND + call_S9XSA1GetByte + And8 DIIY8 + +Op31M0: + DirectIndirectIndexed8 AND2 + call_S9XSA1GetWord + And16 DIIY16 + +Op27M1: + DirectIndirectLong8 AND + call_S9XSA1GetByte + And8 DIL8 + +Op27M0: + DirectIndirectLong8 AND2 + call_S9XSA1GetWord + And16 DIL16 + +Op37M1: + DirectIndirectIndexedLong8 AND + call_S9XSA1GetByte + And8 DIIL8 + +Op37M0: + DirectIndirectIndexedLong8 AND2 + call_S9XSA1GetWord + And16 DIIL16 + +Op2DM1: + Absolute8 AND + call_S9XSA1GetByte + And8 ABS8 + +Op2DM0: + Absolute8 AND2 + call_S9XSA1GetWord + And16 ABS16 + +Op3DM1: + AbsoluteIndexedX8 AND + call_S9XSA1GetByte + And8 ABSX8 + +Op3DM0: + AbsoluteIndexedX8 AND2 + call_S9XSA1GetWord + And16 ABSX16 + +Op39M1: + AbsoluteIndexedY8 AND + call_S9XSA1GetByte + And8 ABSY8 + +Op39M0: + AbsoluteIndexedY8 AND2 + call_S9XSA1GetWord + And16 ABSY16 + +Op2FM1: + AbsoluteLong8 AND + call_S9XSA1GetByte + And8 ABSL8 + +Op2FM0: + AbsoluteLong8 AND2 + call_S9XSA1GetWord + And16 ABSL16 + +Op3FM1: + AbsoluteLongIndexedX8 AND + call_S9XSA1GetByte + And8 ALX8 + +Op3FM0: + AbsoluteLongIndexedX8 AND2 + call_S9XSA1GetWord + And16 ALX16 + +Op23M1: + StackRelative8 AND + call_S9XSA1GetByte + And8 SREL8 + +Op23M0: + StackRelative8 AND2 + call_S9XSA1GetWord + And16 SREL16 + +Op33M1: + StackRelativeIndirectIndexed8 AND + call_S9XSA1GetByte + And8 SRII8 + +Op33M0: + StackRelativeIndirectIndexed8 AND2 + call_S9XSA1GetWord + And16 SRII16 + +/* ASL */ +Op0AM1: + extu.b A,r1 + sub r1,A + shll r1 + extu.b r1,r2 + mov #Carry,r0 + or r2,A + cmp/eq r1,r2 + bf/s .Asl8Carry + or r0,FLAGS + add #-Carry,FLAGS +.Asl8Carry: + SetZNjmp A + +Op0AM0: + extu.w A,r1 + shll r1 + mov #Carry,r0 + extu.w r1,A + cmp/eq r1,A + bf/s .Asl16Carry + or r0,FLAGS + add #-Carry,FLAGS +.Asl16Carry: + Set16ZNjmp A + +Op06M1: + Direct8 ASL + Asl8 DIR8 + +Op06M0: + Direct8 ASL2 + Asl16 DIR16 + +Op16M1: + DirectIndexedX8 ASL + Asl8 DIX + +Op16M0: + DirectIndexedX8 ASL2 + Asl16 DIX + +Op0EM1: + Absolute8 ASL + Asl8 ABS + +Op0EM0: + Absolute8 ASL2 + Asl16 ABS + +Op1EM1: + AbsoluteIndexedX8 ASL + Asl8 ABSX + +Op1EM0: + AbsoluteIndexedX8 ASL2 + Asl16 ABSX + +/* BIT */ +Op89M1: + Immediate8 BIT + and A, r0 + extu.w r7,r3 + sub r3,r7 + jmp @r13 + or r0,r7 + +Op89M0: + Immediate16 BIT + and A, r0 + extu.w r7,r3 + sub r3,r7 + jmp @r13 + or r0,r7 + +Op24M1: + Direct8 BIT + Bit8 DIR + +Op24M0: + Direct8 BIT + Bit16 DIR + +Op34M1: + DirectIndexedX8 BIT + Bit8 DIX + +Op34M0: + DirectIndexedX8 BIT2 + Bit16 DIX + +Op2CM1: + Absolute8 BIT + Bit8 ABS + +Op2CM0: + Absolute8 BIT2 + Bit16 ABS + +Op3CM1: + AbsoluteIndexedX8 BIT + Bit8 ABSX + +Op3CM0: + AbsoluteIndexedX8 BIT2 + Bit16 ABSX + +/* CMP */ +OpC9M1: + Immediate8 CMP + Cmp8 IMM + +OpC9M0: + Immediate16 CMP + Cmp16 IMM + +OpC5M1: + Direct8 CMP + call_S9XSA1GetByte + Cmp8 DIR + +OpC5M0: + Direct8 CMP2 + call_S9XSA1GetWord + Cmp16 DIR + +OpD5M1: + DirectIndexedX8 CMP + call_S9XSA1GetByte + Cmp8 DIX + +OpD5M0: + DirectIndexedX8 CMP2 + call_S9XSA1GetWord + Cmp16 DIX + +OpD2M1: + DirectIndirect8 CMP + call_S9XSA1GetByte + Cmp8 DI + +OpD2M0: + DirectIndirect8 CMP2 + call_S9XSA1GetWord + Cmp16 DI + +OpC1M1: + DirectIndexedIndirect8 CMP + call_S9XSA1GetByte + Cmp8 DII + +OpC1M0: + DirectIndexedIndirect8 CMP2 + call_S9XSA1GetWord + Cmp16 DII + +OpD1M1: + DirectIndirectIndexed8 CMP + call_S9XSA1GetByte + Cmp8 DIIY + +OpD1M0: + DirectIndirectIndexed8 CMP2 + call_S9XSA1GetWord + Cmp16 DIIY + +OpC7M1: + DirectIndirectLong8 CMP + call_S9XSA1GetByte + Cmp8 DIL + +OpC7M0: + DirectIndirectLong8 CMP2 + call_S9XSA1GetWord + Cmp16 DIL + +OpD7M1: + DirectIndirectIndexedLong8 CMP + call_S9XSA1GetByte + Cmp8 DIIL + +OpD7M0: + DirectIndirectIndexedLong8 CMP2 + call_S9XSA1GetWord + Cmp16 DIIL + +OpCDM1: + Absolute8 CMP + call_S9XSA1GetByte + Cmp8 ABS + +OpCDM0: + Absolute8 CMP2 + call_S9XSA1GetWord + Cmp16 ABS + +OpDDM1: + AbsoluteIndexedX8 CMP + call_S9XSA1GetByte + Cmp8 ABSX + +OpDDM0: + AbsoluteIndexedX8 CMP2 + call_S9XSA1GetWord + Cmp16 ABSX + +OpD9M1: + AbsoluteIndexedY8 CMP + call_S9XSA1GetByte + Cmp8 ABSY + +OpD9M0: + AbsoluteIndexedY8 CMP2 + call_S9XSA1GetWord + Cmp16 ABSY + +OpCFM1: + AbsoluteLong8 CMP + call_S9XSA1GetByte + Cmp8 ABSL + +OpCFM0: + AbsoluteLong8 CMP2 + call_S9XSA1GetWord + Cmp16 ABSL + +OpDFM1: + AbsoluteLongIndexedX8 CMP + call_S9XSA1GetByte + Cmp8 ALX + +OpDFM0: + AbsoluteLongIndexedX8 CMP2 + call_S9XSA1GetWord + Cmp16 ALX + +OpC3M1: + StackRelative8 CMP + call_S9XSA1GetByte + Cmp8 SREL + +OpC3M0: + StackRelative8 CMP2 + call_S9XSA1GetWord + Cmp16 SREL + +OpD3M1: + StackRelativeIndirectIndexed8 CMP + call_S9XSA1GetByte + Cmp8 SRII + +OpD3M0: + StackRelativeIndirectIndexed8 CMP2 + call_S9XSA1GetWord + Cmp16 SRII + +/* CPX */ +OpE0X1: + Immediate8 CPX + Cpx8 IMM + +OpE0X0: + Immediate16 CPX + Cpx16 IMM + +OpE4X1: + Direct8 CPX + call_S9XSA1GetByte + Cpx8 DIR + +OpE4X0: + Direct8 CPX2 + call_S9XSA1GetWord + Cpx16 DIR + +OpECX1: + Absolute8 CPX + call_S9XSA1GetByte + Cpx8 ABS + +OpECX0: + Absolute8 CPX2 + call_S9XSA1GetWord + Cpx16 ABS + + +/* CPY */ +OpC0X1: + Immediate8 CPY + Cpy8 IMM + +OpC0X0: + Immediate16 CPY + Cpy16 IMM + +OpC4X1: + Direct8 CPY + call_S9XSA1GetByte + Cpy8 DIR + +OpC4X0: + Direct8 CPY2 + call_S9XSA1GetWord + Cpy16 DIR + +OpCCX1: + Absolute8 CPY + call_S9XSA1GetByte + Cpy8 ABS + +OpCCX0: + Absolute8 CPY2 + call_S9XSA1GetWord + Cpy16 ABS + +/* DEC */ +Op3AM1: + extu.b A,r0 + sub r0,A + add #-1,r0 + extu.b r0,r0 + or r0,A + SetZNjmp r0 + +Op3AM0: + add #-1,A + extu.w A,A + Set16ZNjmp A + +OpC6M1: + Direct8 DEC + Dec8 DIR + +OpC6M0: + Direct8 DEC2 + Dec16 DIR + +OpD6M1: + DirectIndexedX8 DEC + Dec8 DIX + +OpD6M0: + DirectIndexedX8 DEC2 + Dec16 DIX + +OpCEM1: + Absolute8 DEC + Dec8 ABS + +OpCEM0: + Absolute8 DEC2 + Dec16 ABS + +OpDEM1: + AbsoluteIndexedX8 DEC + + Dec8 ABSX + +OpDEM0: + AbsoluteIndexedX8 DEC2 + Dec16 ABSX + +/* EOR */ +Op49M1: + Immediate8 EOR + Eor8 IMM + +Op49M0: + Immediate16 EOR + Eor16 IMM + +Op45M1: + Direct8 EOR + call_S9XSA1GetByte + Eor8 DIR + +Op45M0: + Direct8 EOR2 + call_S9XSA1GetWord + Eor16 DIR + +Op55M1: + DirectIndexedX8 EOR + call_S9XSA1GetByte + Eor8 DIX + +Op55M0: + DirectIndexedX8 EOR2 + call_S9XSA1GetWord + Eor16 DIX + +Op52M1: + DirectIndirect8 EOR + call_S9XSA1GetByte + Eor8 DI + +Op52M0: + DirectIndirect8 EOR2 + call_S9XSA1GetWord + Eor16 DI + +Op41M1: + DirectIndexedIndirect8 EOR + call_S9XSA1GetByte + Eor8 DII + +Op41M0: + DirectIndexedIndirect8 EOR2 + call_S9XSA1GetWord + Eor16 DII + +Op51M1: + DirectIndirectIndexed8 EOR + call_S9XSA1GetByte + Eor8 DIIY + +Op51M0: + DirectIndirectIndexed8 EOR2 + call_S9XSA1GetWord + Eor16 DIIY + +Op47M1: + DirectIndirectLong8 EOR + call_S9XSA1GetByte + Eor8 DIL + +Op47M0: + DirectIndirectLong8 EOR2 + call_S9XSA1GetWord + Eor16 DIL + +Op57M1: + DirectIndirectIndexedLong8 EOR + call_S9XSA1GetByte + Eor8 DIIL + +Op57M0: + DirectIndirectIndexedLong8 EOR2 + call_S9XSA1GetWord + Eor16 DIIL + +Op4DM1: + Absolute8 EOR + call_S9XSA1GetByte + Eor8 ABS + +Op4DM0: + Absolute8 EOR2 + call_S9XSA1GetWord + Eor16 ABS + +Op5DM1: + AbsoluteIndexedX8 EOR + call_S9XSA1GetByte + Eor8 ABSX + +Op5DM0: + AbsoluteIndexedX8 EOR2 + call_S9XSA1GetWord + Eor16 ABSX + +Op59M1: + AbsoluteIndexedY8 EOR + call_S9XSA1GetByte + Eor8 ABSY + +Op59M0: + AbsoluteIndexedY8 EOR2 + call_S9XSA1GetWord + Eor16 ABSY + +Op4FM1: + AbsoluteLong8 EOR + call_S9XSA1GetByte + Eor8 ABSL + +Op4FM0: + AbsoluteLong8 EOR2 + call_S9XSA1GetWord + Eor16 ABSL + +Op5FM1: + AbsoluteLongIndexedX8 EOR + call_S9XSA1GetByte + Eor8 ALX + +Op5FM0: + AbsoluteLongIndexedX8 EOR2 + call_S9XSA1GetWord + Eor16 ALX + +Op43M1: + StackRelative8 EOR + call_S9XSA1GetByte + Eor8 SREL + +Op43M0: + StackRelative8 EOR2 + call_S9XSA1GetWord + Eor16 SREL + +Op53M1: + StackRelativeIndirectIndexed8 EOR + call_S9XSA1GetByte + Eor8 SRII + +Op53M0: + StackRelativeIndirectIndexed8 EOR2 + call_S9XSA1GetWord + Eor16 SRII + +/* INC */ +Op1AM1: + extu.b A,r0 + sub r0,A + add #1,r0 + extu.b r0,r0 + or r0,A + SetZNjmp r0 + +Op1AM0: + add #1,A + extu.w A,A + Set16ZNjmp A + +OpE6M1: + Direct8 INC + Inc8 DIR + +OpE6M0: + Direct8 INC2 + Inc16 DIR + +OpF6M1: + DirectIndexedX8 INC + Inc8 DIX + +OpF6M0: + DirectIndexedX8 INC2 + Inc16 DIX + +OpEEM1: + Absolute8 INC + Inc8 ABS + +OpEEM0: + Absolute8 INC2 + Inc16 ABS + +OpFEM1: + AbsoluteIndexedX8 INC + Inc8 ABSX + +OpFEM0: + AbsoluteIndexedX8 INC2 + Inc16 ABSX + +/* LDA */ +OpA9M1: + Immediate8 LDA + Lda8 IMM + +OpA9M0: + Immediate16 LDA + Lda16 IMM + +OpA5M1: + Direct8 LDA + call_S9XSA1GetByte + Lda8 DIR + +OpA5M0: + Direct8 LDA2 + call_S9XSA1GetWord + Lda16 DIR + +OpB5M1: + DirectIndexedX8 LDA + call_S9XSA1GetByte + Lda8 DIX + +OpB5M0: + DirectIndexedX8 LDA2 + call_S9XSA1GetWord + Lda16 DIX + +OpB2M1: + DirectIndirect8 LDA + call_S9XSA1GetByte + Lda8 DI + +OpB2M0: + DirectIndirect8 LDA2 + call_S9XSA1GetWord + Lda16 DI + +OpA1M1: + DirectIndexedIndirect8 LDA + call_S9XSA1GetByte + Lda8 DII + +OpA1M0: + DirectIndexedIndirect8 LDA2 + call_S9XSA1GetWord + Lda16 DII + +OpB1M1: + DirectIndirectIndexed8 LDA + call_S9XSA1GetByte + Lda8 DIIY + +OpB1M0: + DirectIndirectIndexed8 LDA2 + call_S9XSA1GetWord + Lda16 DIIY + +OpA7M1: + DirectIndirectLong8 LDA + call_S9XSA1GetByte + Lda8 DIL + +OpA7M0: + DirectIndirectLong8 LDA2 + call_S9XSA1GetWord + Lda16 DIL + +OpB7M1: + DirectIndirectIndexedLong8 LDA + call_S9XSA1GetByte + Lda8 DIIL + +OpB7M0: + DirectIndirectIndexedLong8 LDA2 + call_S9XSA1GetWord + Lda16 DIIL + +OpADM1: + Absolute8 LDA + call_S9XSA1GetByte + Lda8 ABS + +OpADM0: + Absolute8 LDA2 + call_S9XSA1GetWord + Lda16 ABS + +OpBDM1: + AbsoluteIndexedX8 LDA + call_S9XSA1GetByte + Lda8 ABSX + +OpBDM0: + AbsoluteIndexedX8 LDA2 + call_S9XSA1GetWord + Lda16 ABSX + +OpB9M1: + AbsoluteIndexedY8 LDA + call_S9XSA1GetByte + Lda8 ABSY + +OpB9M0: + AbsoluteIndexedY8 LDA2 + call_S9XSA1GetWord + Lda16 ABSY + +OpAFM1: + AbsoluteLong8 LDA + call_S9XSA1GetByte + Lda8 ABSL + +OpAFM0: + AbsoluteLong8 LDA2 + call_S9XSA1GetWord + Lda16 ABSL + +OpBFM1: + AbsoluteLongIndexedX8 LDA + call_S9XSA1GetByte + Lda8 ALX + +OpBFM0: + AbsoluteLongIndexedX8 LDA2 + call_S9XSA1GetWord + Lda16 ALX + +OpA3M1: + StackRelative8 LDA + call_S9XSA1GetByte + Lda8 SREL + +OpA3M0: + StackRelative8 LDA2 + call_S9XSA1GetWord + Lda16 SREL + +OpB3M1: + StackRelativeIndirectIndexed8 LDA + call_S9XSA1GetByte + Lda8 SRII + +OpB3M0: + StackRelativeIndirectIndexed8 LDA2 + call_S9XSA1GetWord + Lda16 SRII + +/* LDX */ +OpA2X1: + Immediate8 LDX + Ldx8 IMM + +OpA2X0: + Immediate16 LDX + Ldx16 IMM + +OpA6X1: + Direct8 LDX + call_S9XSA1GetByte + Ldx8 DIR + +OpA6X0: + Direct8 LDX2 + call_S9XSA1GetWord + Ldx16 DIR + +OpB6X1: + DirectIndexedY8 LDX + call_S9XSA1GetByte + Ldx8 DIY + +OpB6X0: + DirectIndexedY8 LDX2 + call_S9XSA1GetWord + Ldx16 DIY + +OpAEX1: + Absolute8 LDX + call_S9XSA1GetByte + Ldx8 ABS + +OpAEX0: + Absolute8 LDX2 + call_S9XSA1GetWord + Ldx16 ABS + +OpBEX1: + AbsoluteIndexedY8 LDX + call_S9XSA1GetByte + Ldx8 ABSY + +OpBEX0: + AbsoluteIndexedY8 LDX2 + call_S9XSA1GetWord + Ldx16 ABSY + +/* LDY */ +OpA0X1: + Immediate8 LDY + Ldy8 IMM + +OpA0X0: + Immediate16 LDY + Ldy16 IMM + +OpA4X1: + Direct8 LDY + call_S9XSA1GetByte + Ldy8 DIR + +OpA4X0: + Direct8 LDY2 + call_S9XSA1GetWord + Ldy16 DIR + +OpB4X1: + DirectIndexedX8 LDY + call_S9XSA1GetByte + Ldy8 DIX + +OpB4X0: + DirectIndexedX8 LDY2 + call_S9XSA1GetWord + Ldy16 DIX + +OpACX1: + Absolute8 LDY + call_S9XSA1GetByte + Ldy8 ABS + +OpACX0: + Absolute8 LDY2 + call_S9XSA1GetWord + Ldy16 ABS + +OpBCX1: + AbsoluteIndexedX8 LDY + call_S9XSA1GetByte + Ldy8 ABSX + +OpBCX0: + AbsoluteIndexedX8 LDY2 + call_S9XSA1GetWord + Ldy16 ABSX + +/* LSR */ +Op4AM1: + extu.b A,r1 + sub r1,A + mov #Carry,r0 + shlr r1 + bt/s .Lsr8Carry + or r0,FLAGS + add #-Carry,FLAGS +.Lsr8Carry: + or r1,A + SetZNjmp r1 + +Op4AM0: + extu.w A,A + shlr A + mov #Carry,r0 + bt/s .Lsr16Carry + or r0,FLAGS + add #-Carry,FLAGS +.Lsr16Carry: + Set16ZNjmp A + +Op46M1: + Direct8 LSR + Lsr8 DIR + +Op46M0: + Direct8 LSR2 + Lsr16 DIR + +Op56M1: + DirectIndexedX8 LSR + Lsr8 DIX + +Op56M0: + DirectIndexedX8 LSR2 + Lsr16 DIX + +Op4EM1: + Absolute8 LSR + Lsr8 ABS + +Op4EM0: + Absolute8 LSR2 + Lsr16 ABS + +Op5EM1: + AbsoluteIndexedX8 LSR + Lsr8 ABSX + +Op5EM0: + AbsoluteIndexedX8 LSR2 + Lsr16 ABSX + +/* ORA */ +Op09M1: + Immediate8 ORA + Ora8 IMM + +Op09M0: + Immediate16 ORA + Ora16 IMM + +Op05M1: + Direct8 ORA + call_S9XSA1GetByte + Ora8 DIR + +Op05M0: + Direct8 ORA2 + call_S9XSA1GetWord + Ora16 DIR + +Op15M1: + DirectIndexedX8 ORA + call_S9XSA1GetByte + Ora8 DIX + +Op15M0: + DirectIndexedX8 ORA2 + call_S9XSA1GetWord + Ora16 DIX + +Op12M1: + DirectIndirect8 ORA + call_S9XSA1GetByte + Ora8 DI + +Op12M0: + DirectIndirect8 ORA2 + call_S9XSA1GetWord + Ora16 DI + +Op01M1: + DirectIndexedIndirect8 ORA + call_S9XSA1GetByte + Ora8 DII + +Op01M0: + DirectIndexedIndirect8 ORA2 + call_S9XSA1GetWord + Ora16 DII + +Op11M1: + DirectIndirectIndexed8 ORA + call_S9XSA1GetByte + Ora8 DIIY + +Op11M0: + DirectIndirectIndexed8 ORA2 + call_S9XSA1GetWord + Ora16 DIIY + +Op07M1: + DirectIndirectLong8 ORA + call_S9XSA1GetByte + Ora8 DIL + +Op07M0: + DirectIndirectLong8 ORA2 + call_S9XSA1GetWord + Ora16 DIL + +Op17M1: + DirectIndirectIndexedLong8 ORA + call_S9XSA1GetByte + Ora8 DIIL + +Op17M0: + DirectIndirectIndexedLong8 ORA2 + call_S9XSA1GetWord + Ora16 DIIL + +Op0DM1: + Absolute8 ORA + call_S9XSA1GetByte + Ora8 ABS + +Op0DM0: + Absolute8 ORA2 + call_S9XSA1GetWord + Ora16 ABS + +Op1DM1: + AbsoluteIndexedX8 ORA + call_S9XSA1GetByte + Ora8 ABSX + +Op1DM0: + AbsoluteIndexedX8 ORA2 + call_S9XSA1GetWord + Ora16 ABSX + +Op19M1: + AbsoluteIndexedY8 ORA + call_S9XSA1GetByte + Ora8 ABSY + +Op19M0: + AbsoluteIndexedY8 ORA2 + call_S9XSA1GetWord + Ora16 ABSY + +Op0FM1: + AbsoluteLong8 ORA + call_S9XSA1GetByte + Ora8 ABSL + +Op0FM0: + AbsoluteLong8 ORA2 + call_S9XSA1GetWord + Ora16 ABSL + +Op1FM1: + AbsoluteLongIndexedX8 ORA + call_S9XSA1GetByte + Ora8 ALX + +Op1FM0: + AbsoluteLongIndexedX8 ORA2 + call_S9XSA1GetWord + Ora16 ALX + +Op03M1: + StackRelative8 ORA + call_S9XSA1GetByte + Ora8 SREL + +Op03M0: + StackRelative8 ORA2 + call_S9XSA1GetWord + Ora16 SREL + +Op13M1: + StackRelativeIndirectIndexed8 ORA + call_S9XSA1GetByte + Ora8 SRII + +Op13M0: + StackRelativeIndirectIndexed8 ORA2 + call_S9XSA1GetWord + Ora16 SRII + +/* ROL */ +Op2AM1: + GetCarry + extu.b A,r0 + mov #1,r2 + sub r0,A + or r2,FLAGS + rotcl r0 + shll8 r2 + tst r2,r0 + extu.b r0,r0 + bf/s .Rol8Carry + or r0,A + add #-Carry,FLAGS +.Rol8Carry: + SetZNjmp r0 + +Op2AM0: + GetCarry + mov #1,r2 + rotcl A + or r2,FLAGS + shll16 r2 + tst r2,A + bf/s .Rol16Carry + extu.w A,A + add #-Carry,FLAGS +.Rol16Carry: + Set16ZNjmp A + +Op26M1: + Direct8 ROL + Rol8 DIR + +Op26M0: + Direct8 ROL2 + Rol16 DIR + +Op36M1: + DirectIndexedX8 ROL + Rol8 DIX + +Op36M0: + DirectIndexedX8 ROL2 + Rol16 DIX + +Op2EM1: + Absolute8 ROL + Rol8 ABS + +Op2EM0: + Absolute8 ROL2 + Rol16 ABS + +Op3EM1: + AbsoluteIndexedX8 ROL + Rol8 ABSX + +Op3EM0: + AbsoluteIndexedX8 ROL2 + Rol16 ABSX + +/* ROR */ +Op6AM1: + mov #1,r1 + and FLAGS,r1 + extu.b A,r0 + shll8 r1 + sub r0,A + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror8Carry + or r1,FLAGS + add #-Carry,FLAGS +.Ror8Carry: + or r0,A + SetZNjmp r0 + +Op6AM0: + mov #1,r1 + and FLAGS,r1 + extu.w A,A + shll16 r1 + or r1,A + shlr A + mov #Carry,r1 + bt/s .Ror16Carry + or r1,FLAGS + add #-Carry,FLAGS +.Ror16Carry: + Set16ZNjmp A + +Op66M1: + Direct8 ROR + Ror8 DIR + +Op66M0: + Direct8 ROR2 + Ror16 DIR + +Op76M1: + DirectIndexedX8 ROR + Ror8 DIX + +Op76M0: + DirectIndexedX8 ROR2 + Ror16 DIX + +Op6EM1: + Absolute8 ROR + Ror8 ABS + +Op6EM0: + Absolute8 ROR2 + Ror16 ABS + +Op7EM1: + AbsoluteIndexedX8 ROR + Ror8 ABSX + +Op7EM0: + AbsoluteIndexedX8 ROR2 + Ror16 ABSX + +/* SBC */ +OpE9M1: + Immediate8 SBC + Sbc8 IMM + +OpE9M0: + Immediate16 SBC + Sbc16 IMM + +OpE5M1: + Direct8 SBC + call_S9XSA1GetByte + Sbc8 DIR + +OpE5M0: + Direct8 SBC2 + call_S9XSA1GetWord + Sbc16 DIR + +OpF5M1: + DirectIndexedX8 SBC + call_S9XSA1GetByte + Sbc8 DIX + +OpF5M0: + DirectIndexedX8 SBC2 + call_S9XSA1GetWord + Sbc16 DIX + +OpF2M1: + DirectIndirect8 SBC + call_S9XSA1GetByte + Sbc8 DI + +OpF2M0: + DirectIndirect8 SBC2 + call_S9XSA1GetWord + Sbc16 DI + +OpE1M1: + DirectIndexedIndirect8 SBC + call_S9XSA1GetByte + Sbc8 DII + +OpE1M0: + DirectIndexedIndirect8 SBC2 + call_S9XSA1GetWord + Sbc16 DII + +OpF1M1: + DirectIndirectIndexed8 SBC + call_S9XSA1GetByte + Sbc8 DIIY + +OpF1M0: + DirectIndirectIndexed8 SBC2 + call_S9XSA1GetWord + Sbc16 DIIY + +OpE7M1: + DirectIndirectLong8 SBC + call_S9XSA1GetByte + Sbc8 DIL + +OpE7M0: + DirectIndirectLong8 SBC2 + call_S9XSA1GetWord + Sbc16 DIL + +OpF7M1: + DirectIndirectIndexedLong8 SBC + call_S9XSA1GetByte + Sbc8 DIIL + +OpF7M0: + DirectIndirectIndexedLong8 SBC2 + call_S9XSA1GetWord + Sbc16 DIIL + +OpEDM1: + Absolute8 SBC + call_S9XSA1GetByte + Sbc8 ABS + +OpEDM0: + Absolute8 SBC2 + call_S9XSA1GetWord + Sbc16 ABS + +OpFDM1: + AbsoluteIndexedX8 SBC + call_S9XSA1GetByte + Sbc8 ABSX + +OpFDM0: + AbsoluteIndexedX8 SBC2 + call_S9XSA1GetWord + Sbc16 ABSX + +OpF9M1: + AbsoluteIndexedY8 SBC + call_S9XSA1GetByte + Sbc8 ABSY + +OpF9M0: + AbsoluteIndexedY8 SBC2 + call_S9XSA1GetWord + Sbc16 ABSY + +OpEFM1: + AbsoluteLong8 SBC + call_S9XSA1GetByte + Sbc8 ABSL + +OpEFM0: + AbsoluteLong8 SBC2 + call_S9XSA1GetWord + Sbc16 ABSL + +OpFFM1: + AbsoluteLongIndexedX8 SBC + call_S9XSA1GetByte + Sbc8 ALX + +OpFFM0: + AbsoluteLongIndexedX8 SBC2 + call_S9XSA1GetWord + Sbc16 ALX + +OpE3M1: + StackRelative8 SBC + call_S9XSA1GetByte + Sbc8 SREL + +OpE3M0: + StackRelative8 SBC2 + call_S9XSA1GetWord + Sbc16 SREL + +OpF3M1: + StackRelativeIndirectIndexed8 SBC + call_S9XSA1GetByte + Sbc8 SRII + +OpF3M0: + StackRelativeIndirectIndexed8 SBC2 + call_S9XSA1GetWord + Sbc16 SRII + +/* STA */ +Op85M1: + Direct8 STA + Sta8 DIR + +Op85M0: + Direct8 STA2 + Sta16 DIR + +Op95M1: + DirectIndexedX8 STA + Sta8 DIX + +Op95M0: + DirectIndexedX8 STA2 + Sta16 DIX + +Op92M1: + DirectIndirect8 STA + Sta8 DI + +Op92M0: + DirectIndirect8 STA2 + Sta16 DI + +Op81M1: + DirectIndexedIndirect8 STA + Sta8 DII + +Op81M0: + DirectIndexedIndirect8 STA2 + Sta16 DII + +Op91M1: + DirectIndirectIndexed8 STA + Sta8 DIIY + +Op91M0: + DirectIndirectIndexed8 STA2 + Sta16 DIIY + +Op87M1: + DirectIndirectLong8 STA + Sta8 DIL + +Op87M0: + DirectIndirectLong8 STA2 + Sta16 DIL + +Op97M1: + DirectIndirectIndexedLong8 STA + Sta8 DIIL + +Op97M0: + DirectIndirectIndexedLong8 STA2 + Sta16 DIIL + +Op8DM1: + Absolute8 STA + Sta8 ABS + +Op8DM0: + Absolute8 STA + Sta16 ABS + +Op9DM1: + AbsoluteIndexedX8 STA + Sta8 ABSX + +Op9DM0: + AbsoluteIndexedX8 STA2 + Sta16 ABSX + +Op99M1: + AbsoluteIndexedY8 STA + Sta8 ABSY + +Op99M0: + AbsoluteIndexedY8 STA2 + Sta16 ABSY + +Op8FM1: + AbsoluteLong8 STA + Sta8 ABSL + +Op8FM0: + AbsoluteLong8 STA2 + Sta16 ABSL + +Op9FM1: + AbsoluteLongIndexedX8 STA + Sta8 ALX + +Op9FM0: + AbsoluteLongIndexedX8 STA2 + Sta16 ALX + +Op83M1: + StackRelative8 STA + Sta8 SREL + +Op83M0: + StackRelative8 STA2 + Sta16 SREL + +Op93M1: + StackRelativeIndirectIndexed8 STA + Sta8 SRII + +Op93M0: + StackRelativeIndirectIndexed8 STA2 + Sta16 SRII + +/* STX */ +Op86X1: + Direct8 STX + Stx8 DIR + +Op86X0: + Direct8 STX2 + Stx16 DIR + +Op96X1: + DirectIndexedY8 STX + Stx8 DIY + +Op96X0: + DirectIndexedY8 STX2 + Stx16 DIY + +Op8EX1: + Absolute8 STX + Stx8 ABS + +Op8EX0: + Absolute8 STX2 + Stx16 ABS + +/* STY */ +Op84X1: + Direct8 STY + Sty8 DIR + +Op84X0: + Direct8 STY2 + Sty16 DIR + +Op94X1: + DirectIndexedX8 STY + Sty8 DIX + +Op94X0: + DirectIndexedX8 STY2 + Sty16 DIX + +Op8CX1: + Absolute8 STY + Sty8 ABS + +Op8CX0: + Absolute8 STY2 + Sty16 ABS + +/* STZ */ +Op64M1: + Direct8 STZ + Stz8 DIR + +Op64M0: + Direct8 STZ2 + Stz16 DIR + +Op74M1: + DirectIndexedX8 STZ + Stz8 DIX + +Op74M0: + DirectIndexedX8 STZ2 + Stz16 DIX + +Op9CM1: + Absolute8 STZ + Stz8 ABS + +Op9CM0: + Absolute8 STZ2 + Stz16 ABS + +Op9EM1: + AbsoluteIndexedX8 STZ + Stz8 ABSX + +Op9EM0: + AbsoluteIndexedX8 STZ2 + Stz16 ABSX + +/* TRB */ +Op14M1: + Direct8 TRB + Trb8 DIR + +Op14M0: + Direct8 TRB2 + Trb16 DIR + +Op1CM1: + Absolute8 TRB + Trb8 ABS + +Op1CM0: + Absolute8 TRB2 + Trb16 ABS + +/* TSB */ +Op04M1: + Direct8 TSB + Tsb8 DIR + +Op04M0: + Direct8 TSB2 + Tsb16 DIR + +Op0CM1: + Absolute8 TSB + Tsb8 ABS + +Op0CM0: + Absolute8 TSB2 + Tsb16 ABS + +/* BCC */ +Op90: + Relative + GetNotCarry + bf .BCC_EXIT: + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BCC_EXIT: + jmp @r13 + nop + +/* BCS */ +OpB0: + Relative + GetNotCarry + bt .BCS_EXIT: + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BCS_EXIT: + jmp @r13 + nop + +/* BEQ */ +OpF0: + Relative + extu.w r7,r3 + tst r3,r3 + bf .BEQ_EXIT + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BEQ_EXIT: + jmp @r13 + nop + +/* BMI */ +Op30: + Relative + cmp/pz r7 + bt .BMI_EXIT + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BMI_EXIT: + jmp @r13 + nop + +/* BNE */ +OpD0: + Relative + extu.w r7,r3 + tst r3,r3 + bt .BNE_EXIT + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BNE_EXIT: + jmp @r13 + nop + +/* BPL */ +Op10: + Relative + cmp/pz r7 + bf .BPL_EXIT + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BPL_EXIT: + jmp @r13 + nop + +/* BRA */ +Op80: + Relative + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC + +/* BVC */ +Op50: + Relative + mov #Overflow,r1 + tst r1,FLAGS + bf .BVC_EXIT: + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BVC_EXIT: + jmp @r13 + nop + +/* BVS */ +Op70: + Relative + mov #Overflow,r1 + tst r1,FLAGS + bt .BVS_EXIT: + extu.w r4,PC + mov.l SA1PCBase,r3 + jmp @r13 + add r3,PC +.BVS_EXIT: + jmp @r13 + nop + +/* BRL */ +Op82: + RelativeLong BRL + extu.w r4,r4 + mov.l SA1ShiftedPB,r2 + mov.l S9xSetPCBase,r3 + or r2,r4 + Xlink + +/* CLC */ +Op18: + mov #~Carry,r0 + jmp @r13 + and r0,FLAGS + +/* CLD */ +OpD8: + mov #~Decimal,r0 + jmp @r13 + and r0,FLAGS + +/* CLI */ +Op58: + mov #~IRQ,r2 + mov.b SA1IRQActive,r0 + tst r0,r0 + bt .CLI_EXIT + /* XXX: test for Settings.DisableIRQ */ + mov.l S9xSA1Opcode_IRQ,r3 + and r2,FLAGS + Xlink +.CLI_EXIT: + jmp @r13 + and r2,FLAGS + +/* CLV */ +OpB8: + mov #~Overflow,r0 + jmp @r13 + and r0,FLAGS + +/* DEX */ +OpCAX1: + mov.b XL,r0 + add #-1,r0 + mov.b r0,XL + SetZNjmp r0 + +OpCAX0: + mov.w XX,r0 + add #-1,r0 + mov.w r0,XX + Set16ZNjmp r0 + +/* DEY */ +Op88X1: + mov.b YL,r0 + add #-1,r0 + mov.b r0,YL + SetZNjmp r0 + +Op88X0: + mov.w YY,r0 + add #-1,r0 + mov.w r0,YY + Set16ZNjmp r0 + +/* INX */ +OpE8X1: + mov.b XL,r0 + add #1,r0 + mov.b r0, XL + SetZNjmp r0 + +OpE8X0: + mov.w XX,r0 + add #1,r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* INY */ +OpC8X1: + mov.b YL,r0 + add #1,r0 + mov.b r0, YL + SetZNjmp r0 + +OpC8X0: + mov.w YY,r0 + add #1,r0 + mov.w r0,YY + Set16ZNjmp r0 + +/* NOP */ +OpEA: + jmp @r13 + nop + +/* PEA */ +OpF4: + Immediate16 PEA + PushWordjmp PEA + +/* PEI */ +OpD4: + DirectIndirect8 PEI + extu.w r4,r0 + PushWordjmp PEI + +/* PER */ +Op62: + RelativeLong PER + extu.w r4,r0 + PushWordjmp PER + +/* PHA */ +Op48M1: + extu.b A,r0 + PushBytejmp PHA + +Op48M0: + extu.w A,r0 + PushWordjmp PHA + +/* PHB */ +Op8B: + mov.b DB, r0 + PushBytejmp PHB + +/* PHD */ +Op0B: + mov.w DD, r0 + PushWordjmp PHD + +/* PHK */ +Op4B: + mov.b PB, r0 + PushBytejmp PHK + +/* PHP */ +Op08: + S9xSA1PackStatus PHP + extu.b FLAGS, r0 + PushBytejmp PHP + +/* PHX */ +OpDAX1: + mov.b XL, r0 + PushBytejmp PHX + +OpDAX0: + mov.w XX, r0 + PushWordjmp PHX + +/* PHY */ +Op5AX1: + mov.b YL, r0 + PushBytejmp PHY + +Op5AX0: + mov.w YY, r0 + PushWordjmp PHY + +/* PLA */ +Op68M1: + PullByte PLA + extu.b A,r1 + add r0,A + sub r1,A + SetZNjmp A + +Op68M0: + PullWord PLA + extu.w r0,A + Set16ZNjmp A + +/* PLB */ +OpAB: + PullByte PLB + mov.b r0, DB + extu.b r0,r1 + shll16 r1 + mov.l r1,SA1ShiftedDB + SetZNjmp r0 + +/* PLD */ +Op2B: + PullWord PLD + mov.w r0 DD + Set16ZNjmp r0 + +/* PLP */ +Op28: + PullByte PLP + extu.b FLAGS,r1 + add r0,FLAGS + mov #IndexFlag,r2 + sub r1,FLAGS + tst r2,r0 + bt .PLP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.PLP16: + S9xSA1UnpackStatus PLP + S9xSA1FixCycles PLP + CheckForIrqjmp PLP + +/* PLX */ +OpFAX1: + PullByte PLX + mov.b r0, XL + SetZNjmp r0 + +OpFAX0: + PullWord PLX + mov.w r0, XX + Set16ZNjmp r0 + +/* PLY */ +Op7AX1: + PullByte PLY + mov.b r0, YL + SetZNjmp r0 + +Op7AX0: + PullWord PLY + mov.w r0, YY + Set16ZNjmp r0 + +/* SEC */ +Op38: + mov #Carry,r0 + jmp @r13 + or r0,FLAGS + +/* SED */ +OpF8: + + mov #Decimal,r0 + jmp @r13 + or r0,FLAGS + +/* SEI */ +Op78: + mov #IRQ,r0 + jmp @r13 + or r0,FLAGS + +/* TAX */ +OpAAX1: + extu.b A,r0 + mov.b r0, XL + SetZNjmp r0 + +OpAAX0: + extu.w A,r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* TAY */ +OpA8X1: + extu.b A,r0 + mov.b r0, YL + SetZNjmp r0 + +OpA8X0: + extu.w A,r0 + mov.w r0, YY + Set16ZNjmp r0 + +/* TCD */ +Op5B: + extu.w A,r0 + mov.w r0, DD + Set16ZNjmp r0 + +/* TCS */ +Op1B: + extu.w A,r0 + mov #Emulation/4,r1 + mov.w r0, SS + shll2 r1 + tst r1,FLAGS16 + bt .TCS_EXIT + mov #1,r0 + mov.b r0,SH +.TCS_EXIT: + jmp @r13 + nop + +/* TDC */ +Op7B: + mov.w DD, r0 + extu.w r0,A + Set16ZNjmp A + +/* TSC */ +Op3B: + mov.w SS, r0 + extu.w r0,A + Set16ZNjmp A + +/* TSX */ +OpBAX1: + mov.b SL, r0 + mov.b r0, XL + SetZNjmp r0 + +OpBAX0: + mov.w SS, r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* TXA */ +Op8AM1: + mov.b XL, r0 + extu.b A,r1 + extu.b r0,r0 + sub r1,A + add r0,A + SetZNjmp A + +Op8AM0: + mov.w XX, r0 + extu.w r0,A + Set16ZNjmp A + +/* TXS */ +Op9A: + mov.w XX, r0 + mov #Emulation/4,r1 + mov.w r0, SS + shll2 r1 + tst r1,FLAGS16 + bt .TXS_EXIT + mov #1,r0 + mov.b r0,SH +.TXS_EXIT: + jmp @r13 + nop + +/* TXY */ +Op9BX1: + mov.b XL, r0 + mov.b r0, YL + SetZNjmp r0 + +Op9BX0: + mov.w XX, r0 + mov.w r0, YY + Set16ZNjmp r0 + +/* TYA */ +Op98M1: + mov.b YL, r0 + extu.b A,r1 + extu.b r0,r0 + sub r1,A + add r0,A + SetZNjmp A + +Op98M0: + mov.w YY, r0 + extu.w r0,A + Set16ZNjmp A + +/* TYX */ +OpBBX1: + mov.b YL, r0 + mov.b r0, XL + SetZNjmp r0 + +OpBBX0: + mov.w YY, r0 + mov.w r0, XX + Set16ZNjmp r0 + +/* XCE */ +OpFB: + mov FLAGS16, r0 + mov.w .notemcymask,r1 + and r1,FLAGS16 + tst #Carry,r0 + mov.w .emflag0,r1 + bt .XCE_NO_CARRY + or r1,FLAGS16 +.XCE_NO_CARRY: + tst r1,r0 + bt/s .XCE_NO_EMU + tst r1,FLAGS + add #Carry,FLAGS +.XCE_NO_EMU: + bt/s .XCE_NO_EMULATION2 + mov #IndexFlag,r1 + mov #MemoryFlag|IndexFlag,r0 + or r0,FLAGS + mov #1,r0 + mov.b r0,SH +.XCE_NO_EMULATION2: + tst r1,FLAGS + bt .XCE_NO_INDEX + mov #0,r0 + mov.b r0, XH + mov.b r0, YH +.XCE_NO_INDEX: + S9xSA1FixCycles XCE + jmp @r13 + nop + +.emflag0: + .word Emulation + .align 2 + +Op00: + mov.w .emflag,r0 + tst r0,FLAGS16 + bf .BRK_EMULATION + mov.b PB, r0 + PushByte BRK1 + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord BRK2 + + S9xSA1PackStatus BRK + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte BRK3 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB + mov.l S9xGetWord,r3 + mov #-0x1a,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink +.BRK_EMULATION: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord BRK2 + + S9xSA1PackStatus BRK2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte BRK3 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB + mov.l S9xGetWord,r3 + mov #-2,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink + +.notemcymask: + .word ~(Emulation|Carry) +.emflag: + .word Emulation + + .align 2 + + +.globl S9xSA1Opcode_IRQ_r +S9xSA1Opcode_IRQ_r: + mov.w .emflag1,r0 + sts.l pr,@-r15 + tst r0,FLAGS16 + bf .IRQ_EMULATION + mov.b PB, r0 + PushByte IRQ1 + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord IRQ2 + + S9xSA1PackStatus IRQ + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte IRQ3 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB +// XXX: FIXME: wrong vector + mov.l .FillRAM2,r3 + mov.w .n2207,r0 + mov.b @(r0,r3),r1 + add #1,r0 + extu.b r1,r1 + mov.b @(r0,r3),r4 + shll8 r4 + mov.l S9xSetPCBase,r3 + or r1,r4 + jmp @r3 + extu.w r4,r4 +.IRQ_EMULATION: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord IRQ4 + + S9xSA1PackStatus IRQ2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte IRQ5 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB +// XXX: FIXME: wrong vector + mov.l .FillRAM2,r3 + mov.w .n2207,r0 + mov.b @(r0,r3),r1 + add #1,r0 + extu.b r1,r1 + mov.b @(r0,r3),r4 + shll8 r4 + mov.l S9xSetPCBase,r3 + or r1,r4 + jmp @r3 + extu.w r4,r4 + + +.emflag1: + .word Emulation + + .align 2 +.FillRAM2: + .long FillRAM +.n2207: + .word 0x2207 + .align 2 + + +.globl S9xSA1Opcode_NMI_r + +S9xSA1Opcode_NMI_r: + mov.w .emflag2,r0 + sts.l pr,@-r15 + tst r0,FLAGS16 + bf .NMI_EMULATION + mov.b PB, r0 + PushByte NMI1 + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord NMI2 + + S9xSA1PackStatus NMI + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte NMI3 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB +// XXX: FIXME: wrong vector + mov.l .FillRAM3,r3 + mov.w .n2205,r0 + mov.b @(r0,r3),r1 + add #1,r0 + extu.b r1,r1 + mov.b @(r0,r3),r4 + shll8 r4 + mov.l S9xSetPCBase,r3 + or r1,r4 + jmp @r3 + extu.w r4,r4 +.NMI_EMULATION: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + PushWord NMI4 + + S9xSA1PackStatus NMI2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte NMI5 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB +// XXX: FIXME: wrong vector + mov.l .FillRAM3,r3 + mov.w .n2205,r0 + mov.b @(r0,r3),r1 + add #1,r0 + extu.b r1,r1 + mov.b @(r0,r3),r4 + shll8 r4 + mov.l S9xSetPCBase,r3 + or r1,r4 + jmp @r3 + extu.w r4,r4 + + .align 2 +.FillRAM3: + .long FillRAM +.emflag2: + .word Emulation +.n2205: + .word 0x2205 + + .align 2 + + +Op02: + mov.w .emflag25,r0 + tst r0,FLAGS16 + bf .COP_EMULATION + mov.b PB, r0 + PushByte COP1 + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord COP2 + + S9xSA1PackStatus COP + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte COP3 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB + mov.l S9xGetWord,r3 + mov #-0x1c,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink +.COP_EMULATION: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord COP4 + + S9xSA1PackStatus COP2 + extu.b FLAGS, r0 + mov #Decimal|IRQ,r1 + or r1,FLAGS + add #-Decimal, FLAGS + + PushByte COP5 + mov #0,r0 + mov.l r0,SA1ShiftedPB + mov.b r0,PB + mov.l S9xGetWord,r3 + mov #-0xc,r4 + jsr @r3 + extu.w r4,r4 + mov.l S9xSetPCBase,r3 + extu.w r0,r4 + Xlink + +.emflag25: + .word Emulation + + + .align 2 + + +/* JML */ +OpDC: + AbsoluteIndirectLong8 JML + mov.l r0,SA1ShiftedPB + shlr16 r0 + mov.l S9xSetPCBase,r3 + mov.b r0,PB + Xlink + +Op5C: + AbsoluteLong8 JML + mov.l r0,SA1ShiftedPB + shlr16 r0 + mov.l S9xSetPCBase,r3 + mov.b r0,PB + Xlink + +/* JMP */ +Op4C: + Absolute8 JMP + extu.w r4,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +Op6C: + AbsoluteIndirect8 JMP + extu.w r4,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +Op7C: + AbsoluteIndexedIndirect8 JMP + extu.w r4,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSL */ +Op22: + mov.b PB, r0 + PushByte JSL_ABSL + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #2,r0 + PushWord JSL_ABSL + AbsoluteLong8 JSL + mov.l r0,SA1ShiftedPB + shlr16 r0 + mov.l S9xSetPCBase,r3 + mov.b r0,PB + Xlink + +/* RTL */ +Op6B: + PullWord RTL + mov.l r0,@-r15 + PullByte RTL + mov.l @r15+,r4 + mov.b r0, PB + add #1,r4 + shll16 r0 + extu.w r4,r4 + mov.l r0,SA1ShiftedPB + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSR ABS */ +Op20: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord JSR_ABS + Absolute8 JSR_ABS + extu.w r4,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* JSR ABS INDEXED INDIRECT */ +OpFC: + mov.l SA1PCBase,r0 + neg r0,r0 + add PC, r0 + add #1,r0 + PushWord JSR_AII + AbsoluteIndexedIndirect8 JSR + extu.w r4,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* RTS */ +Op60: + PullWord RTS + add #1,r0 + extu.w r0,r4 + mov.l SA1ShiftedPB,r0 + mov.l S9xSetPCBase,r3 + or r0,r4 + Xlink + +/* MVN */ +Op54X1: + mov.b @PC+,r0 + mov.b r0,DB + extu.b r0,r0 + shll16 r0 + mov.l r0,SA1ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + jsr @r3 + add r0,r4 +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + mov r5,r0 +#else + mov r0,r3 + mov.w YY,r0 + extu.w r0,r1 + mov r3,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 +#endif + jsr @r3 + add r1,r4 + mov.b XL,r0 + add #1,r0 + mov.b r0,XL + mov.b YL,r0 + add #1,r0 + mov.b r0,YL + add #-1,A + cmp/pz A + bf/s .MVN_EXIT8 + extu.w A,A + jmp @r13 + add #-3,PC +.MVN_EXIT8: + jmp @r13 + nop + +Op54X0: + mov.b @PC+,r0 + mov.b r0,DB + extu.b r0,r0 + shll16 r0 + mov.l r0,SA1ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r1 + add #1,r0 + add r1,r4 + jsr @r3 + mov.w r0,XX +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + add #1,r0 + add r1,r4 + mov.w r0,YY + jsr @r3 + mov r5,r0 +#else + mov r0,r1 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r3 + add #1,r0 + add r3,r4 + mov.l S9xSetByte,r3 + mov.w r0,YY + jsr @r3 + mov r1,r0 +#endif + add #-1,A + cmp/pz A + bf/s .MVN_EXIT16 + extu.w A,A + jmp @r13 + add #-3,PC +.MVN_EXIT16: + jmp @r13 + nop + +/* MVP */ +Op44X1: + mov.b @PC+,r0 + mov.b r0,DB + extu.b r0,r0 + shll16 r0 + mov.l r0,SA1ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r0 + jsr @r3 + add r0,r4 +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + mov r5,r0 + jsr @r3 + add r1,r4 +#else + mov r0,r3 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r1 + mov r3,r0 + mov.l S9xSetByte,r3 + jsr @r3 + add r1,r4 +#endif + mov.b XL,r0 + add #-1,r0 + mov.b r0,XL + mov.b YL,r0 + add #-1,r0 + mov.b r0,YL + add #-1,A + cmp/pz A + bf/s .MVP_EXIT8 + extu.w A,A + jmp @r13 + add #-3,PC +.MVP_EXIT8: + jmp @r13 + nop + +Op44X0: + mov.b @PC+,r0 + mov.b r0,DB + extu.b r0,r0 + shll16 r0 + mov.l r0,SA1ShiftedDB + mov.l r0,@-r15 + mov.b @PC+,r4 + mov.l S9xGetByte,r3 + extu.b r4,r4 + mov.w XX,r0 + shll16 r4 + extu.w r0,r1 + add #-1,r0 + add r1,r4 + jsr @r3 + mov.w r0,XX +#ifdef USE_ASM_R5 + mov r0,r5 + mov.w YY,r0 + mov.l S9xSetByte,r3 + mov.l @r15+,r4 + extu.w r0,r1 + add #-1,r0 + add r1,r4 + mov.w r0,YY + jsr @r3 + mov r5,r0 +#else + mov r0,r3 + mov.w YY,r0 + mov.l @r15+,r4 + extu.w r0,r1 + add #-1,r0 + mov.w r0,YY + mov r3,r0 + mov.l S9xSetByte,r3 + jsr @r3 + add r1,r4 +#endif + add #-1,A + cmp/pz A + bf/s .MVP_EXIT16 + extu.w A,A + jmp @r13 + add #-3,PC +.MVP_EXIT16: + jmp @r13 + nop + +/* REP */ +OpC2: + mov.b @PC+,r0 + mov #Zero,r1 + extu.b r0,r0 + mov #-1,r2 + and r0,r1 + not r0,r0 + or r1,r7 + and r0,FLAGS + extu.w r2,r2 + exts.b r0,r1 + mov.w .emflag3,r0 + or r2,r1 + tst r0,FLAGS16 + bt/s .REP_NO_EMU + and r1,r7 + mov #(MemoryFlag | IndexFlag), r0 + or r0, FLAGS + +.REP_NO_EMU: + mov #IndexFlag,r0 + tst r0,FLAGS + bt .REP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.REP16: + S9xSA1FixCycles REP + CheckForIrqjmp REP + +/* SEP */ +OpE2: + mov.b @PC+,r0 + mov #Zero,r1 + extu.b r0,r0 + and r0,r1 + exts.b r0,r2 + shll8 r1 + or r0,FLAGS + shlr2 r1 + extu.w r2,r0 + exts.b r1,r1 + sub r0,r2 + shlr16 r1 + or r2,r7 + mov.w .emflag3,r0 + not r1,r1 + tst r0,FLAGS16 + bt/s .SEP_NO_EMU + and r1,r7 + + mov #(MemoryFlag | IndexFlag), r0 + or r0, FLAGS + +.SEP_NO_EMU: + mov #IndexFlag,r0 + tst r0,FLAGS + bt .SEP16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.SEP16: + S9xSA1FixCycles SEP + jmp @r13 + nop + + +/* XBA */ +OpEB: + swap.b A,A + SetZNjmp A + +/* RTI */ +Op40: + PullByte RTI + extu.b FLAGS,r1 + add r0,FLAGS + sub r1,FLAGS + PullWord RTI + mov.w .emflag3,r1 + mov.l r0,@-r15 + tst r1, FLAGS16 + bf .RTI_EMU + PullByte RTI2 + bra .RTI_SKIP_EMU + extu.b r0,r0 +.RTI_EMU: + mov #(MemoryFlag | IndexFlag), r0 + or r0,FLAGS + /*XXX: HERE xorl %eax, %eax*/ + mov.l SA1ShiftedPB,r0 + shlr16 r0 +.RTI_SKIP_EMU: + mov.b r0,PB + mov.l @r15+,r4 + shll16 r0 + mov.l r0,SA1ShiftedPB + + mov.l S9xSetPCBase,r3 + jsr @r3 + or r0,r4 + mov #IndexFlag,r0 + tst r0,FLAGS + bt .RTI16 + mov #0,r0 + mov.b r0,XH + mov.b r0,YH +.RTI16: + S9xSA1UnpackStatus RTI + S9xSA1FixCycles RTI + CheckForIrqjmp RTI + +.emflag3: + .word Emulation + +/* WAI */ +OpCB: + mov #1,r0 + add #-1,PC +#ifndef USE_ASM_R12 + add #16,r11 +#endif + mov.b r0,SA1WaitingForInterrupt +#ifndef USE_ASM_R12 + add #-16,r11 +#endif +#if 0 +// XXX: FIXME + movb Shutdown, %al + testb %al, %al + je .NoShutdown +#ifndef USE_ASM_R12 + add #16,r11 +#endif + movl NextEvent, CYCLES +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmpb $0, APUExecuting + je S9xSA1MainAsmLoop + movb $0, CPUExecuting +.WAITExecAPU: + xorl %eax,%eax +#ifdef SPC700_C + movl APUPC,%edx + SAVE_CYCLES + movb (%edx),%al +#else + movb (APUPC),%al +#endif + movl S9xAPUCycles(,%eax,4), %edx + movl S9xApuOpcodes(,%eax,4),%eax + addl %edx, APUCycles + call *%eax +#ifdef SPC700_C + LOAD_CYCLES +#endif +#ifndef USE_ASM_R12 + add #16,r11 +#endif + movl NextEvent, %eax +#ifndef USE_ASM_R12 + add #-16,r11 +#endif + cmpl %eax, APUCycles + jl .WAITExecAPU + movb $1, CPUExecuting + jmp S9xSA1MainAsmLoop +#endif +.NoShutdown: + jmp @r13 + nop + +/* ??? */ +OpDB: + mov.l Flags,r0 + add #-1,PC + or #DEBUG_MODE_FLAG, r0 + jmp @r13 + mov.l r0,Flags + +Op42: + jmp @r13 + nop + +.globl _S9xSA1OpcodesM1X1 +.data + .align 2 +_S9xSA1OpcodesM1X1: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X1 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X1 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X1 + .long Op85M1 + .long Op86X1 + .long Op87M1 + .long Op88X1 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX1 + .long Op8DM1 + .long Op8EX1 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X1 + .long Op95M1 + .long Op96X1 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX1 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X1 + .long OpA1M1 + .long OpA2X1 + .long OpA3M1 + .long OpA4X1 + .long OpA5M1 + .long OpA6X1 + .long OpA7M1 + .long OpA8X1 + .long OpA9M1 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM1 + .long OpAEX1 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X1 + .long OpB5M1 + .long OpB6X1 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM1 + .long OpBEX1 + .long OpBFM1 + .long OpC0X1 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X1 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X1 + .long OpC9M1 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X1 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X1 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X1 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl _S9xSA1OpcodesM1X0 + .align 2 +_S9xSA1OpcodesM1X0: + .long Op00 + .long Op01M1 + .long Op02 + .long Op03M1 + .long Op04M1 + .long Op05M1 + .long Op06M1 + .long Op07M1 + .long Op08 + .long Op09M1 + .long Op0AM1 + .long Op0B + .long Op0CM1 + .long Op0DM1 + .long Op0EM1 + .long Op0FM1 + .long Op10 + .long Op11M1 + .long Op12M1 + .long Op13M1 + .long Op14M1 + .long Op15M1 + .long Op16M1 + .long Op17M1 + .long Op18 + .long Op19M1 + .long Op1AM1 + .long Op1B + .long Op1CM1 + .long Op1DM1 + .long Op1EM1 + .long Op1FM1 + .long Op20 + .long Op21M1 + .long Op22 + .long Op23M1 + .long Op24M1 + .long Op25M1 + .long Op26M1 + .long Op27M1 + .long Op28 + .long Op29M1 + .long Op2AM1 + .long Op2B + .long Op2CM1 + .long Op2DM1 + .long Op2EM1 + .long Op2FM1 + .long Op30 + .long Op31M1 + .long Op32M1 + .long Op33M1 + .long Op34M1 + .long Op35M1 + .long Op36M1 + .long Op37M1 + .long Op38 + .long Op39M1 + .long Op3AM1 + .long Op3B + .long Op3CM1 + .long Op3DM1 + .long Op3EM1 + .long Op3FM1 + .long Op40 + .long Op41M1 + .long Op42 + .long Op43M1 + .long Op44X0 + .long Op45M1 + .long Op46M1 + .long Op47M1 + .long Op48M1 + .long Op49M1 + .long Op4AM1 + .long Op4B + .long Op4C + .long Op4DM1 + .long Op4EM1 + .long Op4FM1 + .long Op50 + .long Op51M1 + .long Op52M1 + .long Op53M1 + .long Op54X0 + .long Op55M1 + .long Op56M1 + .long Op57M1 + .long Op58 + .long Op59M1 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM1 + .long Op5EM1 + .long Op5FM1 + .long Op60 + .long Op61M1 + .long Op62 + .long Op63M1 + .long Op64M1 + .long Op65M1 + .long Op66M1 + .long Op67M1 + .long Op68M1 + .long Op69M1 + .long Op6AM1 + .long Op6B + .long Op6C + .long Op6DM1 + .long Op6EM1 + .long Op6FM1 + .long Op70 + .long Op71M1 + .long Op72M1 + .long Op73M1 + .long Op74M1 + .long Op75M1 + .long Op76M1 + .long Op77M1 + .long Op78 + .long Op79M1 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM1 + .long Op7EM1 + .long Op7FM1 + .long Op80 + .long Op81M1 + .long Op82 + .long Op83M1 + .long Op84X0 + .long Op85M1 + .long Op86X0 + .long Op87M1 + .long Op88X0 + .long Op89M1 + .long Op8AM1 + .long Op8B + .long Op8CX0 + .long Op8DM1 + .long Op8EX0 + .long Op8FM1 + .long Op90 + .long Op91M1 + .long Op92M1 + .long Op93M1 + .long Op94X0 + .long Op95M1 + .long Op96X0 + .long Op97M1 + .long Op98M1 + .long Op99M1 + .long Op9A + .long Op9BX0 + .long Op9CM1 + .long Op9DM1 + .long Op9EM1 + .long Op9FM1 + .long OpA0X0 + .long OpA1M1 + .long OpA2X0 + .long OpA3M1 + .long OpA4X0 + .long OpA5M1 + .long OpA6X0 + .long OpA7M1 + .long OpA8X0 + .long OpA9M1 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM1 + .long OpAEX0 + .long OpAFM1 + .long OpB0 + .long OpB1M1 + .long OpB2M1 + .long OpB3M1 + .long OpB4X0 + .long OpB5M1 + .long OpB6X0 + .long OpB7M1 + .long OpB8 + .long OpB9M1 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM1 + .long OpBEX0 + .long OpBFM1 + .long OpC0X0 + .long OpC1M1 + .long OpC2 + .long OpC3M1 + .long OpC4X0 + .long OpC5M1 + .long OpC6M1 + .long OpC7M1 + .long OpC8X0 + .long OpC9M1 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM1 + .long OpCEM1 + .long OpCFM1 + .long OpD0 + .long OpD1M1 + .long OpD2M1 + .long OpD3M1 + .long OpD4 + .long OpD5M1 + .long OpD6M1 + .long OpD7M1 + .long OpD8 + .long OpD9M1 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM1 + .long OpDEM1 + .long OpDFM1 + .long OpE0X0 + .long OpE1M1 + .long OpE2 + .long OpE3M1 + .long OpE4X0 + .long OpE5M1 + .long OpE6M1 + .long OpE7M1 + .long OpE8X0 + .long OpE9M1 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM1 + .long OpEEM1 + .long OpEFM1 + .long OpF0 + .long OpF1M1 + .long OpF2M1 + .long OpF3M1 + .long OpF4 + .long OpF5M1 + .long OpF6M1 + .long OpF7M1 + .long OpF8 + .long OpF9M1 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM1 + .long OpFEM1 + .long OpFFM1 + +.globl _S9xSA1OpcodesM0X0 + .align 2 +_S9xSA1OpcodesM0X0: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X0 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X0 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX0 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX0 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X0 + .long Op85M0 + .long Op86X0 + .long Op87M0 + .long Op88X0 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX0 + .long Op8DM0 + .long Op8EX0 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X0 + .long Op95M0 + .long Op96X0 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX0 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X0 + .long OpA1M0 + .long OpA2X0 + .long OpA3M0 + .long OpA4X0 + .long OpA5M0 + .long OpA6X0 + .long OpA7M0 + .long OpA8X0 + .long OpA9M0 + .long OpAAX0 + .long OpAB + .long OpACX0 + .long OpADM0 + .long OpAEX0 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X0 + .long OpB5M0 + .long OpB6X0 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX0 + .long OpBBX0 + .long OpBCX0 + .long OpBDM0 + .long OpBEX0 + .long OpBFM0 + .long OpC0X0 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X0 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X0 + .long OpC9M0 + .long OpCAX0 + .long OpCB + .long OpCCX0 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX0 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X0 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X0 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X0 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX0 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX0 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + +.globl _S9xSA1OpcodesM0X1 + .align 2 +_S9xSA1OpcodesM0X1: + .long Op00 + .long Op01M0 + .long Op02 + .long Op03M0 + .long Op04M0 + .long Op05M0 + .long Op06M0 + .long Op07M0 + .long Op08 + .long Op09M0 + .long Op0AM0 + .long Op0B + .long Op0CM0 + .long Op0DM0 + .long Op0EM0 + .long Op0FM0 + .long Op10 + .long Op11M0 + .long Op12M0 + .long Op13M0 + .long Op14M0 + .long Op15M0 + .long Op16M0 + .long Op17M0 + .long Op18 + .long Op19M0 + .long Op1AM0 + .long Op1B + .long Op1CM0 + .long Op1DM0 + .long Op1EM0 + .long Op1FM0 + .long Op20 + .long Op21M0 + .long Op22 + .long Op23M0 + .long Op24M0 + .long Op25M0 + .long Op26M0 + .long Op27M0 + .long Op28 + .long Op29M0 + .long Op2AM0 + .long Op2B + .long Op2CM0 + .long Op2DM0 + .long Op2EM0 + .long Op2FM0 + .long Op30 + .long Op31M0 + .long Op32M0 + .long Op33M0 + .long Op34M0 + .long Op35M0 + .long Op36M0 + .long Op37M0 + .long Op38 + .long Op39M0 + .long Op3AM0 + .long Op3B + .long Op3CM0 + .long Op3DM0 + .long Op3EM0 + .long Op3FM0 + .long Op40 + .long Op41M0 + .long Op42 + .long Op43M0 + .long Op44X1 + .long Op45M0 + .long Op46M0 + .long Op47M0 + .long Op48M0 + .long Op49M0 + .long Op4AM0 + .long Op4B + .long Op4C + .long Op4DM0 + .long Op4EM0 + .long Op4FM0 + .long Op50 + .long Op51M0 + .long Op52M0 + .long Op53M0 + .long Op54X1 + .long Op55M0 + .long Op56M0 + .long Op57M0 + .long Op58 + .long Op59M0 + .long Op5AX1 + .long Op5B + .long Op5C + .long Op5DM0 + .long Op5EM0 + .long Op5FM0 + .long Op60 + .long Op61M0 + .long Op62 + .long Op63M0 + .long Op64M0 + .long Op65M0 + .long Op66M0 + .long Op67M0 + .long Op68M0 + .long Op69M0 + .long Op6AM0 + .long Op6B + .long Op6C + .long Op6DM0 + .long Op6EM0 + .long Op6FM0 + .long Op70 + .long Op71M0 + .long Op72M0 + .long Op73M0 + .long Op74M0 + .long Op75M0 + .long Op76M0 + .long Op77M0 + .long Op78 + .long Op79M0 + .long Op7AX1 + .long Op7B + .long Op7C + .long Op7DM0 + .long Op7EM0 + .long Op7FM0 + .long Op80 + .long Op81M0 + .long Op82 + .long Op83M0 + .long Op84X1 + .long Op85M0 + .long Op86X1 + .long Op87M0 + .long Op88X1 + .long Op89M0 + .long Op8AM0 + .long Op8B + .long Op8CX1 + .long Op8DM0 + .long Op8EX1 + .long Op8FM0 + .long Op90 + .long Op91M0 + .long Op92M0 + .long Op93M0 + .long Op94X1 + .long Op95M0 + .long Op96X1 + .long Op97M0 + .long Op98M0 + .long Op99M0 + .long Op9A + .long Op9BX1 + .long Op9CM0 + .long Op9DM0 + .long Op9EM0 + .long Op9FM0 + .long OpA0X1 + .long OpA1M0 + .long OpA2X1 + .long OpA3M0 + .long OpA4X1 + .long OpA5M0 + .long OpA6X1 + .long OpA7M0 + .long OpA8X1 + .long OpA9M0 + .long OpAAX1 + .long OpAB + .long OpACX1 + .long OpADM0 + .long OpAEX1 + .long OpAFM0 + .long OpB0 + .long OpB1M0 + .long OpB2M0 + .long OpB3M0 + .long OpB4X1 + .long OpB5M0 + .long OpB6X1 + .long OpB7M0 + .long OpB8 + .long OpB9M0 + .long OpBAX1 + .long OpBBX1 + .long OpBCX1 + .long OpBDM0 + .long OpBEX1 + .long OpBFM0 + .long OpC0X1 + .long OpC1M0 + .long OpC2 + .long OpC3M0 + .long OpC4X1 + .long OpC5M0 + .long OpC6M0 + .long OpC7M0 + .long OpC8X1 + .long OpC9M0 + .long OpCAX1 + .long OpCB + .long OpCCX1 + .long OpCDM0 + .long OpCEM0 + .long OpCFM0 + .long OpD0 + .long OpD1M0 + .long OpD2M0 + .long OpD3M0 + .long OpD4 + .long OpD5M0 + .long OpD6M0 + .long OpD7M0 + .long OpD8 + .long OpD9M0 + .long OpDAX1 + .long OpDB + .long OpDC + .long OpDDM0 + .long OpDEM0 + .long OpDFM0 + .long OpE0X1 + .long OpE1M0 + .long OpE2 + .long OpE3M0 + .long OpE4X1 + .long OpE5M0 + .long OpE6M0 + .long OpE7M0 + .long OpE8X1 + .long OpE9M0 + .long OpEA + .long OpEB + .long OpECX1 + .long OpEDM0 + .long OpEEM0 + .long OpEFM0 + .long OpF0 + .long OpF1M0 + .long OpF2M0 + .long OpF3M0 + .long OpF4 + .long OpF5M0 + .long OpF6M0 + .long OpF7M0 + .long OpF8 + .long OpF9M0 + .long OpFAX1 + .long OpFB + .long OpFC + .long OpFDM0 + .long OpFEM0 + .long OpFFM0 + .align 2 +.global _SA1Registers +_SA1Registers: + .rept (16/4) + .long 0 + .endr + .align 2 +/* +.global _SA1 +_SA1: + .rept (32848/4) + .long 0 + .endr + .align 2 +*/ diff --git a/src/sh/sa1ops.h b/src/sh/sa1ops.h new file mode 100644 index 0000000..40308fb --- /dev/null +++ b/src/sh/sa1ops.h @@ -0,0 +1,955 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro Adc8 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .ADC8Decimal\K + extu.b A,r2 + mov #Carry,r1 + tst r1, FLAGS + bt/s .ADC8nocarry\K + add r0,r2 + add #1,r2 +.ADC8nocarry\K: + mov r2,r3 +.ADC8Binary\K: + xor r0,r3 + xor A,r0 + mov #Carry|Overflow,r1 + not r0,r0 + or r1,FLAGS + and r3,r0 + exts.b r0,r0 + cmp/pz r0 + bf/s .ADC8setovf\K + extu.b A,r3 + add #-Overflow,FLAGS +.ADC8setovf\K: + sub r3,A + extu.b r2,r3 + shlr8 r2 + tst r2,r2 + bf/s .ADC8setcarry\K + add r3,A + add #-Carry,FLAGS +.ADC8setcarry\K: + SetZNjmp A + +.ADC8Decimal\K: + GetCarry + mov #15,r3 + and r3,r2 + and r0,r3 + addc r3,r2 + mov #9,r3 + cmp/gt r3,r2 + bf/s .ADC8less10\K + mov #-16,r3 + add #6,r2 +.ADC8less10\K: + and A,r3 + extu.b r3,r3 + add r3,r2 + mov #-16,r3 + and r0,r3 + add r3,r2 + mov #0x60,r3 + add #0x39,r3 + cmp/gt r3,r2 + bf/s .ADC8Binary\K + mov r2,r3 + add #96,r2 + bra .ADC8Binary\K + mov r2,r3 +.endm + +.macro Adc16 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .ADC16Decimal\K + extu.w A,r2 + mov #Carry,r1 + tst r1, FLAGS + bt/s .ADC16nocarry\K + add r0,r2 + add #1,r2 +.ADC16nocarry\K: + mov r2,r3 +.ADC16Binary\K: + xor r0,r3 + xor A,r0 + mov #Carry|Overflow,r1 + not r0,r0 + or r1,FLAGS + and r3,r0 + exts.w r0,r0 + cmp/pz r0 + bf/s .ADC16setovf\K + extu.w r2,A + add #-Overflow,FLAGS +.ADC16setovf\K: + shlr16 r2 + tst r2,r2 + bf .ADC16setcarry\K + add #-Carry,FLAGS +.ADC16setcarry\K: + Set16ZNjmp A + +.ADC16Decimal\K: + GetCarry + mov #15,r4 + and r4,r2 + mov r0,r3 + and r4,r3 + addc r3,r2 + mov #9,r3 + cmp/gt r3,r2 + bf/s .ADC16less10\K + shll2 r4 + add #6,r2 +.ADC16less10\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov #0x60,r3 + add #0x39,r3 + cmp/gt r3,r2 + bf/s .ADC16less100\K + shll2 r4 + add #96,r2 +.ADC16less100\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov.w .x999\K,r3 + cmp/gt r3,r2 + bf/s .ADC16less1000\K + shll2 r4 + mov.w .n1536\K,r3 + add r3,r2 +.ADC16less1000\K: + shll2 r4 + mov r0,r3 + and r4,r3 + add r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + mov.w .x9999\K,r3 + extu.w r3,r3 + cmp/gt r3,r2 + bf/s .ADC16Binary\K + mov r2,r3 + mov.w .n24576\K,r3 + add r3,r2 + bra .ADC16Binary\K + mov r2,r3 + .align 2 +.x999\K: + .word 0x999 +.x9999\K: + .word 0x9999 +.n1536\K: + .word 1536 +.n24576\K: + .word 24576 + .align 2 +.endm + +.macro Sbc8 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .SBC8Decimal\K + extu.b A,r2 + mov #Carry,r1 + tst r1, FLAGS + bf/s .SBC8carry\K + sub r0,r2 + add #-1,r2 +.SBC8carry\K: + mov r2,r3 +.SBC8Binary\K: + xor A,r0 + xor A,r3 + mov #Carry|Overflow,r1 + and r3,r0 + or r1,FLAGS + exts.b r0,r0 + cmp/pz r0 + bf/s .SBC8setovf\K + extu.b A,r3 + add #-Overflow,FLAGS +.SBC8setovf\K: + sub r3,A + extu.b r2,r3 + cmp/pz r2 + bt/s .SBC8setcarry\K + add r3,A + add #-Carry,FLAGS +.SBC8setcarry\K: + SetZNjmp A + +.SBC8Decimal\K: + GetNotCarry + mov #15,r3 + and r3,r2 + and r0,r3 + subc r3,r2 + cmp/pz r2 + bt/s .SBC8gt01\K + mov #-16,r3 + add #-6,r2 +.SBC8gt01\K: + and A,r3 + extu.b r3,r3 + add r3,r2 + mov #-16,r3 + and r0,r3 + sub r3,r2 + cmp/pz r2 + bt/s .SBC8Binary\K + mov r2,r3 + add #-96,r2 + bra .SBC8Binary\K + mov r2,r3 +.endm + +.macro Sbc16 K + mov #Decimal,r1 + tst r1, FLAGS + bf/s .SBC16Decimal\K + extu.w A,r2 + mov #Carry,r1 + tst r1, FLAGS + bf/s .SBC16carry\K + sub r0,r2 + add #-1,r2 +.SBC16carry\K: + mov r2,r3 +.SBC16Binary\K: + xor A,r0 + xor A,r3 + mov #Carry|Overflow,r1 + and r3,r0 + or r1,FLAGS + exts.w r0,r0 + cmp/pz r0 + bf/s .SBC16setovf\K + extu.w r2,A + add #-Overflow,FLAGS +.SBC16setovf\K: + cmp/pz r2 + bt .SBC16setcarry\K + add #-Carry,FLAGS +.SBC16setcarry\K: + Set16ZNjmp A + +.SBC16Decimal\K: + GetNotCarry + mov #15,r4 + and r4,r2 + mov r0,r3 + and r4,r3 + subc r3,r2 + cmp/pz r2 + bt/s .SBC16gt01\K + shll2 r4 + add #-6,r2 +.SBC16gt01\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16gt02\K + shll2 r4 + add #-96,r2 +.SBC16gt02\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16gt03\K + shll2 r4 + mov.w .n1536\K,r3 + sub r3,r2 +.SBC16gt03\K: + shll2 r4 + mov r0,r3 + and r4,r3 + sub r3,r2 + mov A,r3 + and r4,r3 + add r3,r2 + cmp/pz r2 + bt/s .SBC16Binary\K + mov r2,r3 + mov.w .n24576\K,r3 + extu.w r3,r3 + sub r3,r2 + bra .SBC16Binary\K + mov r2,r3 + .align 2 +.n1536\K: + .word 1536 +.n24576\K: + .word 24576 + .align 2 +.endm + +.macro Ora8 K + or r0,A + SetZNjmp A +.endm + +.macro Ora16 K + or r0,A + Set16ZNjmp A +.endm + +.macro Eor8 K + xor r0,A + SetZNjmp A +.endm + +.macro Eor16 K + xor r0,A + Set16ZNjmp A +.endm + +.macro And8 K + mov #-128,r2 + shll r2 + or r2,r0 + and r0,A + SetZNjmp A +.endm + +.macro And16 K + and r0,A + Set16ZNjmp A +.endm + +.macro Lda8 K + extu.b A,r2 + sub r2,A + add r0,A + SetZNjmp A +.endm + +.macro Lda16 K + mov r0,A + Set16ZNjmp A +.endm + +.macro Ldx8 K + mov.b r0,XL + SetZNjmp r0 +.endm + +.macro Ldx16 K + mov.w r0,XX + Set16ZNjmp r0 +.endm + +.macro Ldy8 K + mov.b r0,YL + SetZNjmp r0 +.endm + +.macro Ldy16 K + mov.w r0,YY + Set16ZNjmp r0 +.endm + +.macro Cmp8 K + extu.b A,r2 + sub r0,r2 + mov #Carry,r1 + cmp/pz r2 + bt/s .Cmp8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Cmp8Carry\K: + SetZNjmp r2 +.endm + +.macro Cmp16 K + extu.w A,r2 + sub r0,r2 + mov #Carry,r1 + cmp/pz r2 + bt/s .Cmp16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Cmp16Carry\K: + Set16ZNjmp r2 +.endm + +.macro Cpx8 K + mov r0,r1 + mov.b XL,r0 + extu.b r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpx8Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpx8Carry\K: + SetZNjmp r0 +.endm + +.macro Cpx16 K + mov r0,r1 + mov.w XX,r0 + extu.w r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpx16Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpx16Carry\K: + Set16ZNjmp r0 +.endm + +.macro Cpy8 K + mov r0,r1 + mov.b YL,r0 + extu.b r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpy8Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpy8Carry\K: + SetZNjmp r0 +.endm + +.macro Cpy16 K + mov r0,r1 + mov.w YY,r0 + extu.w r0,r0 + sub r1,r0 + mov #Carry,r2 + cmp/pz r0 + bt/s .Cpy16Carry\K + or r2,FLAGS + add #-Carry,FLAGS +.Cpy16Carry\K: + Set16ZNjmp r0 +.endm + +.macro Asl8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + mov #-128,r2 + mov #Carry,r1 + tst r2,r0 + bf/s .Asl8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Asl8Carry\K: + shll r0 + mov.l S9xSA1SetByte,r3 + SetZNlink r0 +.endm + +.macro Asl16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + mov #1,r2 + shll r0 + shll16 r2 + mov #Carry,r1 + tst r2,r0 + bf/s .Asl16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Asl16Carry\K: + mov.l S9xSA1SetWord,r3 + Set16ZNlink r0 +.endm + +.macro Lsr8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + tst #1,r0 + mov #Carry,r1 + bf/s .Lsr8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Lsr8Carry\K: + shlr r0 + mov.l S9xSA1SetByte,r3 + SetZNlink r0 +.endm + +.macro Lsr16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + tst #1,r0 + mov #Carry,r1 + bf/s .Lsr16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Lsr16Carry\K: + shlr r0 + mov.l S9xSA1SetWord,r3 + Set16ZNlink r0 +.endm + +.macro Rol8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + GetCarry + mov #1,r2 + rotcl r0 + or r2,FLAGS + shll8 r2 + tst r2,r0 + bf/s .Rol8Carry\K + mov.l S9xSA1SetByte,r3 + add #-Carry,FLAGS +.Rol8Carry\K: + SetZNlink r0 +.endm + +.macro Rol16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + GetCarry + mov #1,r2 + rotcl r0 + or r2,FLAGS + shll16 r2 + tst r2,r0 + bf/s .Rol16Carry\K + mov.l S9xSA1SetWord,r3 + add #-Carry,FLAGS +.Rol16Carry\K: + Set16ZNlink r0 +.endm + +.macro Ror8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + mov #1,r1 + and FLAGS,r1 + shll8 r1 + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror8Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Ror8Carry\K: + mov.l S9xSA1SetByte,r3 + SetZNlink r0 +.endm + +.macro Ror16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + mov #1,r1 + and FLAGS,r1 + shll16 r1 + or r1,r0 + shlr r0 + mov #Carry,r1 + bt/s .Ror16Carry\K + or r1,FLAGS + add #-Carry,FLAGS +.Ror16Carry\K: + mov.l S9xSA1SetWord,r3 + Set16ZNlink r0 +.endm + +.macro Bit8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + exts.b r0,r7 + mov #0x40,r2 + shll16 r7 + tst r2,r0 + bf/s .Bit8Ovf\K + or r2,FLAGS + sub r2,FLAGS +.Bit8Ovf\K: + and A,r0 + jmp @r13 + or r0,r7 +.endm + +.macro Bit16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + mov #0x40,r2 + exts.w r0,r7 + shll8 r2 + sub r0,r7 + tst r2,r0 + shlr8 r2 + bf/s .Bit16Ovf\K + or r2,FLAGS + sub r2,FLAGS +.Bit16Ovf\K: + and A,r0 + jmp @r13 + or r0,r7 +.endm + +.macro Dec8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + add #-1,r0 + mov.l S9xSA1SetByte,r3 + SetZNlink r0 +.endm + +.macro Dec16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + add #-1,r0 + mov.l S9xSA1SetWord,r3 + Set16ZNlink r0 +.endm + +.macro Inc8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + add #1,r0 + mov.l S9xSA1SetByte,r3 + SetZNlink r0 +.endm + +.macro Inc16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + add #1,r0 + mov.l S9xSA1SetWord,r3 + Set16ZNlink r0 +.endm + +.macro Sta8 K + mov.l S9xSA1SetByte,r3 + mov A,r0 + Xlink +.endm + +.macro Sta16 K + mov.l S9xSA1SetWord,r3 + mov A,r0 + Xlink +.endm + +.macro Stx8 K + mov.l S9xSA1SetByte,r3 + mov.b XL,r0 + Xlink +.endm + +.macro Stx16 K + mov.l S9xSA1SetWord,r3 + mov.w XX,r0 + Xlink +.endm + +.macro Sty8 K + mov.l S9xSA1SetByte,r3 + mov.b YL,r0 + Xlink +.endm + +.macro Sty16 K + mov.l S9xSA1SetWord,r3 + mov.w YY,r0 + Xlink +.endm + +.macro Stz8 K + mov.l S9xSA1SetByte,r3 + mov #0,r0 + Xlink +.endm + +.macro Stz16 K + mov.l S9xSA1SetWord,r3 + mov #0,r0 + Xlink +.endm + +.macro Trb8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + extu.w r7,r2 + sub r2,r7 + extu.b A,r2 + and r0,r2 + or r2,r7 + sub r2,r0 + mov.l S9xSA1SetByte,r3 + Xlink +.endm + +.macro Trb16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + extu.w r7,r2 + sub r2,r7 + extu.w A,r2 + and r0,r2 + or r2,r7 + sub r2,r0 + mov.l S9xSA1SetWord,r3 + Xlink +.endm + +.macro Tsb8 K + mov.l S9xSA1GetByte,r3 + jsr @r3 + nop + extu.w r7,r2 + sub r2,r7 + extu.b A,r2 + and r0,r2 + or r2,r7 + or A,r0 + mov.l S9xSA1SetByte,r3 + Xlink +.endm + +.macro Tsb16 K + mov.l S9xSA1GetWord,r3 + jsr @r3 + nop + extu.w r7,r2 + sub r2,r7 + extu.w A,r2 + and r0,r2 + or r2,r7 + or A,r0 + mov.l S9xSA1SetWord,r3 + Xlink +.endm + +.macro CheckForIrqjmp K + mov #IRQ,r0 + tst r0,FLAGS + bf .CheckForIrqS9xExit\K + mov.l SA1,r1 + mov.b SA1IRQActive,r0 + tst r0,r0 + bt .CheckForIrqS9xExit\K + mov.l S9xSA1Opcode_IRQ,r3 + Xlink +.CheckForIrqS9xExit\K: + jmp @r13 + nop +.endm + +.macro S9xSA1FixCycles K + mov FLAGS16,r0 + mov #Emulation/4,r1 + shll2 r1 + tst r1,r0 + bt .S9xFixCyclesNoEmulation\K + mov.l .S9xSA1OpcodesM1X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,SA1Opcodes + +.S9xFixCyclesNoEmulation\K: + tst #MemoryFlag,r0 + bt .S9xFixCyclesNoMemory\K + tst #IndexFlag,r0 + bt .S9xFixCyclesNoIndex\K + mov.l .S9xSA1OpcodesM1X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,SA1Opcodes + +.S9xFixCyclesNoIndex\K: + mov.l .S9xSA1OpcodesM1X0\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,SA1Opcodes + +.S9xFixCyclesNoMemory\K: + tst #IndexFlag,r0 + bt .S9xFixCyclesNoIndex2\K + mov.l .S9xSA1OpcodesM0X1\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,SA1Opcodes +.S9xFixCyclesNoIndex2\K: + mov.l .S9xSA1OpcodesM0X0\K,r0 + bra .S9xFixCyclesS9xExit\K + mov.l r0,SA1Opcodes + + + .align 2 +.S9xSA1OpcodesM0X0\K: + .long _S9xSA1OpcodesM0X0 +.S9xSA1OpcodesM0X1\K: + .long _S9xSA1OpcodesM0X1 +.S9xSA1OpcodesM1X0\K: + .long _S9xSA1OpcodesM1X0 +.S9xSA1OpcodesM1X1\K: + .long _S9xSA1OpcodesM1X1 + .align 2 + +.S9xFixCyclesS9xExit\K: +.endm + +.macro S9xSA1UnpackStatus K + exts.b FLAGS,r7 + mov #Zero,r0 + shll16 r7 + tst r0,FLAGS + rotcl r7 +.endm + +.macro S9xSA1PackStatus K + cmp/pz r7 + mov #(Negative|Zero)/2,r2 + add r2,r2 + bf/s .PackStatusNeg\K + or r2,FLAGS + add #-Negative,FLAGS +.PackStatusNeg\K: + extu.w r7,r2 + tst r2,r2 + bt .PackStatusZero\K + add #-Zero,FLAGS +.PackStatusZero\K: +.endm + +.macro CPUShutdown K +// cmpb $0, Shutdown +// jz .NoShutdown\K + cmpl PC, SA1WaitAddress + jnz .NoShutdown\K + cmpl $1, SA1WaitCounter + jl .NotYet\K + movb $0, SA1Executing + jp .NoShutdown\K +.NotYet\K: + incl SA1WaitCounter +.NoShutdown\K: +.endm diff --git a/src/sh/sa1struc.h b/src/sh/sa1struc.h new file mode 100644 index 0000000..8356a6a --- /dev/null +++ b/src/sh/sa1struc.h @@ -0,0 +1,325 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#if defined(__DJGCC) || defined(MICROSOFT_C) || defined(_WINDOWS) +#define S9xTraceMessage _S9xTraceMessage +#define S9xGetPPU _S9xGetPPU +#define S9xSetPPU _S9xSetPPU +#define S9xSetDSP _S9xSetDSP +#define S9xGetDSP _S9xGetDSP +#define S9xGetCPU _S9xGetCPU +#define S9xSetCPU _S9xSetCPU +#define S9xSyncSpeed _S9xSyncSpeed +#define S9xTrace _S9xTrace +#define S9xDoHBlankProcessing _S9xDoHBlankProcessing +#define S9xTraceAPU _S9xTraceAPU +#define S9xGetWord _S9xGetWord +#define memset _memset +#define S9xDoHDMA _S9xDoHDMA +#define S9xStartHDMA _S9xStartHDMA +#define S9xEndScreenRefresh _S9xEndScreenRefresh +#define S9xStartScreenRefresh _S9xStartScreenRefresh +#define S9xSetAPUControl _S9xSetAPUControl +#define S9xSetAPUDSP _S9xSetAPUDSP +#define S9xGetAPUDSP _S9xGetAPUDSP +#define S9xTextMode _S9xTextMode +#define printf _printf +#define S9xSetAPUTimer _S9xSetAPUTimer +#define S9xAPUOPrint _S9xAPUOPrint +#define S9xSuperFXExec _S9xSuperFXExec +#define S9xGenerateSound _S9xGenerateSound +#define S9xUpdateJoypads _S9xUpdateJoypads +#define S9xMainLoop _S9xMainLoop +#define RenderLine _RenderLine +#define S9xSetIRQ _S9xSetIRQ +#define S9xClearIRQ _S9xClearIRQ +#define SA1 _SA1 +#define CPU _CPU +#define ICPU _ICPU +#define Settings _Settings +#define PPU _PPU +#define IPPU _IPPU +#define SA1Registers _SA1Registers +#define Memory _Memory +#define APU _APU +#define IAPU _IAPU +#define APURegisters _APURegisters +#define S9xBreakpoint _S9xBreakpoint +#define missing _missing +#define S9xApuOpcodes _S9xApuOpcodes +#define S9xAPUCycles _S9xAPUCycles +#define S9xMessage _S9xMessage +#define String _String +#define sprintf _sprintf +#define S9xSA1ExecuteDuringSleep _S9xSA1ExecuteDuringSleep +#define S9xGetSA1 _S9xGetSA1 +#define S9xSetSA1 _S9xSetSA1 +#define S9xSA1Trace _S9xSA1Trace +#define S9xSA1OpcodesM1X1 _S9xSA1OpcodesM1X1 +#define S9xSA1OpcodesM1X1 _S9xSA1OpcodesM1X1 +#define S9xSA1OpcodesM1X0 _S9xSA1OpcodesM1X0 +#define S9xSA1OpcodesM0X1 _S9xSA1OpcodesM0X1 +#define S9xSA1OpcodesM0X0 _S9xSA1OpcodesM0X0 + +#define A1 _A1 +#define A2 _A2 +#define A3 _A3 +#define A4 _A4 +#define Work8 _Work8 +#define Work16 _Work16 +#define Work32 _Work32 +#define Int8 _Int8 +#define Int16 _Int16 +#define Int32 _Int32 +#define S9xE1M1X1 _S9xE1M1X1 +#define S9xE0M1X1 _S9xE0M1X1 +#define S9xE0M1X0 _S9xE0M1X0 +#define S9xE0M0X1 _S9xE0M0X1 +#define S9xE0M0X0 _S9xE0M0X0 +#define S9xOpcodesM1X1 _S9xOpcodesM1X1 +#define S9xOpcodesM1X0 _S9xOpcodesM1X0 +#define S9xOpcodesM0X1 _S9xOpcodesM0X1 +#define S9xOpcodesM0X0 _S9xOpcodesM0X0 +#define APUROM _APUROM +#define W1 _W1 +#define W2 _W2 +#define W3 _W3 +#define W4 _W4 +#endif + +#define SA1REG r12 +#include "offsets.h" + +#define Carry 1 +#define Zero 2 +#define IRQ 4 +#define Decimal 8 +#define IndexFlag 16 +#define MemoryFlag 32 +#define Overflow 64 +#define Negative 128 +#define Emulation 256 + +#define DEBUG_MODE_FLAG (1 << 0) +#define TRACE_FLAG (1 << 1) +#define SINGLE_STEP_FLAG (1 << 2) +#define BREAK_FLAG (1 << 3) +#define SCAN_KEYS_FLAG (1 << 4) +#define SAVE_SNAPSHOT_FLAG (1 << 5) +#define DELAYED_NMI_FLAG (1 << 6) +#define NMI_FLAG (1 << 7) +#define PROCESS_SOUND_FLAG (1 << 8) +#define FRAME_ADVANCE_FLAG (1 << 9) +#define DELAYED_NMI_FLAG2 (1 << 10) +#define IRQ_PENDING_FLAG (1 << 11) + +#define MEMMAP_BLOCK_SIZE (0x1000) +#define MEMMAP_NUM_BLOCKS (0x1000000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_BLOCKS_PER_BANK (0x10000 / MEMMAP_BLOCK_SIZE) +#define MEMMAP_SHIFT 12 +#define MEMMAP_MASK (MEMMAP_BLOCK_SIZE - 1) + +#define CYCLES NO_CYCLES +#define PC r9 +#ifdef SPC700_C +#define APUPC APUPCS +#else +#ifdef USE_ASM_R12 +#error No register allocated for APUPC +#else +#define APUPC r12 +#endif +#endif + +#define FLAGS r10 +#define FLAGS16 r10 + +#define A r8 + +#define SA1LOAD_CYCLES +#define SA1SAVE_CYCLES + +#define S9xSA1GetByte S9xGetByte +#define S9xSA1GetWord S9xGetWord +#define S9xSA1SetByte S9xSetByte +#define S9xSA1SetWord S9xSetWord +#define S9xSA1Opcode_IRQ S9xOpcode_IRQ +#define S9xSA1Opcode_NMI S9xOpcode_NMI + + +.macro SETUP_PREDEF + mova .misc,r0 + mov.l @r0+,r11 + mov.l @r0+,r12 + mov.l @r0+,r13 + mov r0,r14 +.endm + +.macro MISC + .align 2 +.misc: + .long _SA1Registers + .long _SA1 + .long S9xSA1MainAsmLoop + + .long 0 + .long S9xSA1GetByte_r + .long S9xSA1SetByte_r + .long S9xSA1GetWord_r + .long S9xSA1SetWord_r + .long S9xSA1Opcode_IRQ_r + .long S9xSA1Opcode_NMI_r + .long S9xSA1SetPCBase_r + .long _ICPU +#ifdef ARMAPU + .long 0 + .long 0 +#else + .long _IAPU + .long _APU +#endif + .long _SA1 +#ifdef ARMAPU + .long 0 +#else + .long _APURegisters +#endif + .long _Settings + .long _IPPU + .long _PPU + .align 2 +.endm + +.macro LOAD_REGISTERS + // mov.l SA1,r1 + SA1LOAD_CYCLES + mov.l SA1PCS, PC +#ifndef SPC700_C + mov.l IAPU,r1 + mov.l APUPCS, APUPC +#endif + mov.w PP,r0 + mov r0, FLAGS16 + mov.w AA,r0 + extu.w r0, A + S9xSA1UnpackStatus LOADREG +.endm + +.macro STORE_REGISTERS_i + // mov.l SA1,r1 + S9xSA1PackStatus SAVEREG + SA1SAVE_CYCLES + mov.l PC, SA1PCS +#ifndef SPC700_C + mov.l IAPU,r1 + mov.l APUPC, APUPCS +#endif + mov FLAGS16,r0 + mov.w r0, PP + mov A,r0 +.endm + +.macro STORE_REGISTERS_f + mov.w r0, AA +.endm + +.macro STORE_REGISTERS + STORE_REGISTERS_i + STORE_REGISTERS_f +.endm + +.macro PUSH_REGISTERS + // mov.l r6,@-r15 + mov.l r7,@-r15 +.endm + +.macro POP_REGISTERS + mov.l @r15+,r7 + // mov.l @r15+,r6 +.endm + diff --git a/src/sh/spcops.h b/src/sh/spcops.h new file mode 100644 index 0000000..82132e3 --- /dev/null +++ b/src/sh/spcops.h @@ -0,0 +1,118 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +.macro APUS9xPackStatus K + mov.l APURegisters,r1 + mov.b ApuP, r0 + mov #~(Zero | Carry | Overflow),r2 + add #-Negative,r2 + mov.l IAPU,r1 + and r0, r2 + mov.b APU_Carry, r0 + or r0,r2 + mov.b APU_Zero, r0 + mov #0x80,r3 + and r3, r0 + or r0,r2 + mov.b APU_Overflow, r0 + shll2 r0 + shll2 r0 + shll2 r0 + or r0,r2 + mov.b APU_Zero, r0 + tst r0,r0 + mov #0,r0 + addc r0,r0 + mov.l APURegisters,r1 + shll r0 + or r0,r2 + mov.b r2, ApuP +.endm + +.macro APUS9xUnpackStatus K +.endm diff --git a/src/snaporig.cpp b/src/snaporig.cpp new file mode 100644 index 0000000..9dbb0b6 --- /dev/null +++ b/src/snaporig.cpp @@ -0,0 +1,470 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include +#include + +#if defined(__unix) || defined(__linux) || defined(__sun) || defined(__DJGPP) +#include +#include +#include +#endif + +#include "snapshot.h" +#include "snaporig.h" +#include "memmap.h" +#include "snes9x.h" +#include "65c816.h" +#include "ppu.h" +#include "cpuexec.h" +#include "display.h" +#include "apu.h" +#include "soundux.h" + +struct SOrigPPU OrigPPU; +struct SOrigDMA OrigDMA [8]; +struct SOrigRegisters OrigRegisters; +struct SOrigCPUState OrigCPU; +struct SOrigAPU OrigAPU; +SOrigSoundData OrigSoundData; +struct SOrigAPURegisters OrigAPURegisters; +char ROMFilename [1025]; + +static int ReadOrigSnapshot (STREAM); + +bool8 S9xLoadOrigSnapshot (const char *filename) +{ + STREAM snapshot = NULL; + if (S9xOpenSnapshotFile (filename, TRUE, &snapshot)) + { + int result; + if ((result = ReadOrigSnapshot (snapshot)) != SUCCESS) + { + S9xCloseSnapshotFile (snapshot); + return (FALSE); + } + S9xCloseSnapshotFile (snapshot); + return (TRUE); + } + return (FALSE); +} + +static int ReadBlock (const char *key, void *block, int max_len, STREAM snap) +{ + char buffer [20]; + int len = 0; + int rem = 0; + + if (READ_STREAM (buffer, 11, snap) != 11 || + strncmp (buffer, key, 4) != 0 || + (len = atoi (&buffer [4])) == 0) + return (WRONG_FORMAT); + + if (len > max_len) + { + rem = len - max_len; + len = max_len; + } + if (READ_STREAM (block, len, snap) != len) + return (WRONG_FORMAT); + + if (rem) + { + char *junk = (char *)malloc(rem); //new char [rem]; + READ_STREAM (junk, rem, snap); + free(junk); //delete[] junk; + } + + return (SUCCESS); +} + +void MemSpeedx2_hack_load(void); + +static int ReadOrigSnapshot (STREAM snap) +{ + char buffer [_MAX_PATH]; + char rom_filename [_MAX_PATH]; + int result; + int i; + int j; + + int version; + int len = strlen (ORIG_SNAPSHOT_MAGIC) + 1 + 4 + 1; + if (READ_STREAM (buffer, len, snap) != len) + return (WRONG_FORMAT); + if (strncmp (buffer, ORIG_SNAPSHOT_MAGIC, strlen (ORIG_SNAPSHOT_MAGIC)) != 0) + return (WRONG_FORMAT); + if ((version = atoi (&buffer [strlen (SNAPSHOT_MAGIC) + 1])) > ORIG_SNAPSHOT_VERSION) + return (WRONG_VERSION); + + if ((result = ReadBlock ("NAM:", rom_filename, _MAX_PATH, snap)) != SUCCESS) + return (result); + + if ((result = ReadBlock ("HiR:", buffer, 0x41, snap)) != SUCCESS) + return (result); + + if (strcasecmp (rom_filename, CMemory_ROMFilename) != 0 && + strcasecmp (S9xBasename (rom_filename), S9xBasename (CMemory_ROMFilename)) != 0) + { + S9xMessage (S9X_WARNING, S9X_FREEZE_ROM_NAME, + "Current loaded ROM image doesn't match that required by freeze-game file."); + } + + S9xReset (); + S9xSetSoundMute (TRUE); + if ((result = ReadBlock ("CPU:", &OrigCPU, sizeof (OrigCPU), snap)) != SUCCESS) + return (result); + OrigCPU.FastROMSpeed = OrigCPU.FastROMSpeed_old; + CMemory_FixROMSpeed (); + if (version == 3) + { + OrigCPU.Cycles = OrigCPU.Cycles_old; + OrigCPU.NextEvent = OrigCPU.NextEvent_old; + OrigCPU.V_Counter = OrigCPU.V_Counter_old; + OrigCPU.MemSpeed = OrigCPU.MemSpeed_old; + OrigCPU.MemSpeedx2 = OrigCPU.MemSpeedx2_old; + OrigCPU.FastROMSpeed = OrigCPU.FastROMSpeed_old; + } + CPU.Flags = OrigCPU.Flags; + CPU.BranchSkip = OrigCPU.BranchSkip; + CPU.NMIActive = OrigCPU.NMIActive; + CPU.IRQActive = OrigCPU.IRQActive; + CPU.WaitingForInterrupt = OrigCPU.WaitingForInterrupt; + CPU.WhichEvent = OrigCPU.WhichEvent; + CPU.Cycles = OrigCPU.Cycles; + CPU.NextEvent = OrigCPU.NextEvent; + CPU.V_Counter = OrigCPU.V_Counter; + CPU.MemSpeed = OrigCPU.MemSpeed; + CPU.MemSpeedx2 = OrigCPU.MemSpeedx2; + MemSpeedx2_hack_load(); + CPU.FastROMSpeed = OrigCPU.FastROMSpeed; + + if ((result = ReadBlock ("REG:", &OrigRegisters, sizeof (OrigRegisters), snap)) != SUCCESS) + return (result); + + Registers = *(struct SRegisters *) &OrigRegisters; + + if ((result = ReadBlock ("PPU:", &OrigPPU, sizeof (OrigPPU), snap)) != SUCCESS) + return (result); + + if (version == 2) + { + OrigPPU.OBJNameSelect = OrigPPU.OBJNameSelect_old << 13; + OrigPPU.OBJNameBase <<= 1; + OrigPPU.OBJNameSelect <<= 13; + } + PPU.BGMode = OrigPPU.BGMode; + PPU.BG3Priority = OrigPPU.BG3Priority; + PPU.Brightness = OrigPPU.Brightness; + + PPU.VMA.High = OrigPPU.VMA.High; + PPU.VMA.Increment = OrigPPU.VMA.Increment; + PPU.VMA.Address = OrigPPU.VMA.Address; + PPU.VMA.Mask1 = OrigPPU.VMA.Mask1; + PPU.VMA.FullGraphicCount = OrigPPU.VMA.FullGraphicCount; + PPU.VMA.Shift = OrigPPU.VMA.Shift; + + for (i = 0; i < 4; i++) + { + PPU.BG[i].SCBase = OrigPPU.BG[i].SCBase; + PPU.BG[i].VOffset = OrigPPU.BG[i].VOffset; + PPU.BG[i].HOffset = OrigPPU.BG[i].HOffset; + PPU.BG[i].BGSize = OrigPPU.BG[i].BGSize; + PPU.BG[i].NameBase = OrigPPU.BG[i].NameBase; + PPU.BG[i].SCSize = OrigPPU.BG[i].SCSize; + } + + PPU.CGFLIP = OrigPPU.CGFLIP; + for (i = 0; i < 256; i++) + PPU.CGDATA [i] = OrigPPU.CGDATA [i]; + PPU.FirstSprite = OrigPPU.FirstSprite; + for (i = 0; i < 128; i++) + { + PPU.OBJ[i].HPos = OrigPPU.OBJ [i].HPos; + PPU.OBJ[i].VPos = OrigPPU.OBJ [i].VPos; + PPU.OBJ[i].Name = OrigPPU.OBJ [i].Name; + PPU.OBJ[i].VFlip = OrigPPU.OBJ [i].VFlip; + PPU.OBJ[i].HFlip = OrigPPU.OBJ [i].HFlip; + PPU.OBJ[i].Priority = OrigPPU.OBJ [i].Priority; + PPU.OBJ[i].Palette = OrigPPU.OBJ [i].Palette; + PPU.OBJ[i].Size = OrigPPU.OBJ [i].Size; + } + PPU.OAMPriorityRotation = OrigPPU.OAMPriorityRotation; + PPU.OAMAddr = OrigPPU.OAMAddr; + + PPU.OAMFlip = OrigPPU.OAMFlip; + PPU.OAMTileAddress = OrigPPU.OAMTileAddress; + PPU.IRQVBeamPos = OrigPPU.IRQVBeamPos; + PPU.IRQHBeamPos = OrigPPU.IRQHBeamPos; + PPU.VBeamPosLatched = OrigPPU.VBeamPosLatched; + PPU.HBeamPosLatched = OrigPPU.HBeamPosLatched; + + PPU.HBeamFlip = OrigPPU.HBeamFlip; + PPU.VBeamFlip = OrigPPU.VBeamFlip; + PPU.HVBeamCounterLatched = OrigPPU.HVBeamCounterLatched; + + PPU.MatrixA = OrigPPU.MatrixA; + PPU.MatrixB = OrigPPU.MatrixB; + PPU.MatrixC = OrigPPU.MatrixC; + PPU.MatrixD = OrigPPU.MatrixD; + PPU.CentreX = OrigPPU.CentreX; + PPU.CentreY = OrigPPU.CentreY; + PPU.Joypad1ButtonReadPos = OrigPPU.Joypad1ButtonReadPos; + PPU.Joypad2ButtonReadPos = OrigPPU.Joypad2ButtonReadPos; + PPU.Joypad3ButtonReadPos = OrigPPU.Joypad3ButtonReadPos; + + PPU.CGADD = OrigPPU.CGADD; + PPU.FixedColourRed = OrigPPU.FixedColourRed; + PPU.FixedColourGreen = OrigPPU.FixedColourGreen; + PPU.FixedColourBlue = OrigPPU.FixedColourBlue; + PPU.SavedOAMAddr = OrigPPU.SavedOAMAddr; + PPU.ScreenHeight = OrigPPU.ScreenHeight; + PPU.WRAM = OrigPPU.WRAM; + PPU.ForcedBlanking = OrigPPU.ForcedBlanking; + PPU.OBJNameSelect = OrigPPU.OBJNameSelect; + PPU.OBJSizeSelect = OrigPPU.OBJSizeSelect; + PPU.OBJNameBase = OrigPPU.OBJNameBase; + PPU.OAMReadFlip = OrigPPU.OAMReadFlip; + memmove (PPU.OAMData, OrigPPU.OAMData, sizeof (PPU.OAMData)); + PPU.VTimerEnabled = OrigPPU.VTimerEnabled; + PPU.HTimerEnabled = OrigPPU.HTimerEnabled; + PPU.HTimerPosition = OrigPPU.HTimerPosition; + PPU.Mosaic = OrigPPU.Mosaic; + memmove (PPU.BGMosaic, OrigPPU.BGMosaic, sizeof (PPU.BGMosaic)); + PPU.Mode7HFlip = OrigPPU.Mode7HFlip; + PPU.Mode7VFlip = OrigPPU.Mode7VFlip; + PPU.Mode7Repeat = OrigPPU.Mode7Repeat; + PPU.Window1Left = OrigPPU.Window1Left; + PPU.Window1Right = OrigPPU.Window1Right; + PPU.Window2Left = OrigPPU.Window2Left; + PPU.Window2Right = OrigPPU.Window2Right; + for (i = 0; i < 6; i++) + { + PPU.ClipWindowOverlapLogic [i] = OrigPPU.ClipWindowOverlapLogic [i]; + PPU.ClipWindow1Enable [i] = OrigPPU.ClipWindow1Enable [i]; + PPU.ClipWindow2Enable [i] = OrigPPU.ClipWindow2Enable [i]; + PPU.ClipWindow1Inside [i] = OrigPPU.ClipWindow1Inside [i]; + PPU.ClipWindow2Inside [i] = OrigPPU.ClipWindow2Inside [i]; + } + PPU.CGFLIPRead = OrigPPU.CGFLIPRead; + PPU.Need16x8Mulitply = OrigPPU.Need16x8Mulitply; + + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + S9xFixColourBrightness (); + IPPU.RenderThisFrame = FALSE; + + if ((result = ReadBlock ("DMA:", OrigDMA, sizeof (OrigDMA), snap)) != SUCCESS) + return (result); + + for (i = 0; i < 8; i++) + { + DMA[i].TransferDirection = OrigDMA[i].TransferDirection; + DMA[i].AAddressFixed = OrigDMA[i].AAddressFixed; + DMA[i].AAddressDecrement = OrigDMA[i].AAddressDecrement; + DMA[i].TransferMode = OrigDMA[i].TransferMode; + DMA[i].ABank = OrigDMA[i].ABank; + DMA[i].AAddress = OrigDMA[i].AAddress; + DMA[i].Address = OrigDMA[i].Address; + DMA[i].BAddress = OrigDMA[i].BAddress; + DMA[i].TransferBytes = OrigDMA[i].TransferBytes; + DMA[i].HDMAIndirectAddressing = OrigDMA[i].HDMAIndirectAddressing; + DMA[i].IndirectAddress = OrigDMA[i].IndirectAddress; + DMA[i].IndirectBank = OrigDMA[i].IndirectBank; + DMA[i].Repeat = OrigDMA[i].Repeat; + DMA[i].LineCount = OrigDMA[i].LineCount; + DMA[i].FirstLine = OrigDMA[i].FirstLine; + } + + if ((result = ReadBlock ("VRA:", CMemory_VRAM, 0x10000, snap)) != SUCCESS) + return (result); + if ((result = ReadBlock ("RAM:", CMemory_RAM, 0x20000, snap)) != SUCCESS) + return (result); + if ((result = ReadBlock ("SRA:", CMemory_SRAM, 0x10000, snap)) != SUCCESS) + return (result); + if ((result = ReadBlock ("FIL:", CMemory_FillRAM, 0x8000, snap)) != SUCCESS) + return (result); + if (ReadBlock ("APU:", &OrigAPU, sizeof (OrigAPU), snap) == SUCCESS) + { + APU = *(struct SAPU *) &OrigAPU; + + if ((result = ReadBlock ("ARE:", &OrigAPURegisters, + sizeof (OrigAPURegisters), snap)) != SUCCESS) + return (result); + APURegisters = *(struct SAPURegisters *) &OrigAPURegisters; + if ((result = ReadBlock ("ARA:", IAPU.RAM, 0x10000, snap)) != SUCCESS) + return (result); + if ((result = ReadBlock ("SOU:", &OrigSoundData, + sizeof (SOrigSoundData), snap)) != SUCCESS) + return (result); + +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume_left = OrigSoundData.master_volume_left; + SoundData.master_volume_right = OrigSoundData.master_volume_right; +#endif +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_volume_left = OrigSoundData.echo_volume_left; + SoundData.echo_volume_right = OrigSoundData.echo_volume_right; + SoundData.echo_enable = OrigSoundData.echo_enable; + SoundData.echo_feedback = OrigSoundData.echo_feedback; + SoundData.echo_ptr = OrigSoundData.echo_ptr; + SoundData.echo_buffer_size = OrigSoundData.echo_buffer_size; + SoundData.echo_write_enabled = OrigSoundData.echo_write_enabled; + SoundData.echo_channel_enable = OrigSoundData.echo_channel_enable; +#endif + SoundData.pitch_mod = OrigSoundData.pitch_mod; + + for (i = 0; i < 3; i++) + SoundData.dummy [i] = OrigSoundData.dummy [i]; + for (i = 0; i < NUM_CHANNELS; i++) + { + SoundData.channels [i].state = OrigSoundData.channels [i].state; + SoundData.channels [i].type = OrigSoundData.channels [i].type; + SoundData.channels [i].volume_left = OrigSoundData.channels [i].volume_left; + SoundData.channels [i].volume_right = OrigSoundData.channels [i].volume_right; + SoundData.channels [i].hertz = OrigSoundData.channels [i].frequency; + SoundData.channels [i].count = OrigSoundData.channels [i].count; + SoundData.channels [i].loop = OrigSoundData.channels [i].loop; + SoundData.channels [i].envx = OrigSoundData.channels [i].envx; + SoundData.channels [i].left_vol_level = OrigSoundData.channels [i].left_vol_level; + SoundData.channels [i].right_vol_level = OrigSoundData.channels [i].right_vol_level; + SoundData.channels [i].envx_target = OrigSoundData.channels [i].envx_target; + SoundData.channels [i].env_error = OrigSoundData.channels [i].env_error; + SoundData.channels [i].erate = OrigSoundData.channels [i].erate; + SoundData.channels [i].direction = OrigSoundData.channels [i].direction; + SoundData.channels [i].attack_rate = OrigSoundData.channels [i].attack_rate; + SoundData.channels [i].decay_rate = OrigSoundData.channels [i].decay_rate; + SoundData.channels [i].sustain_rate = OrigSoundData.channels [i].sustain_rate; + SoundData.channels [i].release_rate = OrigSoundData.channels [i].release_rate; + SoundData.channels [i].sustain_level = OrigSoundData.channels [i].sustain_level; + SoundData.channels [i].sample = OrigSoundData.channels [i].sample; + for (j = 0; j < 16; j++) + SoundData.channels [i].decoded [j] = OrigSoundData.channels [i].decoded [j]; + + for (j = 0; j < 2; j++) + SoundData.channels [i].previous [j] = OrigSoundData.channels [i].previous [j]; + + SoundData.channels [i].sample_number = OrigSoundData.channels [i].sample_number; + SoundData.channels [i].last_block = OrigSoundData.channels [i].last_block; + SoundData.channels [i].needs_decode = OrigSoundData.channels [i].needs_decode; + SoundData.channels [i].block_pointer = OrigSoundData.channels [i].block_pointer; + SoundData.channels [i].sample_pointer = OrigSoundData.channels [i].sample_pointer; + SoundData.channels [i].mode = OrigSoundData.channels [i].mode; + } + + S9xSetSoundMute (FALSE); + IAPU.PC = IAPU.RAM + APURegisters.PC; + S9xAPUUnpackStatus (); + if (APUCheckDirectPage ()) + IAPU.DirectPage = IAPU.RAM + 0x100; + else + IAPU.DirectPage = IAPU.RAM; + Settings.APUEnabled = TRUE; + IAPU.APUExecuting = TRUE; + } + else + { + Settings.APUEnabled = FALSE; + IAPU.APUExecuting = FALSE; + S9xSetSoundMute (TRUE); + } + S9xFixSoundAfterSnapshotLoad (); + ICPU.ShiftedPB = Registers.PB << 16; + ICPU.ShiftedDB = Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + S9xUnpackStatus (); + S9xFixCycles (); + S9xReschedule (); + + return (SUCCESS); +} + diff --git a/src/snapshot.cpp b/src/snapshot.cpp new file mode 100644 index 0000000..f17924d --- /dev/null +++ b/src/snapshot.cpp @@ -0,0 +1,1831 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include +#include + +#if defined(__unix) || defined(__linux) || defined(__sun) || defined(__DJGPP) +#include +#include +#include +#endif + +#include "snapshot.h" +#include "snaporig.h" +#include "memmap.h" +#include "snes9x.h" +#include "65c816.h" +#include "ppu.h" +#include "cpuexec.h" +#include "display.h" +#include "apu.h" +#include "soundux.h" +#include "sa1.h" +#include "srtc.h" +#include "sdd1.h" +#include "spc7110.h" +#include "movie.h" + +extern uint8 *SRAM; + +#ifdef ZSNES_FX +START_EXTERN_C +void S9xSuperFXPreSaveState (); +void S9xSuperFXPostSaveState (); +void S9xSuperFXPostLoadState (); +END_EXTERN_C +#endif + +#ifdef USE_ZNES_UNFREEZE +static bool8 S9xUnfreezeZSNES (const char *filename); +#endif + +typedef struct { + int offset; + int size; + int type; +} FreezeData; + +enum { + INT_V, uint8_ARRAY_V, uint16_ARRAY_V, uint32_ARRAY_V +}; + +#define Offset(field,structure) \ +((int) (((char *) (&(((structure)NULL)->field))) - ((char *) NULL))) + +#define COUNT(ARRAY) (sizeof (ARRAY) / sizeof (ARRAY[0])) + +struct SnapshotMovieInfo +{ + uint32 MovieInputDataSize; +}; + +void MemSpeedx2_hack_save(void); +void MemSpeedx2_hack_load(void); + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SnapshotMovieInfo *) + +static FreezeData SnapMovie [] = { + {OFFSET (MovieInputDataSize), 4, INT_V}, +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SCPUState *) + +static FreezeData SnapCPU [] = { + {OFFSET (Flags), 4, INT_V}, + {OFFSET (BranchSkip), 1, INT_V}, + {OFFSET (NMIActive), 1, INT_V}, + {OFFSET (IRQActive), 1, INT_V}, + {OFFSET (WaitingForInterrupt), 1, INT_V}, + {OFFSET (WhichEvent), 1, INT_V}, + {OFFSET (Cycles), 4, INT_V}, + {OFFSET (NextEvent), 4, INT_V}, + {OFFSET (V_Counter), 4, INT_V}, + {OFFSET (MemSpeed), 4, INT_V}, + {OFFSET (MemSpeedx2), 4, INT_V}, + {OFFSET (FastROMSpeed), 4, INT_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SRegisters *) + +static FreezeData SnapRegisters [] = { + {OFFSET (PB), 1, INT_V}, + {OFFSET (DB), 1, INT_V}, + {OFFSET (P.W), 2, INT_V}, + {OFFSET (A.W), 2, INT_V}, + {OFFSET (D.W), 2, INT_V}, + {OFFSET (S.W), 2, INT_V}, + {OFFSET (X.W), 2, INT_V}, + {OFFSET (Y.W), 2, INT_V}, + {OFFSET (PC), 2, INT_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SPPU *) + +static FreezeData SnapPPU [] = { + {OFFSET (BGMode), 1, INT_V}, + {OFFSET (BG3Priority), 1, INT_V}, + {OFFSET (Brightness), 1, INT_V}, + {OFFSET (VMA.High), 1, INT_V}, + {OFFSET (VMA.Increment), 1, INT_V}, + {OFFSET (VMA.Address), 2, INT_V}, + {OFFSET (VMA.Mask1), 2, INT_V}, + {OFFSET (VMA.FullGraphicCount), 2, INT_V}, + {OFFSET (VMA.Shift), 2, INT_V}, + {OFFSET (BG[0].SCBase), 2, INT_V}, + {OFFSET (BG[0].VOffset), 2, INT_V}, + {OFFSET (BG[0].HOffset), 2, INT_V}, + {OFFSET (BG[0].BGSize), 1, INT_V}, + {OFFSET (BG[0].NameBase), 2, INT_V}, + {OFFSET (BG[0].SCSize), 2, INT_V}, + + {OFFSET (BG[1].SCBase), 2, INT_V}, + {OFFSET (BG[1].VOffset), 2, INT_V}, + {OFFSET (BG[1].HOffset), 2, INT_V}, + {OFFSET (BG[1].BGSize), 1, INT_V}, + {OFFSET (BG[1].NameBase), 2, INT_V}, + {OFFSET (BG[1].SCSize), 2, INT_V}, + + {OFFSET (BG[2].SCBase), 2, INT_V}, + {OFFSET (BG[2].VOffset), 2, INT_V}, + {OFFSET (BG[2].HOffset), 2, INT_V}, + {OFFSET (BG[2].BGSize), 1, INT_V}, + {OFFSET (BG[2].NameBase), 2, INT_V}, + {OFFSET (BG[2].SCSize), 2, INT_V}, + + {OFFSET (BG[3].SCBase), 2, INT_V}, + {OFFSET (BG[3].VOffset), 2, INT_V}, + {OFFSET (BG[3].HOffset), 2, INT_V}, + {OFFSET (BG[3].BGSize), 1, INT_V}, + {OFFSET (BG[3].NameBase), 2, INT_V}, + {OFFSET (BG[3].SCSize), 2, INT_V}, + + {OFFSET (CGFLIP), 1, INT_V}, + {OFFSET (CGDATA), 256, uint16_ARRAY_V}, + {OFFSET (FirstSprite), 1, INT_V}, +#define O(N) \ + {OFFSET (OBJ[N].HPos), 2, INT_V}, \ + {OFFSET (OBJ[N].VPos), 2, INT_V}, \ + {OFFSET (OBJ[N].Name), 2, INT_V}, \ + {OFFSET (OBJ[N].VFlip), 1, INT_V}, \ + {OFFSET (OBJ[N].HFlip), 1, INT_V}, \ + {OFFSET (OBJ[N].Priority), 1, INT_V}, \ + {OFFSET (OBJ[N].Palette), 1, INT_V}, \ + {OFFSET (OBJ[N].Size), 1, INT_V} + + O( 0), O( 1), O( 2), O( 3), O( 4), O( 5), O( 6), O( 7), + O( 8), O( 9), O( 10), O( 11), O( 12), O( 13), O( 14), O( 15), + O( 16), O( 17), O( 18), O( 19), O( 20), O( 21), O( 22), O( 23), + O( 24), O( 25), O( 26), O( 27), O( 28), O( 29), O( 30), O( 31), + O( 32), O( 33), O( 34), O( 35), O( 36), O( 37), O( 38), O( 39), + O( 40), O( 41), O( 42), O( 43), O( 44), O( 45), O( 46), O( 47), + O( 48), O( 49), O( 50), O( 51), O( 52), O( 53), O( 54), O( 55), + O( 56), O( 57), O( 58), O( 59), O( 60), O( 61), O( 62), O( 63), + O( 64), O( 65), O( 66), O( 67), O( 68), O( 69), O( 70), O( 71), + O( 72), O( 73), O( 74), O( 75), O( 76), O( 77), O( 78), O( 79), + O( 80), O( 81), O( 82), O( 83), O( 84), O( 85), O( 86), O( 87), + O( 88), O( 89), O( 90), O( 91), O( 92), O( 93), O( 94), O( 95), + O( 96), O( 97), O( 98), O( 99), O(100), O(101), O(102), O(103), + O(104), O(105), O(106), O(107), O(108), O(109), O(110), O(111), + O(112), O(113), O(114), O(115), O(116), O(117), O(118), O(119), + O(120), O(121), O(122), O(123), O(124), O(125), O(126), O(127), +#undef O + {OFFSET (OAMPriorityRotation), 1, INT_V}, + {OFFSET (OAMAddr), 2, INT_V}, + {OFFSET (OAMFlip), 1, INT_V}, + {OFFSET (OAMTileAddress), 2, INT_V}, + {OFFSET (IRQVBeamPos), 2, INT_V}, + {OFFSET (IRQHBeamPos), 2, INT_V}, + {OFFSET (VBeamPosLatched), 2, INT_V}, + {OFFSET (HBeamPosLatched), 2, INT_V}, + {OFFSET (HBeamFlip), 1, INT_V}, + {OFFSET (VBeamFlip), 1, INT_V}, + {OFFSET (HVBeamCounterLatched), 1, INT_V}, + {OFFSET (MatrixA), 2, INT_V}, + {OFFSET (MatrixB), 2, INT_V}, + {OFFSET (MatrixC), 2, INT_V}, + {OFFSET (MatrixD), 2, INT_V}, + {OFFSET (CentreX), 2, INT_V}, + {OFFSET (CentreY), 2, INT_V}, + {OFFSET (Joypad1ButtonReadPos), 1, INT_V}, + {OFFSET (Joypad2ButtonReadPos), 1, INT_V}, + {OFFSET (Joypad3ButtonReadPos), 1, INT_V}, + {OFFSET (CGADD), 1, INT_V}, + {OFFSET (FixedColourRed), 1, INT_V}, + {OFFSET (FixedColourGreen), 1, INT_V}, + {OFFSET (FixedColourBlue), 1, INT_V}, + {OFFSET (SavedOAMAddr), 2, INT_V}, + {OFFSET (ScreenHeight), 2, INT_V}, + {OFFSET (WRAM), 4, INT_V}, + {OFFSET (ForcedBlanking), 1, INT_V}, + {OFFSET (OBJNameSelect), 2, INT_V}, + {OFFSET (OBJSizeSelect), 1, INT_V}, + {OFFSET (OBJNameBase), 2, INT_V}, + {OFFSET (OAMReadFlip), 1, INT_V}, + {OFFSET (VTimerEnabled), 1, INT_V}, + {OFFSET (HTimerEnabled), 1, INT_V}, + {OFFSET (HTimerPosition), 2, INT_V}, + {OFFSET (Mosaic), 1, INT_V}, + {OFFSET (Mode7HFlip), 1, INT_V}, + {OFFSET (Mode7VFlip), 1, INT_V}, + {OFFSET (Mode7Repeat), 1, INT_V}, + {OFFSET (Window1Left), 1, INT_V}, + {OFFSET (Window1Right), 1, INT_V}, + {OFFSET (Window2Left), 1, INT_V}, + {OFFSET (Window2Right), 1, INT_V}, +#define O(N) \ + {OFFSET (ClipWindowOverlapLogic[N]), 1, INT_V}, \ + {OFFSET (ClipWindow1Enable[N]), 1, INT_V}, \ + {OFFSET (ClipWindow2Enable[N]), 1, INT_V}, \ + {OFFSET (ClipWindow1Inside[N]), 1, INT_V}, \ + {OFFSET (ClipWindow2Inside[N]), 1, INT_V} + + O(0), O(1), O(2), O(3), O(4), O(5), + +#undef O + + {OFFSET (CGFLIPRead), 1, INT_V}, + {OFFSET (Need16x8Mulitply), 1, INT_V}, + {OFFSET (BGMosaic), 4, uint8_ARRAY_V}, + {OFFSET (OAMData), 512 + 32, uint8_ARRAY_V}, + {OFFSET (Need16x8Mulitply), 1, INT_V}, + {OFFSET (MouseSpeed), 2, uint8_ARRAY_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SDMA *) + +static FreezeData SnapDMA [] = { +#define O(N) \ + {OFFSET (TransferDirection) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (AAddressFixed) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (AAddressDecrement) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (TransferMode) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (ABank) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (AAddress) + N * sizeof (struct SDMA), 2, INT_V}, \ + {OFFSET (Address) + N * sizeof (struct SDMA), 2, INT_V}, \ + {OFFSET (BAddress) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (TransferBytes) + N * sizeof (struct SDMA), 2, INT_V}, \ + {OFFSET (HDMAIndirectAddressing) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (IndirectAddress) + N * sizeof (struct SDMA), 2, INT_V}, \ + {OFFSET (IndirectBank) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (Repeat) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (LineCount) + N * sizeof (struct SDMA), 1, INT_V}, \ + {OFFSET (FirstLine) + N * sizeof (struct SDMA), 1, INT_V} + + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) +#undef O +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SAPU *) + +static FreezeData SnapAPU [] = { + {OFFSET (Cycles), 4, INT_V}, + {OFFSET (ShowROM), 1, INT_V}, + {OFFSET (Flags), 1, INT_V}, + {OFFSET (KeyedChannels), 1, INT_V}, + {OFFSET (OutPorts), 4, uint8_ARRAY_V}, + {OFFSET (DSP), 0x80, uint8_ARRAY_V}, + {OFFSET (ExtraRAM), 64, uint8_ARRAY_V}, + {OFFSET (Timer), 3, uint16_ARRAY_V}, + {OFFSET (TimerTarget), 3, uint16_ARRAY_V}, + {OFFSET (TimerEnabled), 3, uint8_ARRAY_V}, + {OFFSET (TimerValueWritten), 3, uint8_ARRAY_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SAPURegisters *) + +static FreezeData SnapAPURegisters [] = { + {OFFSET (P), 1, INT_V}, + {OFFSET (YA.W), 2, INT_V}, + {OFFSET (X), 1, INT_V}, + {OFFSET (S), 1, INT_V}, + {OFFSET (PC), 2, INT_V}, +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,SSoundData *) + +static FreezeData SnapSoundData [] = { +#ifdef ENABLE_MASTER_VOLUMEN + {OFFSET (master_volume_left), 2, INT_V}, + {OFFSET (master_volume_right), 2, INT_V}, +#else + {OFFSET (pitch_mod), 4, INT_V}, +#endif +#ifdef ENABLE_ECHO_SOUND + {OFFSET (echo_volume_left), 2, INT_V}, + {OFFSET (echo_volume_right), 2, INT_V}, + {OFFSET (echo_enable), 4, INT_V}, + {OFFSET (echo_feedback), 4, INT_V}, + {OFFSET (echo_ptr), 4, INT_V}, + {OFFSET (echo_buffer_size), 4, INT_V}, + {OFFSET (echo_write_enabled), 4, INT_V}, + {OFFSET (echo_channel_enable), 4, INT_V}, +#else + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (pitch_mod), 4, INT_V}, +#endif + {OFFSET (pitch_mod), 4, INT_V}, + {OFFSET (dummy), 3, uint32_ARRAY_V}, +#define O(N) \ + {OFFSET (channels [N].state), 4, INT_V}, \ + {OFFSET (channels [N].type), 4, INT_V}, \ + {OFFSET (channels [N].volume_left), 2, INT_V}, \ + {OFFSET (channels [N].volume_right), 2, INT_V}, \ + {OFFSET (channels [N].hertz), 4, INT_V}, \ + {OFFSET (channels [N].count), 4, INT_V}, \ + {OFFSET (channels [N].loop), 1, INT_V}, \ + {OFFSET (channels [N].envx), 4, INT_V}, \ + {OFFSET (channels [N].left_vol_level), 2, INT_V}, \ + {OFFSET (channels [N].right_vol_level), 2, INT_V}, \ + {OFFSET (channels [N].envx_target), 2, INT_V}, \ + {OFFSET (channels [N].env_error), 4, INT_V}, \ + {OFFSET (channels [N].erate), 4, INT_V}, \ + {OFFSET (channels [N].direction), 4, INT_V}, \ + {OFFSET (channels [N].attack_rate), 4, INT_V}, \ + {OFFSET (channels [N].decay_rate), 4, INT_V}, \ + {OFFSET (channels [N].sustain_rate), 4, INT_V}, \ + {OFFSET (channels [N].release_rate), 4, INT_V}, \ + {OFFSET (channels [N].sustain_level), 4, INT_V}, \ + {OFFSET (channels [N].sample), 2, INT_V}, \ + {OFFSET (channels [N].decoded), 16, uint16_ARRAY_V}, \ + {OFFSET (channels [N].previous16), 2, uint16_ARRAY_V}, \ + {OFFSET (channels [N].sample_number), 2, INT_V}, \ + {OFFSET (channels [N].last_block), 1, INT_V}, \ + {OFFSET (channels [N].needs_decode), 1, INT_V}, \ + {OFFSET (channels [N].block_pointer), 4, INT_V}, \ + {OFFSET (channels [N].sample_pointer), 4, INT_V}, \ + {OFFSET (channels [N].mode), 4, INT_V} + + O(0), O(1), O(2), O(3), O(4), O(5), O(6), O(7) +#undef O +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SSA1Registers *) + +static FreezeData SnapSA1Registers [] = { + {OFFSET (PB), 1, INT_V}, + {OFFSET (DB), 1, INT_V}, + {OFFSET (P.W), 2, INT_V}, + {OFFSET (A.W), 2, INT_V}, + {OFFSET (D.W), 2, INT_V}, + {OFFSET (S.W), 2, INT_V}, + {OFFSET (X.W), 2, INT_V}, + {OFFSET (Y.W), 2, INT_V}, + {OFFSET (PC), 2, INT_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SSA1 *) + +static FreezeData SnapSA1 [] = { + {OFFSET (Flags), 4, INT_V}, + {OFFSET (NMIActive), 1, INT_V}, + {OFFSET (IRQActive), 1, INT_V}, + {OFFSET (WaitingForInterrupt), 1, INT_V}, + {OFFSET (op1), 2, INT_V}, + {OFFSET (op2), 2, INT_V}, + {OFFSET (arithmetic_op), 4, INT_V}, + {OFFSET (sum), 8, INT_V}, + {OFFSET (overflow), 1, INT_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SPC7110EmuVars *) + +static FreezeData SnapSPC7110 [] = { + {OFFSET (reg4800), 1, INT_V}, + {OFFSET (reg4801), 1, INT_V}, + {OFFSET (reg4802), 1, INT_V}, + {OFFSET (reg4803), 1, INT_V}, + {OFFSET (reg4804), 1, INT_V}, + {OFFSET (reg4805), 1, INT_V}, + {OFFSET (reg4806), 1, INT_V}, + {OFFSET (reg4807), 1, INT_V}, + {OFFSET (reg4808), 1, INT_V}, + {OFFSET (reg4809), 1, INT_V}, + {OFFSET (reg480A), 1, INT_V}, + {OFFSET (reg480B), 1, INT_V}, + {OFFSET (reg480C), 1, INT_V}, + {OFFSET (reg4811), 1, INT_V}, + {OFFSET (reg4812), 1, INT_V}, + {OFFSET (reg4813), 1, INT_V}, + {OFFSET (reg4814), 1, INT_V}, + {OFFSET (reg4815), 1, INT_V}, + {OFFSET (reg4816), 1, INT_V}, + {OFFSET (reg4817), 1, INT_V}, + {OFFSET (reg4818), 1, INT_V}, + {OFFSET (reg4820), 1, INT_V}, + {OFFSET (reg4821), 1, INT_V}, + {OFFSET (reg4822), 1, INT_V}, + {OFFSET (reg4823), 1, INT_V}, + {OFFSET (reg4824), 1, INT_V}, + {OFFSET (reg4825), 1, INT_V}, + {OFFSET (reg4826), 1, INT_V}, + {OFFSET (reg4827), 1, INT_V}, + {OFFSET (reg4828), 1, INT_V}, + {OFFSET (reg4829), 1, INT_V}, + {OFFSET (reg482A), 1, INT_V}, + {OFFSET (reg482B), 1, INT_V}, + {OFFSET (reg482C), 1, INT_V}, + {OFFSET (reg482D), 1, INT_V}, + {OFFSET (reg482E), 1, INT_V}, + {OFFSET (reg482F), 1, INT_V}, + {OFFSET (reg4830), 1, INT_V}, + {OFFSET (reg4831), 1, INT_V}, + {OFFSET (reg4832), 1, INT_V}, + {OFFSET (reg4833), 1, INT_V}, + {OFFSET (reg4834), 1, INT_V}, + {OFFSET (reg4840), 1, INT_V}, + {OFFSET (reg4841), 1, INT_V}, + {OFFSET (reg4842), 1, INT_V}, + {OFFSET (AlignBy), 1, INT_V}, + {OFFSET (written), 1, INT_V}, + {OFFSET (offset_add), 1, INT_V}, + {OFFSET (DataRomOffset), 4, INT_V}, + {OFFSET (DataRomSize), 4, INT_V}, + {OFFSET (bank50Internal), 4, INT_V}, + {OFFSET (bank50), 0x10000, uint8_ARRAY_V} +}; + +#undef OFFSET +#define OFFSET(f) Offset(f,struct SPC7110RTC *) + +static FreezeData SnapS7RTC [] = { + {OFFSET (reg), 16, uint8_ARRAY_V}, + {OFFSET (index), 2, INT_V}, + {OFFSET (control), 1, INT_V}, + {OFFSET (init), 1, INT_V}, + {OFFSET (last_used),4,INT_V} +}; + +static char ROMFilename [_MAX_PATH]; +//static char SnapshotFilename [_MAX_PATH]; + +void FreezeStruct (STREAM stream, char *name, void *base, FreezeData *fields, + int num_fields); +void FreezeBlock (STREAM stream, char *name, uint8 *block, int size); + +int UnfreezeStruct (STREAM stream, char *name, void *base, FreezeData *fields, + int num_fields); +int UnfreezeBlock (STREAM stream, char *name, uint8 *block, int size); + +int UnfreezeStructCopy (STREAM stream, char *name, uint8** block, FreezeData *fields, int num_fields); + +void UnfreezeStructFromCopy (void *base, FreezeData *fields, int num_fields, uint8* block); + +int UnfreezeBlockCopy (STREAM stream, char *name, uint8** block, int size); + +bool8 Snapshot (const char *filename) +{ + return (S9xFreezeGame (filename)); +} + +bool8 S9xFreezeGame (const char *filename) +{ + STREAM stream = NULL; + + if (S9xOpenSnapshotFile (filename, FALSE, &stream)) + { +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) + int16 backpc=Registers.PC; + uint16 backapc=APURegisters.PC; + Registers.PC = CPU.PC - CPU.PCBase; + S9xPackStatus (); + APURegisters.PC = IAPU.PC - IAPU.RAM; + S9xAPUPackStatus (); +#endif + S9xFreezeToStream (stream); + S9xCloseSnapshotFile (stream); + +#ifndef USE_GL + sprintf(String, "Saved %s", S9xBasename (filename)); + S9xMessage (S9X_INFO, S9X_FREEZE_FILE_INFO, String); +#endif + +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) + Registers.PC = backpc; + APURegisters.PC = backapc; +#endif + return (TRUE); + } + return (FALSE); +} + +bool8 S9xUnfreezeGame (const char *filename) +{ +#ifdef USE_GL + extern unsigned char videogl_brightness; + extern unsigned char videogl_first_brightness; + videogl_cache_reseted=1; + videogl_brightness=~videogl_first_brightness; +#endif + if (S9xLoadOrigSnapshot (filename)) + return (TRUE); + +#ifdef USE_ZNES_UNFREEZE + if (S9xUnfreezeZSNES (filename)) + return (TRUE); +#endif + + STREAM snapshot = NULL; + if (S9xOpenSnapshotFile (filename, TRUE, &snapshot)) + { + int result; + if ((result = S9xUnfreezeFromStream (snapshot)) != SUCCESS) + { + switch (result) + { + case WRONG_FORMAT: + S9xMessage (S9X_ERROR, S9X_WRONG_FORMAT, + "File not in Snes9x freeze format"); + break; + case WRONG_VERSION: + S9xMessage (S9X_ERROR, S9X_WRONG_VERSION, + "Incompatable Snes9x freeze file format version"); + break; + case WRONG_MOVIE_SNAPSHOT: + S9xMessage (S9X_ERROR, S9X_WRONG_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_WRONG_MOVIE); + break; + case NOT_A_MOVIE_SNAPSHOT: + S9xMessage (S9X_ERROR, S9X_NOT_A_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_NOT_MOVIE); + break; + default: + case FILE_NOT_FOUND: + sprintf (String, "ROM image \"%s\" for freeze file not found", + ROMFilename); + S9xMessage (S9X_ERROR, S9X_ROM_NOT_FOUND, String); + break; + } + S9xCloseSnapshotFile (snapshot); + return (FALSE); + } + +#ifndef USE_GL + sprintf(String, "Loaded %s", S9xBasename (filename)); + S9xMessage (S9X_INFO, S9X_FREEZE_FILE_INFO, String); +#endif + + MemSpeedx2_hack_load(); + S9xCloseSnapshotFile (snapshot); + return (TRUE); + } + return (FALSE); +} + +bool8 S9xLoadSnapshot (const char *filename) +{ + return (S9xUnfreezeGame (filename)); +} + + +void S9xFreezeToStream (STREAM stream) +{ + char buffer [1024]; + int i; + + S9xSetSoundMute (TRUE); +#ifdef ZSNES_FX + if (Settings.SuperFX) + S9xSuperFXPreSaveState (); +#endif + + S9xUpdateRTC(); + S9xSRTCPreSaveState (); + + for (i = 0; i < 8; i++) + { + SoundData.channels [i].previous16 [0] = (int16) SoundData.channels [i].previous [0]; + SoundData.channels [i].previous16 [1] = (int16) SoundData.channels [i].previous [1]; + } + sprintf (buffer, "%s:%04d\n", SNAPSHOT_MAGIC, SNAPSHOT_VERSION); + WRITE_STREAM (buffer, strlen (buffer), stream); + sprintf (buffer, "NAM:%06d:%s%c", strlen (CMemory_ROMFilename) + 1, + CMemory_ROMFilename, 0); + WRITE_STREAM (buffer, strlen (buffer) + 1, stream); + MemSpeedx2_hack_save(); + FreezeStruct (stream, "CPU", &CPU, SnapCPU, COUNT (SnapCPU)); + CPU.MemSpeedx2=CPU.MemSpeed << 1; + FreezeStruct (stream, "REG", &Registers, SnapRegisters, COUNT (SnapRegisters)); + FreezeStruct (stream, "PPU", &PPU, SnapPPU, COUNT (SnapPPU)); + FreezeStruct (stream, "DMA", DMA, SnapDMA, COUNT (SnapDMA)); + + // RAM and VRAM + FreezeBlock (stream, "VRA", CMemory_VRAM, 0x10000); + FreezeBlock (stream, "RAM", CMemory_RAM, 0x20000); + FreezeBlock (stream, "SRA", CMemory_SRAM, 0x20000); + FreezeBlock (stream, "FIL", CMemory_FillRAM, 0x8000); + if (Settings.APUEnabled) + { + // APU + FreezeStruct (stream, "APU", &APU, SnapAPU, COUNT (SnapAPU)); + FreezeStruct (stream, "ARE", &APURegisters, SnapAPURegisters, + COUNT (SnapAPURegisters)); + FreezeBlock (stream, "ARA", IAPU.RAM, 0x10000); + FreezeStruct (stream, "SOU", &SoundData, SnapSoundData, + COUNT (SnapSoundData)); + } + if (Settings.SA1) + { + SA1Registers.PC = SA1.PC - SA1.PCBase; +#if !defined(DREAMCAST) || !defined(USE_OPC_ASM) + S9xSA1PackStatus (); +#endif + FreezeStruct (stream, "SA1", &SA1, SnapSA1, COUNT (SnapSA1)); + FreezeStruct (stream, "SAR", &SA1Registers, SnapSA1Registers, + COUNT (SnapSA1Registers)); + } + + if (Settings.SPC7110) + { + FreezeStruct (stream, "SP7", &s7r, SnapSPC7110, COUNT (SnapSPC7110)); + } + if(Settings.SPC7110RTC) + { + FreezeStruct (stream, "RTC", &rtc_f9, SnapS7RTC, COUNT (SnapS7RTC)); + } + + S9xSetSoundMute (FALSE); +#ifdef ZSNES_FX + if (Settings.SuperFX) + S9xSuperFXPostSaveState (); +#endif +} + +#ifdef USE_MMU +void set_mmu_mappings(void); +#endif + +int S9xUnfreezeFromStream (STREAM stream) +{ + char buffer [_MAX_PATH + 1]; + char rom_filename [_MAX_PATH + 1]; + int result; + + int version; + int len = strlen (SNAPSHOT_MAGIC) + 1 + 4 + 1; + if (READ_STREAM (buffer, len, stream) != len) + return (WRONG_FORMAT); + if (strncmp (buffer, SNAPSHOT_MAGIC, strlen (SNAPSHOT_MAGIC)) != 0) + return (WRONG_FORMAT); + if ((version = atoi (&buffer [strlen (SNAPSHOT_MAGIC) + 1])) > SNAPSHOT_VERSION) + return (WRONG_VERSION); + + if ((result = UnfreezeBlock (stream, "NAM", (uint8 *) rom_filename, _MAX_PATH)) != SUCCESS) + return (result); + + if (strcasecmp (rom_filename, CMemory_ROMFilename) != 0 && + strcasecmp (S9xBasename (rom_filename), S9xBasename (CMemory_ROMFilename)) != 0) + { + S9xMessage (S9X_WARNING, S9X_FREEZE_ROM_NAME, + "Current loaded ROM image doesn't match that required by freeze-game file."); + } + +// ## begin load ## + uint8* local_cpu = NULL; + uint8* local_registers = NULL; + uint8* local_ppu = NULL; + uint8* local_dma = NULL; + uint8* local_vram = NULL; + uint8* local_ram = NULL; + uint8* local_sram = NULL; + uint8* local_fillram = NULL; + uint8* local_apu = NULL; + uint8* local_apu_registers = NULL; + uint8* local_apu_ram = NULL; + uint8* local_apu_sounddata = NULL; + uint8* local_sa1 = NULL; + uint8* local_sa1_registers = NULL; + uint8* local_spc = NULL; + uint8* local_spc_rtc = NULL; + uint8* local_movie_data = NULL; + + do + { + if ((result = UnfreezeStructCopy (stream, "CPU", &local_cpu, SnapCPU, COUNT (SnapCPU))) != SUCCESS) + break; + if ((result = UnfreezeStructCopy (stream, "REG", &local_registers, SnapRegisters, COUNT (SnapRegisters))) != SUCCESS) + break; + if ((result = UnfreezeStructCopy (stream, "PPU", &local_ppu, SnapPPU, COUNT (SnapPPU))) != SUCCESS) + break; + if ((result = UnfreezeStructCopy (stream, "DMA", &local_dma, SnapDMA, COUNT (SnapDMA))) != SUCCESS) + break; + if ((result = UnfreezeBlockCopy (stream, "VRA", &local_vram, 0x10000)) != SUCCESS) + break; + if ((result = UnfreezeBlockCopy (stream, "RAM", &local_ram, 0x20000)) != SUCCESS) + break; + if ((result = UnfreezeBlockCopy (stream, "SRA", &local_sram, 0x20000)) != SUCCESS) + break; + if ((result = UnfreezeBlockCopy (stream, "FIL", &local_fillram, 0x8000)) != SUCCESS) + break; + if (UnfreezeStructCopy (stream, "APU", &local_apu, SnapAPU, COUNT (SnapAPU)) == SUCCESS) + { + if ((result = UnfreezeStructCopy (stream, "ARE", &local_apu_registers, SnapAPURegisters, COUNT (SnapAPURegisters))) != SUCCESS) + break; + if ((result = UnfreezeBlockCopy (stream, "ARA", &local_apu_ram, 0x10000)) != SUCCESS) + break; + if ((result = UnfreezeStructCopy (stream, "SOU", &local_apu_sounddata, SnapSoundData, COUNT (SnapSoundData))) != SUCCESS) + break; + } + if ((result = UnfreezeStructCopy (stream, "SA1", &local_sa1, SnapSA1, COUNT(SnapSA1))) == SUCCESS) + { + if ((result = UnfreezeStructCopy (stream, "SAR", &local_sa1_registers, SnapSA1Registers, COUNT (SnapSA1Registers))) != SUCCESS) + break; + } + + if ((result = UnfreezeStructCopy (stream, "SP7", &local_spc, SnapSPC7110, COUNT(SnapSPC7110))) != SUCCESS) + { + if(Settings.SPC7110) + break; + } + if ((result = UnfreezeStructCopy (stream, "RTC", &local_spc_rtc, SnapS7RTC, COUNT (SnapS7RTC))) != SUCCESS) + { + if(Settings.SPC7110RTC) + break; + } + + result=SUCCESS; + + } while(false); +// ## end load ## + + if (result == SUCCESS) + { + uint32 old_flags = CPU.Flags; + uint32 sa1_old_flags = SA1.Flags; + S9xReset (); + S9xSetSoundMute (TRUE); + + UnfreezeStructFromCopy (&CPU, SnapCPU, COUNT (SnapCPU), local_cpu); + UnfreezeStructFromCopy (&Registers, SnapRegisters, COUNT (SnapRegisters), local_registers); + UnfreezeStructFromCopy (&PPU, SnapPPU, COUNT (SnapPPU), local_ppu); + UnfreezeStructFromCopy (DMA, SnapDMA, COUNT (SnapDMA), local_dma); + memcpy (CMemory_VRAM, local_vram, 0x10000); + memcpy (CMemory_RAM, local_ram, 0x20000); + memcpy (CMemory_SRAM, local_sram, 0x20000); + memcpy (CMemory_FillRAM, local_fillram, 0x8000); + if(local_apu) + { + UnfreezeStructFromCopy (&APU, SnapAPU, COUNT (SnapAPU), local_apu); + UnfreezeStructFromCopy (&APURegisters, SnapAPURegisters, COUNT (SnapAPURegisters), local_apu_registers); + memcpy (IAPU.RAM, local_apu_ram, 0x10000); + UnfreezeStructFromCopy (&SoundData, SnapSoundData, COUNT (SnapSoundData), local_apu_sounddata); + } + if(local_sa1) + { + UnfreezeStructFromCopy (&SA1, SnapSA1, COUNT (SnapSA1), local_sa1); + UnfreezeStructFromCopy (&SA1Registers, SnapSA1Registers, COUNT (SnapSA1Registers), local_sa1_registers); + } + if(local_spc) + { + UnfreezeStructFromCopy (&s7r, SnapSPC7110, COUNT (SnapSPC7110), local_spc); + } + if(local_spc_rtc) + { + UnfreezeStructFromCopy (&rtc_f9, SnapS7RTC, COUNT (SnapS7RTC), local_spc_rtc); + } + + CMemory_FixROMSpeed (); + CPU.Flags |= old_flags & (DEBUG_MODE_FLAG | TRACE_FLAG | + SINGLE_STEP_FLAG | FRAME_ADVANCE_FLAG); + + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + CPU.InDMA = FALSE; + S9xFixColourBrightness (); + IPPU.RenderThisFrame = FALSE; + + if (local_apu) + { + S9xSetSoundMute (FALSE); + IAPU.PC = IAPU.RAM + APURegisters.PC; + S9xAPUUnpackStatus (); + if (APUCheckDirectPage ()) + IAPU.DirectPage = IAPU.RAM + 0x100; + else + IAPU.DirectPage = IAPU.RAM; + Settings.APUEnabled = TRUE; + IAPU.APUExecuting = TRUE; + } + else + { + Settings.APUEnabled = FALSE; + IAPU.APUExecuting = FALSE; + S9xSetSoundMute (TRUE); + } + + if (local_sa1) + { + S9xFixSA1AfterSnapshotLoad (); + SA1.Flags |= sa1_old_flags & (TRACE_FLAG); + } + + if (local_spc_rtc) + { + S9xUpdateRTC(); + } + + S9xFixSoundAfterSnapshotLoad (); + + uint8 hdma_byte = CMemory_FillRAM[0x420c]; + S9xSetCPU(hdma_byte, 0x420c); + + if(!CMemory_FillRAM[0x4213]){ + // most likely an old savestate + CMemory_FillRAM[0x4213]=CMemory_FillRAM[0x4201]; + if(!CMemory_FillRAM[0x4213]) + CMemory_FillRAM[0x4213]=CMemory_FillRAM[0x4201]=0xFF; + } + + ICPU.ShiftedPB = Registers.PB << 16; + ICPU.ShiftedDB = Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + S9xUnpackStatus (); + S9xFixCycles (); +// S9xReschedule (); // <-- this causes desync when recording or playing movies + +#ifdef ZSNES_FX + if (Settings.SuperFX) + S9xSuperFXPostLoadState (); +#endif + + S9xSRTCPostLoadState (); + if (Settings.SDD1) + S9xSDD1PostLoadState (); + + IAPU.NextAPUTimerPos = CPU.Cycles * 10000L; + IAPU.APUTimerCounter = 0; + } + + if (local_cpu) free(local_cpu); //delete [] local_cpu; + if (local_registers) free(local_registers); //delete [] local_registers; + if (local_ppu) free(local_ppu); //delete [] local_ppu; + if (local_dma) free(local_dma); //delete [] local_dma; + if (local_vram) free(local_vram); //delete [] local_vram; + if (local_ram) free(local_ram); //delete [] local_ram; + if (local_sram) free(local_sram); //delete [] local_sram; + if (local_fillram) free(local_fillram); //delete [] local_fillram; + if (local_apu) free(local_apu); //delete [] local_apu; + if (local_apu_registers) free(local_apu_registers); //delete [] local_apu_registers; + if (local_apu_ram) free(local_apu_ram); //delete [] local_apu_ram; + if (local_apu_sounddata) free(local_apu_sounddata); //delete [] local_apu_sounddata; + if (local_sa1) free(local_sa1); //delete [] local_sa1; + if (local_sa1_registers) free(local_sa1_registers); //delete [] local_sa1_registers; + if (local_spc) free(local_spc); //delete [] local_spc; + if (local_spc_rtc) free(local_spc_rtc); //delete [] local_spc_rtc; + if (local_movie_data) free(local_movie_data); //delete [] local_movie_data; + +#ifdef USE_MMU + set_mmu_mappings(); +#endif + return (result); +} + +int FreezeSize (int size, int type) +{ + switch (type) + { + case uint16_ARRAY_V: + return (size * 2); + case uint32_ARRAY_V: + return (size * 4); + default: + return (size); + } +} + +void FreezeStruct (STREAM stream, char *name, void *base, FreezeData *fields, + int num_fields) +{ + // Work out the size of the required block + int len = 0; + int i; + int j; + + for (i = 0; i < num_fields; i++) + { + if (fields [i].offset + FreezeSize (fields [i].size, + fields [i].type) > len) + len = fields [i].offset + FreezeSize (fields [i].size, + fields [i].type); + } + + uint8 *block = (uint8 *)malloc(len); //new uint8 [len]; + uint8 *ptr = block; + uint16 word; + uint32 dword; + int64 qword; + + // Build the block ready to be streamed out + for (i = 0; i < num_fields; i++) + { + switch (fields [i].type) + { + case INT_V: + switch (fields [i].size) + { + case 1: + *ptr++ = *((uint8 *) base + fields [i].offset); + break; + case 2: + word = *((uint16 *) ((uint8 *) base + fields [i].offset)); + *ptr++ = (uint8) (word >> 8); + *ptr++ = (uint8) word; + break; + case 4: + dword = *((uint32 *) ((uint8 *) base + fields [i].offset)); + *ptr++ = (uint8) (dword >> 24); + *ptr++ = (uint8) (dword >> 16); + *ptr++ = (uint8) (dword >> 8); + *ptr++ = (uint8) dword; + break; + case 8: + qword = *((int64 *) ((uint8 *) base + fields [i].offset)); + *ptr++ = (uint8) (qword >> 56); + *ptr++ = (uint8) (qword >> 48); + *ptr++ = (uint8) (qword >> 40); + *ptr++ = (uint8) (qword >> 32); + *ptr++ = (uint8) (qword >> 24); + *ptr++ = (uint8) (qword >> 16); + *ptr++ = (uint8) (qword >> 8); + *ptr++ = (uint8) qword; + break; + } + break; + case uint8_ARRAY_V: + memmove (ptr, (uint8 *) base + fields [i].offset, fields [i].size); + ptr += fields [i].size; + break; + case uint16_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + word = *((uint16 *) ((uint8 *) base + fields [i].offset + j * 2)); + *ptr++ = (uint8) (word >> 8); + *ptr++ = (uint8) word; + } + break; + case uint32_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + dword = *((uint32 *) ((uint8 *) base + fields [i].offset + j * 4)); + *ptr++ = (uint8) (dword >> 24); + *ptr++ = (uint8) (dword >> 16); + *ptr++ = (uint8) (dword >> 8); + *ptr++ = (uint8) dword; + } + break; + } + } + + FreezeBlock (stream, name, block, len); + free(block); //delete[] block; +} + +void FreezeBlock (STREAM stream, char *name, uint8 *block, int size) +{ + char buffer [512]; + sprintf (buffer, "%s:%06d:", name, size); + WRITE_STREAM (buffer, strlen (buffer), stream); + WRITE_STREAM (block, size, stream); + +} + +int UnfreezeStruct (STREAM stream, char *name, void *base, FreezeData *fields, + int num_fields) +{ + // Work out the size of the required block + int len = 0; + int i; + int j; + + for (i = 0; i < num_fields; i++) + { + if (fields [i].offset + FreezeSize (fields [i].size, + fields [i].type) > len) + len = fields [i].offset + FreezeSize (fields [i].size, + fields [i].type); + } + + uint8 *block = (uint8 *)malloc(len); //new uint8 [len]; + uint8 *ptr = block; + uint16 word; + uint32 dword; + int64 qword; + int result; + + if ((result = UnfreezeBlock (stream, name, block, len)) != SUCCESS) + { + free(block); //delete block; + return (result); + } + + // Unpack the block of data into a C structure + for (i = 0; i < num_fields; i++) + { + switch (fields [i].type) + { + case INT_V: + switch (fields [i].size) + { + case 1: + *((uint8 *) base + fields [i].offset) = *ptr++; + break; + case 2: + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) ((uint8 *) base + fields [i].offset)) = word; + break; + case 4: + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) ((uint8 *) base + fields [i].offset)) = dword; + break; + case 8: + qword = (int64) *ptr++ << 56; + qword |= (int64) *ptr++ << 48; + qword |= (int64) *ptr++ << 40; + qword |= (int64) *ptr++ << 32; + qword |= (int64) *ptr++ << 24; + qword |= (int64) *ptr++ << 16; + qword |= (int64) *ptr++ << 8; + qword |= (int64) *ptr++; + *((int64 *) ((uint8 *) base + fields [i].offset)) = qword; + break; + } + break; + case uint8_ARRAY_V: + memmove ((uint8 *) base + fields [i].offset, ptr, fields [i].size); + ptr += fields [i].size; + break; + case uint16_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) ((uint8 *) base + fields [i].offset + j * 2)) = word; + } + break; + case uint32_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) ((uint8 *) base + fields [i].offset + j * 4)) = dword; + } + break; + } + } + + free(block); //delete [] block; + return (result); +} + +int UnfreezeBlock (STREAM stream, char *name, uint8 *block, int size) +{ + char buffer [20]; + int len = 0; + int rem = 0; + int rew_len; + if (READ_STREAM (buffer, 11, stream) != 11 || + strncmp (buffer, name, 3) != 0 || buffer [3] != ':' || + (len = atoi (&buffer [4])) == 0) + { + REVERT_STREAM(stream, FIND_STREAM(stream)-11, 0); + return (WRONG_FORMAT); + } + + if (len > size) + { + rem = len - size; + len = size; + } + if ((rew_len=READ_STREAM (block, len, stream)) != len) + { + REVERT_STREAM(stream, FIND_STREAM(stream)-11-rew_len, 0); + return (WRONG_FORMAT); + } + if (rem) + { + char *junk = (char *)malloc(rem); //new char [rem]; + READ_STREAM (junk, rem, stream); + free(junk); //delete [] junk; + } + + return (SUCCESS); +} + +int UnfreezeStructCopy (STREAM stream, char *name, uint8** block, FreezeData *fields, int num_fields) +{ + // Work out the size of the required block + int len = 0; + int i; + + for (i = 0; i < num_fields; i++) + { + if (fields [i].offset + FreezeSize (fields [i].size, + fields [i].type) > len) + len = fields [i].offset + FreezeSize (fields [i].size, + fields [i].type); + } + + return (UnfreezeBlockCopy (stream, name, block, len)); +} + +void UnfreezeStructFromCopy (void *base, FreezeData *fields, int num_fields, uint8* block) +{ + int i; + int j; + uint8 *ptr = block; + uint16 word; + uint32 dword; + int64 qword; + + // Unpack the block of data into a C structure + for (i = 0; i < num_fields; i++) + { + switch (fields [i].type) + { + case INT_V: + switch (fields [i].size) + { + case 1: + *((uint8 *) base + fields [i].offset) = *ptr++; + break; + case 2: + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) ((uint8 *) base + fields [i].offset)) = word; + break; + case 4: + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) ((uint8 *) base + fields [i].offset)) = dword; + break; + case 8: + qword = (int64) *ptr++ << 56; + qword |= (int64) *ptr++ << 48; + qword |= (int64) *ptr++ << 40; + qword |= (int64) *ptr++ << 32; + qword |= (int64) *ptr++ << 24; + qword |= (int64) *ptr++ << 16; + qword |= (int64) *ptr++ << 8; + qword |= (int64) *ptr++; + *((int64 *) ((uint8 *) base + fields [i].offset)) = qword; + break; + } + break; + case uint8_ARRAY_V: + memmove ((uint8 *) base + fields [i].offset, ptr, fields [i].size); + ptr += fields [i].size; + break; + case uint16_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + word = *ptr++ << 8; + word |= *ptr++; + *((uint16 *) ((uint8 *) base + fields [i].offset + j * 2)) = word; + } + break; + case uint32_ARRAY_V: + for (j = 0; j < fields [i].size; j++) + { + dword = *ptr++ << 24; + dword |= *ptr++ << 16; + dword |= *ptr++ << 8; + dword |= *ptr++; + *((uint32 *) ((uint8 *) base + fields [i].offset + j * 4)) = dword; + } + break; + } + } +} + +int UnfreezeBlockCopy (STREAM stream, char *name, uint8** block, int size) +{ + *block = (uint8 *)malloc(size); //new uint8 [size]; + int result; + + if ((result = UnfreezeBlock (stream, name, *block, size)) != SUCCESS) + { + free(*block); //delete [] (*block); + *block = NULL; + return (result); + } + + return (result); +} + +#ifdef USE_SPC_DUMP +extern uint8 spc_dump_dsp[0x100]; + +bool8 S9xSPCDump (const char *filename) +{ + static uint8 header [] = { + 'S', 'N', 'E', 'S', '-', 'S', 'P', 'C', '7', '0', '0', ' ', + 'S', 'o', 'u', 'n', 'd', ' ', 'F', 'i', 'l', 'e', ' ', + 'D', 'a', 't', 'a', ' ', 'v', '0', '.', '3', '0', 26, 26, 26 + }; + static uint8 version = { + 0x1e + }; + + FILE *fs; + + S9xSetSoundMute (TRUE); + + if (!(fs = fopen (filename, "wb"))) + return (FALSE); + + // The SPC file format: + // 0000: header: 'SNES-SPC700 Sound File Data v0.30',26,26,26 + // 0036: version: $1e + // 0037: SPC700 PC: + // 0039: SPC700 A: + // 0040: SPC700 X: + // 0041: SPC700 Y: + // 0042: SPC700 P: + // 0043: SPC700 S: + // 0044: Reserved: 0, 0, 0, 0 + // 0048: Title of game: 32 bytes + // 0000: Song name: 32 bytes + // 0000: Name of dumper: 32 bytes + // 0000: Comments: 32 bytes + // 0000: Date of SPC dump: 4 bytes + // 0000: Fade out time in milliseconds: 4 bytes + // 0000: Fade out length in milliseconds: 2 bytes + // 0000: Default channel enables: 1 bytes + // 0000: Emulator used to dump .SPC files: 1 byte, 1 == ZSNES + // 0000: Reserved: 36 bytes + // 0256: SPC700 RAM: 64K + // ----: DSP Registers: 256 bytes + + if (fwrite (header, sizeof (header), 1, fs) != 1 || + fputc (version, fs) == EOF || + fseek (fs, 37, SEEK_SET) == EOF || + fputc (APURegisters.PC & 0xff, fs) == EOF || + fputc (APURegisters.PC >> 8, fs) == EOF || + fputc (APURegisters.YA.B.A, fs) == EOF || + fputc (APURegisters.X, fs) == EOF || + fputc (APURegisters.YA.B.Y, fs) == EOF || + fputc (APURegisters.P, fs) == EOF || + fputc (APURegisters.S, fs) == EOF || + fseek (fs, 256, SEEK_SET) == EOF || + fwrite (IAPU.RAM, 0x10000, 1, fs) != 1 || +#ifdef USE_SPC_DUMP + fwrite (spc_dump_dsp, 1, 256, fs) != 256 || +#endif + fwrite (APU.ExtraRAM, 64, 1, fs) != 1 || + fclose (fs) < 0) + { + S9xSetSoundMute (FALSE); + return (FALSE); + } + S9xSetSoundMute (FALSE); + return (TRUE); +} +#endif + +#ifdef USE_ZNES_UNFREEZE +static bool8 S9xUnfreezeZSNES (const char *filename) +{ + FILE *fs; + uint8 t [4000]; + + if (!(fs = fopen (filename, "rb"))) + return (FALSE); + + if (fread (t, 64, 1, fs) == 1 && + strncmp ((char *) t, "ZSNES Save State File V0.6", 26) == 0) + { + S9xReset (); + S9xSetSoundMute (TRUE); + + // 28 Curr cycle + CPU.V_Counter = READ_WORD (&t [29]); + // 33 instrset + Settings.APUEnabled = t [36]; + + // 34 bcycpl cycles per scanline + // 35 cycphb cyclers per hblank + + Registers.A.W = READ_WORD (&t [41]); + Registers.DB = t [43]; + Registers.PB = t [44]; + Registers.S.W = READ_WORD (&t [45]); + Registers.D.W = READ_WORD (&t [47]); + Registers.X.W = READ_WORD (&t [49]); + Registers.Y.W = READ_WORD (&t [51]); + Registers.P.W = READ_WORD (&t [53]); + Registers.PC = READ_WORD (&t [55]); + + fread (t, 1, 8, fs); + fread (t, 1, 3019, fs); + S9xSetCPU (t [2], 0x4200); + CMemory_FillRAM [0x4210] = t [3]; + PPU.IRQVBeamPos = READ_WORD (&t [4]); + PPU.IRQHBeamPos = READ_WORD (&t [2527]); + PPU.Brightness = t [6]; + PPU.ForcedBlanking = t [8] >> 7; + + int i; + for (i = 0; i < 544; i++) + S9xSetPPU (t [0464 + i], 0x2104); + + PPU.OBJNameBase = READ_WORD (&t [9]); + PPU.OBJNameSelect = READ_WORD (&t [13]) - PPU.OBJNameBase; + switch (t [18]) + { + case 4: + if (t [17] == 1) + PPU.OBJSizeSelect = 0; + else + PPU.OBJSizeSelect = 6; + break; + case 16: + if (t [17] == 1) + PPU.OBJSizeSelect = 1; + else + PPU.OBJSizeSelect = 3; + break; + default: + case 64: + if (t [17] == 1) + PPU.OBJSizeSelect = 2; + else + if (t [17] == 4) + PPU.OBJSizeSelect = 4; + else + PPU.OBJSizeSelect = 5; + break; + } + PPU.OAMAddr = READ_WORD (&t [25]); + PPU.SavedOAMAddr = READ_WORD (&t [27]); + PPU.FirstSprite = t [29]; + PPU.BGMode = t [30]; + PPU.BG3Priority = t [31]; + PPU.BG[0].BGSize = (t [32] >> 0) & 1; + PPU.BG[1].BGSize = (t [32] >> 1) & 1; + PPU.BG[2].BGSize = (t [32] >> 2) & 1; + PPU.BG[3].BGSize = (t [32] >> 3) & 1; + PPU.Mosaic = t [33] + 1; + PPU.BGMosaic [0] = (t [34] & 1) != 0; + PPU.BGMosaic [1] = (t [34] & 2) != 0; + PPU.BGMosaic [2] = (t [34] & 4) != 0; + PPU.BGMosaic [3] = (t [34] & 8) != 0; + PPU.BG [0].SCBase = READ_WORD (&t [35]) >> 1; + PPU.BG [1].SCBase = READ_WORD (&t [37]) >> 1; + PPU.BG [2].SCBase = READ_WORD (&t [39]) >> 1; + PPU.BG [3].SCBase = READ_WORD (&t [41]) >> 1; + PPU.BG [0].SCSize = t [67]; + PPU.BG [1].SCSize = t [68]; + PPU.BG [2].SCSize = t [69]; + PPU.BG [3].SCSize = t [70]; + PPU.BG[0].NameBase = READ_WORD (&t [71]) >> 1; + PPU.BG[1].NameBase = READ_WORD (&t [73]) >> 1; + PPU.BG[2].NameBase = READ_WORD (&t [75]) >> 1; + PPU.BG[3].NameBase = READ_WORD (&t [77]) >> 1; + PPU.BG[0].HOffset = READ_WORD (&t [79]); + PPU.BG[1].HOffset = READ_WORD (&t [81]); + PPU.BG[2].HOffset = READ_WORD (&t [83]); + PPU.BG[3].HOffset = READ_WORD (&t [85]); + PPU.BG[0].VOffset = READ_WORD (&t [89]); + PPU.BG[1].VOffset = READ_WORD (&t [91]); + PPU.BG[2].VOffset = READ_WORD (&t [93]); + PPU.BG[3].VOffset = READ_WORD (&t [95]); + PPU.VMA.Increment = READ_WORD (&t [97]) >> 1; + PPU.VMA.High = t [99]; +#ifndef CORRECT_VRAM_READS + IPPU.FirstVRAMRead = t [100]; +#endif + S9xSetPPU (t [2512], 0x2115); + PPU.VMA.Address = READ_DWORD (&t [101]); + for (i = 0; i < 512; i++) + S9xSetPPU (t [1488 + i], 0x2122); + + PPU.CGADD = (uint8) READ_WORD (&t [105]); + CMemory_FillRAM [0x212c] = t [108]; + CMemory_FillRAM [0x212d] = t [109]; + PPU.ScreenHeight = READ_WORD (&t [111]); + CMemory_FillRAM [0x2133] = t [2526]; + CMemory_FillRAM [0x4202] = t [113]; + CMemory_FillRAM [0x4204] = t [114]; + CMemory_FillRAM [0x4205] = t [115]; + CMemory_FillRAM [0x4214] = t [116]; + CMemory_FillRAM [0x4215] = t [117]; + CMemory_FillRAM [0x4216] = t [118]; + CMemory_FillRAM [0x4217] = t [119]; + PPU.VBeamPosLatched = READ_WORD (&t [122]); + PPU.HBeamPosLatched = READ_WORD (&t [120]); + PPU.Window1Left = t [127]; + PPU.Window1Right = t [128]; + PPU.Window2Left = t [129]; + PPU.Window2Right = t [130]; + S9xSetPPU (t [131] | (t [132] << 4), 0x2123); + S9xSetPPU (t [133] | (t [134] << 4), 0x2124); + S9xSetPPU (t [135] | (t [136] << 4), 0x2125); + S9xSetPPU (t [137], 0x212a); + S9xSetPPU (t [138], 0x212b); + S9xSetPPU (t [139], 0x212e); + S9xSetPPU (t [140], 0x212f); + S9xSetPPU (t [141], 0x211a); + PPU.MatrixA = READ_WORD (&t [142]); + PPU.MatrixB = READ_WORD (&t [144]); + PPU.MatrixC = READ_WORD (&t [146]); + PPU.MatrixD = READ_WORD (&t [148]); + PPU.CentreX = READ_WORD (&t [150]); + PPU.CentreY = READ_WORD (&t [152]); + // JoyAPos t[154] + // JoyBPos t[155] + CMemory_FillRAM [0x2134] = t [156]; // Matrix mult + CMemory_FillRAM [0x2135] = t [157]; // Matrix mult + CMemory_FillRAM [0x2136] = t [158]; // Matrix mult + PPU.WRAM = READ_DWORD (&t [161]); + + for (i = 0; i < 128; i++) + S9xSetCPU (t [165 + i], 0x4300 + i); + + if (t [294]) + CPU.IRQActive |= PPU_V_BEAM_IRQ_SOURCE | PPU_H_BEAM_IRQ_SOURCE; + + S9xSetCPU (t [296], 0x420c); + // hdmadata t[297] + 8 * 19 + PPU.FixedColourRed = t [450]; + PPU.FixedColourGreen = t [451]; + PPU.FixedColourBlue = t [452]; + S9xSetPPU (t [454], 0x2130); + S9xSetPPU (t [455], 0x2131); + // vraminctype ... + + fread (CMemory_RAM, 1, 128 * 1024, fs); + fread (CMemory_VRAM, 1, 64 * 1024, fs); + + if (Settings.APUEnabled) + { + // SNES SPC700 RAM (64K) + fread (IAPU.RAM, 1, 64 * 1024, fs); + + // Junk 16 bytes + fread (t, 1, 16, fs); + + // SNES SPC700 state and internal ZSNES SPC700 emulation state + fread (t, 1, 304, fs); + + APURegisters.PC = READ_DWORD (&t [0]); + APURegisters.YA.B.A = t [4]; + APURegisters.X = t [8]; + APURegisters.YA.B.Y = t [12]; + APURegisters.P = t [16]; + APURegisters.S = t [24]; + + APU.Cycles = READ_DWORD (&t [32]); + APU.ShowROM = (IAPU.RAM [0xf1] & 0x80) != 0; + APU.OutPorts [0] = t [36]; + APU.OutPorts [1] = t [37]; + APU.OutPorts [2] = t [38]; + APU.OutPorts [3] = t [39]; + + APU.TimerEnabled [0] = (t [40] & 1) != 0; + APU.TimerEnabled [1] = (t [40] & 2) != 0; + APU.TimerEnabled [2] = (t [40] & 4) != 0; + S9xSetAPUTimer (0xfa, t [41]); + S9xSetAPUTimer (0xfb, t [42]); + S9xSetAPUTimer (0xfc, t [43]); + APU.Timer [0] = t [44]; + APU.Timer [1] = t [45]; + APU.Timer [2] = t [46]; + + memmove (APU.ExtraRAM, &t [48], 64); + + // Internal ZSNES sound DSP state + fread (t, 1, 1068, fs); + + // SNES sound DSP register values + fread (t, 1, 256, fs); + + uint8 saved = IAPU.RAM [0xf2]; + + for (i = 0; i < 128; i++) + { + switch (i) + { + case APU_KON: + case APU_KOFF: + break; + case APU_FLG: + t [i] &= ~APU_SOFT_RESET; + default: + IAPU.RAM [0xf2] = i; + S9xSetAPUDSP (t [i]); + break; + } + } + IAPU.RAM [0xf2] = APU_KON; + S9xSetAPUDSP (t [APU_KON]); + IAPU.RAM [0xf2] = saved; + + S9xSetSoundMute (FALSE); + IAPU.PC = IAPU.RAM + APURegisters.PC; + S9xAPUUnpackStatus (); + if (APUCheckDirectPage ()) + IAPU.DirectPage = IAPU.RAM + 0x100; + else + IAPU.DirectPage = IAPU.RAM; + Settings.APUEnabled = TRUE; + IAPU.APUExecuting = TRUE; + } + else + { + Settings.APUEnabled = FALSE; + IAPU.APUExecuting = FALSE; + S9xSetSoundMute (TRUE); + } + + if (Settings.SuperFX) + { + fread (CMemory_SRAM, 1, 64 * 1024, fs); + fseek (fs, 64 * 1024, SEEK_CUR); + fread (CMemory_FillRAM + 0x7000, 1, 692, fs); + } + if (Settings.SA1) + { + fread (t, 1, 2741, fs); + S9xSetSA1 (t [4], 0x2200); // Control + S9xSetSA1 (t [12], 0x2203); // ResetV low + S9xSetSA1 (t [13], 0x2204); // ResetV hi + S9xSetSA1 (t [14], 0x2205); // NMI low + S9xSetSA1 (t [15], 0x2206); // NMI hi + S9xSetSA1 (t [16], 0x2207); // IRQ low + S9xSetSA1 (t [17], 0x2208); // IRQ hi + S9xSetSA1 (((READ_DWORD (&t [28]) - (4096*1024-0x6000))) >> 13, 0x2224); + S9xSetSA1 (t [36], 0x2201); + S9xSetSA1 (t [41], 0x2209); + + SA1Registers.A.W = READ_DWORD (&t [592]); + SA1Registers.X.W = READ_DWORD (&t [596]); + SA1Registers.Y.W = READ_DWORD (&t [600]); + SA1Registers.D.W = READ_DWORD (&t [604]); + SA1Registers.DB = t [608]; + SA1Registers.PB = t [612]; + SA1Registers.S.W = READ_DWORD (&t [616]); + SA1Registers.PC = READ_DWORD (&t [636]); + SA1Registers.P.W = t [620] | (t [624] << 8); + + memmove (&CMemory_FillRAM [0x3000], t + 692, 2 * 1024); + + fread (CMemory_SRAM, 1, 64 * 1024, fs); + fseek (fs, 64 * 1024, SEEK_CUR); + S9xFixSA1AfterSnapshotLoad (); + } + if(Settings.SPC7110) + { + uint32 temp; + fread(&s7r.bank50, 1,0x10000, fs); + + //NEWSYM SPCMultA, dd 0 4820-23 + fread(&temp, 1, 4, fs); + + s7r.reg4820=temp&(0x0FF); + s7r.reg4821=(temp>>8)&(0x0FF); + s7r.reg4822=(temp>>16)&(0x0FF); + s7r.reg4823=(temp>>24)&(0x0FF); + + //NEWSYM SPCMultB, dd 0 4824-5 + fread(&temp, 1,4,fs); + s7r.reg4824=temp&(0x0FF); + s7r.reg4825=(temp>>8)&(0x0FF); + + + //NEWSYM SPCDivEnd, dd 0 4826-7 + fread(&temp, 1,4,fs); + s7r.reg4826=temp&(0x0FF); + s7r.reg4827=(temp>>8)&(0x0FF); + + //NEWSYM SPCMulRes, dd 0 4828-B + fread(&temp, 1, 4, fs); + + s7r.reg4828=temp&(0x0FF); + s7r.reg4829=(temp>>8)&(0x0FF); + s7r.reg482A=(temp>>16)&(0x0FF); + s7r.reg482B=(temp>>24)&(0x0FF); + + //NEWSYM SPCDivRes, dd 0 482C-D + fread(&temp, 1,4,fs); + s7r.reg482C=temp&(0x0FF); + s7r.reg482D=(temp>>8)&(0x0FF); + + //NEWSYM SPC7110BankA, dd 020100h 4831-3 + fread(&temp, 1, 4, fs); + + s7r.reg4831=temp&(0x0FF); + s7r.reg4832=(temp>>8)&(0x0FF); + s7r.reg4833=(temp>>16)&(0x0FF); + + //NEWSYM SPC7110RTCStat, dd 0 4840,init,command, index + fread(&temp, 1, 4, fs); + + s7r.reg4840=temp&(0x0FF); + +//NEWSYM SPC7110RTC, db 00,00,00,00,00,00,01,00,01,00,00,00,00,00,0Fh,00 +fread(&temp, 1, 4, fs); +if(Settings.SPC7110RTC) +{ + rtc_f9.reg[0]=temp&(0x0FF); + rtc_f9.reg[1]=(temp>>8)&(0x0FF); + rtc_f9.reg[2]=(temp>>16)&(0x0FF); + rtc_f9.reg[3]=(temp>>24)&(0x0FF); +} +fread(&temp, 1, 4, fs); +if(Settings.SPC7110RTC) +{ + rtc_f9.reg[4]=temp&(0x0FF); + rtc_f9.reg[5]=(temp>>8)&(0x0FF); + rtc_f9.reg[6]=(temp>>16)&(0x0FF); + rtc_f9.reg[7]=(temp>>24)&(0x0FF); +} +fread(&temp, 1, 4, fs); +if(Settings.SPC7110RTC) +{ + rtc_f9.reg[8]=temp&(0x0FF); + rtc_f9.reg[9]=(temp>>8)&(0x0FF); + rtc_f9.reg[10]=(temp>>16)&(0x0FF); + rtc_f9.reg[11]=(temp>>24)&(0x0FF); +} +fread(&temp, 1, 4, fs); +if(Settings.SPC7110RTC) +{ + rtc_f9.reg[12]=temp&(0x0FF); + rtc_f9.reg[13]=(temp>>8)&(0x0FF); + rtc_f9.reg[14]=(temp>>16)&(0x0FF); + rtc_f9.reg[15]=(temp>>24)&(0x0FF); +} +//NEWSYM SPC7110RTCB, db 00,00,00,00,00,00,01,00,01,00,00,00,00,01,0Fh,06 +fread(&temp, 1, 4, fs); +fread(&temp, 1, 4, fs); +fread(&temp, 1, 4, fs); +fread(&temp, 1, 4, fs); + +//NEWSYM SPCROMPtr, dd 0 4811-4813 + fread(&temp, 1, 4, fs); + + s7r.reg4811=temp&(0x0FF); + s7r.reg4812=(temp>>8)&(0x0FF); + s7r.reg4813=(temp>>16)&(0x0FF); +//NEWSYM SPCROMtoI, dd SPCROMPtr + fread(&temp, 1, 4, fs); +//NEWSYM SPCROMAdj, dd 0 4814-5 + fread(&temp, 1, 4, fs); + s7r.reg4814=temp&(0x0FF); + s7r.reg4815=(temp>>8)&(0x0FF); +//NEWSYM SPCROMInc, dd 0 4816-7 + fread(&temp, 1, 4, fs); + s7r.reg4816=temp&(0x0FF); + s7r.reg4817=(temp>>8)&(0x0FF); +//NEWSYM SPCROMCom, dd 0 4818 +fread(&temp, 1, 4, fs); + + s7r.reg4818=temp&(0x0FF); +//NEWSYM SPCCompPtr, dd 0 4801-4804 (+b50i) if"manual" + fread(&temp, 1, 4, fs); + + //do table check + + s7r.reg4801=temp&(0x0FF); + s7r.reg4802=(temp>>8)&(0x0FF); + s7r.reg4803=(temp>>16)&(0x0FF); + s7r.reg4804=(temp>>24)&(0x0FF); +///NEWSYM SPCDecmPtr, dd 0 4805-6 +b50i + fread(&temp, 1, 4, fs); + s7r.reg4805=temp&(0x0FF); + s7r.reg4806=(temp>>8)&(0x0FF); +//NEWSYM SPCCompCounter, dd 0 4809-A + fread(&temp, 1, 4, fs); + s7r.reg4809=temp&(0x0FF); + s7r.reg480A=(temp>>8)&(0x0FF); +//NEWSYM SPCCompCommand, dd 0 480B +fread(&temp, 1, 4, fs); + + s7r.reg480B=temp&(0x0FF); +//NEWSYM SPCCheckFix, dd 0 written(if 1, then set writtne to max value!) +fread(&temp, 1, 4, fs); +(temp&(0x0FF))?s7r.written=0x1F:s7r.written=0x00; +//NEWSYM SPCSignedVal, dd 0 482E +fread(&temp, 1, 4, fs); + + s7r.reg482E=temp&(0x0FF); + + } + fclose (fs); + + CMemory_FixROMSpeed (); + IPPU.ColorsChanged = TRUE; + IPPU.OBJChanged = TRUE; + CPU.InDMA = FALSE; + S9xFixColourBrightness (); + IPPU.RenderThisFrame = FALSE; + + S9xFixSoundAfterSnapshotLoad (); + ICPU.ShiftedPB = Registers.PB << 16; + ICPU.ShiftedDB = Registers.DB << 16; + S9xSetPCBase (ICPU.ShiftedPB + Registers.PC); + S9xUnpackStatus (); + S9xFixCycles (); + S9xReschedule (); +#ifdef ZSNES_FX + if (Settings.SuperFX) + S9xSuperFXPostLoadState (); +#endif + return (TRUE); + } + fclose (fs); + return (FALSE); +} +#endif + diff --git a/src/sound.cpp b/src/sound.cpp new file mode 100644 index 0000000..c2f7464 --- /dev/null +++ b/src/sound.cpp @@ -0,0 +1,270 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#define EQ == +#define MINBUFFLEN 10000 + +#include +#include +#include +#include +#include + +#include "snes9x.h" +#include "soundux.h" + +extern SoundStatus so; + +extern int AudioOpen(unsigned long freq, unsigned long bufsize, unsigned long bitrate, unsigned long stereo); +extern void AudioClose(void); + +extern int OpenPrelude(ULONG Type, ULONG DefaultFreq, ULONG MinBuffSize); +extern void ClosePrelude(void); + +extern int SoundSignal; +unsigned long DoubleBuffer; +//extern struct AHISampleInfo Sample0; +//extern struct AHISampleInfo Sample1; +//extern unsigned long BufferSize; + +struct Library *AHIPPCBase; +struct Library *AHIBase; +struct MsgPort *AHImp=NULL; +struct AHIRequest *AHIio=NULL; +BYTE AHIDevice=-1; + +struct AHIData *AHIData; + +unsigned long Frequency = 0; +//unsigned long BufferSize = 0; +unsigned long BitRate = 0; +unsigned long Stereo = 0; +//unsigned long AHIError = 9; + +BYTE InternSignal=-1; + +int mixsamples; +extern int prelude; + +#define REALSIZE (BitRate*Stereo) + +struct AHIAudioModeRequester *req=NULL; +struct AHIAudioCtrl *actrl=NULL; + +ULONG BufferLen=NULL; + + +/* this really should be dynamically allocated... */ +#undef MAX_BUFFER_SIZE +#define MAX_BUFFER_SIZE 65536 +#define MIN_BUFFER_SIZE 65536 + +#define MODE_MONO 0 +#define MODE_STEREO 1 + +#define QUAL_8BIT 8 +#define QUAL_16BIT 16 + + +int test=0; +int test2=0; +/* +int AudioOpen(unsigned long freq, unsigned long minbufsize, unsigned long bitrate, unsigned long stereo) +{ + ULONG Type; + + Frequency = freq; + + so.playback_rate = Frequency; + + if(stereo) so.stereo = TRUE; + else so.stereo = FALSE; + + switch(bitrate) + { + case 8: + so.sixteen_bit = FALSE; + BitRate=1; + if(stereo) + { + Stereo=2; + Type = AHIST_S8S; + } + else + { + Stereo=1; + Type = AHIST_M8S; + } + + break; + + default: //defaulting to 16bit, because it means it won't crash atleast + case QUAL_16BIT: + so.sixteen_bit = TRUE; + BitRate=2; + if(stereo) + { + Stereo=2; + Type = AHIST_S16S; + } + else + { + Stereo=1; + Type = AHIST_M16S; + } + break; + } + + if(prelude) prelude = OpenPrelude(Type, freq, minbufsize); + + + if(prelude) return 1; else printf("Defaulting to AHI...\n"); + + if(AHIData = OpenAHI(1, Type, AHI_INVALID_ID, AHI_DEFAULT_FREQ, 0, minbufsize)) + { + printf("AHI opened\n"); + printf("BuffSize %d\n", AHIData->BufferSize); + } + else + { + printf("AHI failed to open: %d\n", AHIData); + return 0; + } + + so.buffer_size = AHIData->BufferSize; // in bytes + if (so.buffer_size > MAX_BUFFER_SIZE) so.buffer_size = MAX_BUFFER_SIZE; + + AHIBase = AHIData->AHIBase; + actrl = AHIData->AudioCtrl; + Frequency = AHIData->MixingFreq; + + printf("signal %ld\n", AHIData->SoundFuncSignal); + + Wait(AHIData->SoundFuncSignal); + + AHI_SetFreq(0, Frequency, actrl, AHISF_IMM); + + Wait(AHIData->SoundFuncSignal); + + AHI_SetVol(0, 0x10000, 0x8000, actrl, AHISF_IMM); + + mixsamples=AHIData->BufferSamples; + + SoundSignal = AHIData->SoundFuncSignal; + + return 1; +} + +void AudioClose( void ) +{ + if(prelude) ClosePrelude(); + else ;//CloseAHI(AHIData); +} +*/ + + +#include + +extern int main(int argc, char **argv); + +void wbmain(struct WBStartup * argmsg) +{ + char argv[1][]={"WarpSNES"}; + int argc=1; + main(argc,(char **)argv); +} + + diff --git a/src/soundux.cpp b/src/soundux.cpp new file mode 100644 index 0000000..e23e092 --- /dev/null +++ b/src/soundux.cpp @@ -0,0 +1,2267 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include +#include +#include +#include +#include "snes9x.h" +#include "soundux.h" +#include "apu.h" +#include "memmap.h" +#include "cpuexec.h" + +// #define USE_CLIP_SOUND +#define USE_CLIP_RENDER_SOUND + +#ifdef USE_CLIP_SOUND +#define CLIP16(v) \ + if ((v) < -32768) \ + (v) = -32768; \ + else \ + if ((v) > 32767) \ +(v) = 32767 + +#define CLIP8(v) \ + if ((v) < -128) \ + (v) = -128; \ + else \ + if ((v) > 127) \ +(v) = 127 +#else +#define CLIP16(v) +#define CLIP8(v) +#endif + +#ifndef USE_REAL_SOUND_MUL +static unsigned char mul_shift[]={ + 32, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 , 5, 5, 5, 5, 5, + 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, +/* + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 +*/ +}; + +#define snd_val(per1,per2) (mul_shift[((per1)*(per2))>>7]) +#define snd_mul(value,per) ((((int)((value)<<(per))))>>7) +#else +#define snd_val(per1,per2) (((per1)*(per2))>>7) +#define snd_mul(value,per) (((value)*(per))>>7) +#endif + +#ifdef USE_CLIP_RENDER_SOUND +#define CLIP_SND(MBUF,VALUE) { int nnvalue=(VALUE); if ((nnvalue) < -32768) nnvalue = -32768; else if (nnvalue > 32767) nnvalue = 32767; (MBUF)=nnvalue; } +#define CLIP_SNDP(MBUF,VALUE) { int nnvalue = (VALUE); nnvalue += (MBUF); if ((nnvalue) < -32768) nnvalue = -32768; else if (nnvalue > 32767) nnvalue = 32767; (MBUF)=nnvalue; } +#else +#define CLIP_SND(MBUF,VALUE) (MBUF) = (VALUE) ; +#define CLIP_SNDP(MBUF,VALUE) (MBUF) += (VALUE) ; +#endif + +#ifdef USE_ALTDECODE +#if USE_ALTDECODE == 0 || USE_ALTDECODE == 4 +#define ONE_ALTDECODE +#define SINGLE_ALTDECODE +#else +#if USE_ALTDECODE == 1 || USE_ALTDECODE == 5 +#define SINGLE_ALTDECODE +#endif +#endif +#endif + +#ifdef ENABLE_ECHO_SOUND +extern int Echo [24000]; +extern int DummyEchoBuffer [SOUND_BUFFER_SIZE*2]; +extern int EchoBuffer [SOUND_BUFFER_SIZE*2]; +#endif +#ifndef SINGLE_ALTDECODE +extern int MixBuffer [SOUND_BUFFER_SIZE*2]; +#else +static short *MixBuffer; +#endif + +extern int FilterTaps [8]; +extern unsigned long Z; +extern int Loop [16]; + +extern long FilterValues[4][2]; +extern int NoiseFreq [32]; + +#undef ABS +#define ABS(a) ((a) < 0 ? -(a) : (a)) + +#define FIXED_POINT 0x10000UL +#define FIXED_POINT_REMAINDER 0xffffUL +#define FIXED_POINT_SHIFT 16 + +#define VOL_DIV8 0x8000 +#define VOL_DIV16 0x0080 +#define ENVX_SHIFT 24 + +extern "C" void DecodeBlockAsm (int8 *, int16 *, int32 *, int32 *); +extern "C" void DecodeBlockAsm2 (int8 *, int16 *, int32 *, int32 *); + +// F is channel's current frequency and M is the 16-bit modulation waveform +// from the previous channel multiplied by the current envelope volume level. +#define PITCH_MOD(F,M) ((F) * ((((unsigned long) (M)) + 0x800000) >> 16) >> 7) +//#define PITCH_MOD(F,M) ((F) * ((((M) & 0x7fffff) >> 14) + 1) >> 8) + +#define LAST_SAMPLE 0xffffff +#define JUST_PLAYED_LAST_SAMPLE(c) ((c)->sample_pointer >= LAST_SAMPLE) + +static __inline__ uint8 *S9xGetSampleAddress (int sample_number) +{ + uint32 addr = (((APU.DSP[APU_DIR] << 8) + (sample_number << 2)) & 0xffff); + return (IAPU.RAM + addr); +} + +static void S9xAPUSetEndOfSample (Channel *ch) +{ + int i=ch->nchan; + ch->state = SOUND_SILENT; + ch->mode = MODE_NONE; + APU.DSP [APU_ENDX] |= 1 << i; + APU.DSP [APU_KON] &= ~(1 << i); + APU.DSP [APU_KOFF] &= ~(1 << i); + APU.KeyedChannels &= ~(1 << i); +} +#ifdef __DJGPP +END_OF_FUNCTION (S9xAPUSetEndOfSample) +#endif + +#define S9xAPUSetEndX() APU.DSP [APU_ENDX] |= 1 << ch->nchan + +#if 1 +static const int EnvRateSteps [] = +{ + 0, 64, 619, 619, 128, 1, 64, 55, 64, 619 +}; +#else + +static const int64 EnvRateSteps [] = { + 0LL * 0x10000LL * 1000L, + 64LL * 0x10000LL * 1000LL, + 619LL * 0x10000LL * 1000LL , + 619LL * 0x10000LL * 1000LL , + 128LL * 0x10000LL * 1000LL , + 1LL * 0x10000LL * 1000L , + 64LL * 0x10000LL * 1000LL , + 55LL * 0x10000LL * 1000LL, + 64LL * 0x10000LL * 1000LL, + 619LL * 0x10000LL * 1000LL +}; +#endif + + +#define S9xSetEnvRate(_CH_,_RATE_,_DIRECTION_,_TARGET_) \ +{ \ + Channel *_ch_=_CH_; \ + unsigned long _rate_=_RATE_; \ + const int _direction_=_DIRECTION_; \ + const int _target_=_TARGET_; \ + _ch_->envx_target = _target_; \ + if (_rate_ == ~0UL) { \ + _ch_->direction = 0; \ + _rate_ = 0; \ + } else \ + _ch_->direction = _direction_; \ + if (_rate_ == 0 || PLAYBACK_RATE == 0) \ + _ch_->erate = 0; \ + else { \ + _ch_->erate = (unsigned long) (((int64) FIXED_POINT * 1000 * EnvRateSteps [_ch_->state]) / (_rate_ * PLAYBACK_RATE)); \ + } \ +} + +#if 0 + _ch_->erate = (unsigned long) (((int64)EnvRateSteps [_ch_->state]) / (_rate_ * PLAYBACK_RATE)); \ + _ch_->erate = (unsigned long) (EnvRateSteps [_ch_->state] / (_rate_ * PLAYBACK_RATE)); \ + +#endif + +void S9xSetEnvelopeRate (int channel, unsigned long rate, int direction, + int target) +{ + S9xSetEnvRate (&SoundData.channels [channel], rate, direction, target); +} + +#ifdef __DJGPP +END_OF_FUNCTION(S9xSetEnvelopeRate); +#endif + +void S9xSetSoundVolume (int channel, short volume_left, short volume_right) +{ + Channel *ch = &SoundData.channels[channel]; +#ifndef SNES4ALL_STEREO + volume_left = (ABS(volume_right) + ABS(volume_left)) >> 1; +#endif + ch->volume_left =volume_left; + ch->left_vol_level =snd_val(ch->envx,volume_left); +#ifndef SNES4ALL_STEREO + ch->volume_right =volume_right; + ch->right_vol_level =snd_val(ch->envx,volume_right); +#endif +} + +#ifdef ENABLE_MASTER_VOLUMEN +void S9xSetMasterVolume (short volume_left, short volume_right) +{ +#ifndef SNES4ALL_STEREO + volume_left = (ABS (volume_right) + ABS (volume_left)) >> 1; +#endif + SoundData.master_volume_left = volume_left; + SoundData.master_volume_right = volume_right; + SoundData.master_volume [0] = volume_left; + SoundData.master_volume [1] = volume_right; +} +#endif + +#ifdef ENABLE_ECHO_SOUND + +void S9xSetEchoVolume (short volume_left, short volume_right) +{ +#ifndef SNES4ALL_STEREO + volume_left = (ABS (volume_right) + ABS (volume_left)) >> 1; +#endif + SoundData.echo_volume_left = volume_left; + SoundData.echo_volume_right = volume_right; + SoundData.echo_volume [0] = volume_left; + SoundData.echo_volume [1] = volume_right; +} + +void S9xSetEchoEnable (uint8 byte) +{ + SoundData.echo_channel_enable = byte; + if (!SoundData.echo_write_enabled) + byte = 0; + if (byte && !SoundData.echo_enable) + { + memset (Echo, 0, sizeof (Echo)); + memset (Loop, 0, sizeof (Loop)); + } + + SoundData.echo_enable = byte; + for (int i = 0; i < 8; i++) + { + if (byte & (1 << i)) + SoundData.channels [i].echo_buf_ptr = EchoBuffer; + else + SoundData.channels [i].echo_buf_ptr = DummyEchoBuffer; + } +} + +void S9xSetEchoFeedback (int feedback) +{ + CLIP8(feedback); + SoundData.echo_feedback = feedback; +} + +void S9xSetEchoDelay (int delay) +{ + SoundData.echo_buffer_size = (512 * delay * PLAYBACK_RATE) / 32000; + +#ifdef SNES4ALL_STEREO + SoundData.echo_buffer_size <<= 1; +#endif + if (SoundData.echo_buffer_size) + SoundData.echo_ptr %= SoundData.echo_buffer_size; + else + SoundData.echo_ptr = 0; + S9xSetEchoEnable (APU.DSP [APU_EON]); +} + +void S9xSetEchoWriteEnable (uint8 byte) +{ + SoundData.echo_write_enabled = byte; + S9xSetEchoDelay (APU.DSP [APU_EDL] & 15); +} + +#endif + +void S9xSetFrequencyModulationEnable (uint8 byte) +{ + SoundData.pitch_mod = byte & ~1; +} + +void S9xSetSoundKeyOff (int channel) +{ + Channel *ch = &SoundData.channels[channel]; + + if (ch->state != SOUND_SILENT) + { + ch->state = SOUND_RELEASE; + ch->mode = MODE_RELEASE; + S9xSetEnvRate (ch, 8, -1, 0); + } +} + +#if 0 +int S9xGetEnvelopeHeight (int channel) +{ + return (0); +} + +void S9xSetSoundSample (int channel, uint16 sample_number) +{ + register Channel *ch = &SoundData.channels[channel]; + + if (ch->state != SOUND_SILENT && + sample_number != ch->sample_number) + { + int keep = ch->state; + ch->state = SOUND_SILENT; + ch->sample_number = sample_number; + ch->loop = FALSE; + ch->needs_decode = TRUE; + ch->last_block = FALSE; + ch->previous [0] = ch->previous[1] = 0; + uint8 *dir = S9xGetSampleAddress (sample_number); + ch->block_pointer = READ_WORD (dir); + ch->sample_pointer = 0; + ch->state = keep; + } +} +#endif + +void S9xSetSoundFrequency (int channel, int hertz) +{ +#ifdef SNES4ALL_PLAYBACK_RATE + if (so.playback_rate) +#endif + { + if (SoundData.channels[channel].type == SOUND_NOISE) + hertz = NoiseFreq [APU.DSP [APU_FLG] & 0x1f]; + SoundData.channels[channel].frequency = (int) + (((int64) hertz * FIXED_POINT) / PLAYBACK_RATE); + +#ifdef ENABLE_FIX_FREQUENCY + SoundData.channels[channel].frequency = + (unsigned long) ((double) SoundData.channels[channel].frequency * 0.980); +#endif + } +} + +void S9xSetSoundHertz (int channel, int hertz) +{ + SoundData.channels[channel].hertz = hertz; + S9xSetSoundFrequency (channel, hertz); +} + +void S9xSetSoundType (int channel, int type_of_sound) +{ + SoundData.channels[channel].type = type_of_sound; +} + +bool8 S9xSetSoundMute (bool8 mute) +{ + bool8 old = so.mute_sound; + so.mute_sound = mute; + return (old); +} + +void S9xFixSoundAfterSnapshotLoad () +{ +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_write_enabled = !(APU.DSP [APU_FLG] & 0x20); + SoundData.echo_channel_enable = APU.DSP [APU_EON]; + S9xSetEchoDelay (APU.DSP [APU_EDL] & 0xf); + S9xSetEchoFeedback ((signed char) APU.DSP [APU_EFB]); +#endif + + S9xSetFilterCoefficient (0, (signed char) APU.DSP [APU_C0]); + S9xSetFilterCoefficient (1, (signed char) APU.DSP [APU_C1]); + S9xSetFilterCoefficient (2, (signed char) APU.DSP [APU_C2]); + S9xSetFilterCoefficient (3, (signed char) APU.DSP [APU_C3]); + S9xSetFilterCoefficient (4, (signed char) APU.DSP [APU_C4]); + S9xSetFilterCoefficient (5, (signed char) APU.DSP [APU_C5]); + S9xSetFilterCoefficient (6, (signed char) APU.DSP [APU_C6]); + S9xSetFilterCoefficient (7, (signed char) APU.DSP [APU_C7]); + for (int i = 0; i < 8; i++) + { + SoundData.channels[i].needs_decode = TRUE; + S9xSetSoundFrequency (i, SoundData.channels[i].hertz); + SoundData.channels [i].envxx = SoundData.channels [i].envx << ENVX_SHIFT; + SoundData.channels [i].next_sample = 0; +#ifdef ENABLE_INTERPOLATE_SOUND + SoundData.channels [i].interpolate = 0; +#endif + SoundData.channels [i].previous [0] = (int32) SoundData.channels [i].previous16 [0]; + SoundData.channels [i].previous [1] = (int32) SoundData.channels [i].previous16 [1]; + } +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume [0] = SoundData.master_volume_left; + SoundData.master_volume [1] = SoundData.master_volume_right; +#endif +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_volume [0] = SoundData.echo_volume_left; + SoundData.echo_volume [1] = SoundData.echo_volume_right; +#endif + IAPU.Scanline = 0; +} + +void S9xSetFilterCoefficient (int tap, int value) +{ + FilterTaps [tap & 7] = value; + SoundData.no_filter = (FilterTaps [0] == 127 || FilterTaps [0] == 0) && + FilterTaps [1] == 0 && + FilterTaps [2] == 0 && + FilterTaps [3] == 0 && + FilterTaps [4] == 0 && + FilterTaps [5] == 0 && + FilterTaps [6] == 0 && + FilterTaps [7] == 0; +} + +void S9xSetSoundADSR (int channel, int attack_rate, int decay_rate, + int sustain_rate, int sustain_level, int release_rate) +{ + SoundData.channels[channel].attack_rate = attack_rate; + SoundData.channels[channel].decay_rate = decay_rate; + SoundData.channels[channel].sustain_rate = sustain_rate; + SoundData.channels[channel].release_rate = release_rate; + SoundData.channels[channel].sustain_level = sustain_level + 1; + + switch (SoundData.channels[channel].state) + { + case SOUND_ATTACK: + S9xSetEnvelopeRate (channel, attack_rate, 1, 127); + break; + + case SOUND_DECAY: + S9xSetEnvelopeRate (channel, decay_rate, -1, + (MAX_ENVELOPE_HEIGHT * (sustain_level + 1)) >> 3); + break; + case SOUND_SUSTAIN: + S9xSetEnvelopeRate (channel, sustain_rate, -1, 0); + break; + } +} + +void S9xSetEnvelopeHeight (int channel, int level) +{ + Channel *ch = &SoundData.channels[channel]; + + ch->envx = level; + ch->envxx = level << ENVX_SHIFT; + + ch->left_vol_level = snd_val(level,ch->volume_left); +#ifndef SNES4ALL_STEREO + ch->right_vol_level = snd_val(level,ch->volume_right); +#endif + + if (ch->envx == 0 && ch->state != SOUND_SILENT && ch->state != SOUND_GAIN) + { + ch->nchan=channel; + S9xAPUSetEndOfSample (ch); + } +} + + +#ifdef USE_ALTDECODE + +#if USE_ALTDECODE < 3 + +#define DecodeBlock(CH) AltDecodeBlock(CH) +static void AltDecodeBlock (Channel *ch) +{ + if (ch->block_pointer >= 0x10000 - 9) + { + ch->last_block = TRUE; + ch->loop = FALSE; + ch->block = ch->decoded; + memset ((void *) ch->decoded, 0, sizeof (int16) * 16); + return; + } + signed char *compressed = (signed char *) &IAPU.RAM [ch->block_pointer]; + + unsigned char filter = *compressed; + if ((ch->last_block = filter & 1)) + ch->loop = (filter & 2) != 0; + +#ifdef USE_X86_ASM + int16 *raw = ch->block = ch->decoded; + +#if USE_ALTDECODE == 1 + DecodeBlockAsm (compressed, raw, &ch->previous [0], &ch->previous [1]); +#else + DecodeBlockAsm2 (compressed, raw, &ch->previous [0], &ch->previous [1]); +#endif +#else + int32 out; + unsigned char shift; + signed char sample1, sample2; + unsigned int i; + + compressed++; + signed short *raw = ch->block = ch->decoded; + + int32 prev0 = ch->previous [0]; + int32 prev1 = ch->previous [1]; + shift = filter >> 4; + + switch ((filter >> 2) & 3) + { + case 0: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + sample2 >>= 4; + sample1 >>= 4; + *raw++ = ((int32) sample1 << shift); + *raw++ = ((int32) sample2 << shift); + } + prev1 = *(raw - 2); + prev0 = *(raw - 1); + break; + case 1: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + sample2 >>= 4; + sample1 >>= 4; + prev0 = (int16) prev0; + *raw++ = prev1 = ((int32) sample1 << shift) + prev0 - (prev0 >> 4); + prev1 = (int16) prev1; + *raw++ = prev0 = ((int32) sample2 << shift) + prev1 - (prev1 >> 4); + } + break; + case 2: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + sample2 >>= 4; + sample1 >>= 4; + + out = (sample1 << shift) - prev1 + (prev1 >> 4); + prev1 = (int16) prev0; + prev0 &= ~3; + *raw++ = prev0 = out + (prev0 << 1) - (prev0 >> 5) - + (prev0 >> 4); + + out = (sample2 << shift) - prev1 + (prev1 >> 4); + prev1 = (int16) prev0; + prev0 &= ~3; + *raw++ = prev0 = out + (prev0 << 1) - (prev0 >> 5) - + (prev0 >> 4); + } + break; + case 3: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + sample2 >>= 4; + sample1 >>= 4; + out = (sample1 << shift); + + out = out - prev1 + (prev1 >> 3) + (prev1 >> 4); + prev1 = (int16) prev0; + prev0 &= ~3; + *raw++ = prev0 = out + (prev0 << 1) - (prev0 >> 3) - + (prev0 >> 4) - (prev1 >> 6); + + out = (sample2 << shift); + out = out - prev1 + (prev1 >> 3) + (prev1 >> 4); + prev1 = (int16) prev0; + prev0 &= ~3; + *raw++ = prev0 = out + (prev0 << 1) - (prev0 >> 3) - + (prev0 >> 4) - (prev1 >> 6); + } + break; + } + ch->previous [0] = prev0; + ch->previous [1] = prev1; +#endif + + ch->block_pointer += 9; +} + +#else + +#define DecodeBlock(CH) AltDecodeBlock2(CH) +static void AltDecodeBlock2 (Channel *ch) +{ + int32 out; + unsigned char filter; + unsigned char shift; + signed char sample1, sample2; + unsigned char i; + + if (ch->block_pointer > 0x10000 - 9) + { + ch->last_block = TRUE; + ch->loop = FALSE; + ch->block = ch->decoded; + memset ((void *) ch->decoded, 0, sizeof (int16) * 16); + return; + } + + signed char *compressed = (signed char *) &IAPU.RAM [ch->block_pointer]; + + filter = *compressed; + if ((ch->last_block = filter & 1)) + ch->loop = (filter & 2) != 0; + + compressed++; + signed short *raw = ch->block = ch->decoded; + + shift = filter >> 4; + int32 prev0 = ch->previous [0]; + int32 prev1 = ch->previous [1]; + + if(shift > 12) + shift -= 4; + + switch ((filter >> 2) & 3) + { + case 0: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + //Sample 2 = Bottom Nibble, Sign Extended. + sample2 >>= 4; + //Sample 1 = Top Nibble, shifted down and Sign Extended. + sample1 >>= 4; + + out = (int32)(sample1 << shift); + + prev1 = prev0; + prev0 = out; + CLIP16(out); + *raw++ = (int16)out; + + out = (int32)(sample2 << shift); + + prev1 = prev0; + prev0 = out; + CLIP16(out); + *raw++ = (int16)out; + } + break; + case 1: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + //Sample 2 = Bottom Nibble, Sign Extended. + sample2 >>= 4; + //Sample 1 = Top Nibble, shifted down and Sign Extended. + sample1 >>= 4; + out = (int32)(sample1 << shift); + out += (int32)((double)prev0 * 15/16); + + prev1 = prev0; + prev0 = out; + CLIP16(out); + *raw++ = (int16)out; + + out = (int32)(sample2 << shift); + out += (int32)((double)prev0 * 15/16); + + prev1 = prev0; + prev0 = out; + CLIP16(out); + *raw++ = (int16)out; + } + break; + case 2: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + //Sample 2 = Bottom Nibble, Sign Extended. + sample2 >>= 4; + //Sample 1 = Top Nibble, shifted down and Sign Extended. + sample1 >>= 4; + + out = ((sample1 << shift) * 256 + (prev0 & ~0x2) * 488 - prev1 * 240) >> 8; + + prev1 = prev0; + prev0 = (int16)out; + *raw++ = (int16)out; + + out = ((sample2 << shift) * 256 + (prev0 & ~0x2) * 488 - prev1 * 240) >> 8; + + prev1 = prev0; + prev0 = (int16)out; + *raw++ = (int16)out; + } + break; + + case 3: + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + //Sample 2 = Bottom Nibble, Sign Extended. + sample2 >>= 4; + //Sample 1 = Top Nibble, shifted down and Sign Extended. + sample1 >>= 4; + out = (int32)(sample1 << shift); + out += (int32)((double)prev0 * 115/64 - (double)prev1 * 13/16); + + prev1 = prev0; + prev0 = out; + + CLIP16(out); + *raw++ = (int16)out; + + out = (int32)(sample2 << shift); + out += (int32)((double)prev0 * 115/64 - (double)prev1 * 13/16); + + prev1 = prev0; + prev0 = out; + + CLIP16(out); + *raw++ = (int16)out; + } + break; + } + ch->previous [0] = prev0; + ch->previous [1] = prev1; + ch->block_pointer += 9; +} +#endif + +#endif + + +// MIRAR: POSIBLEMENTE SE PUEDE OPTIMIZAR CON ASSEMBLER + +#ifndef USE_ALTDECODE +void DecodeBlock (Channel *ch) +{ + int32 out; + unsigned char filter; + unsigned char shift; + signed char sample1, sample2; + unsigned char i; + bool invalid_header; + + if (ch->block_pointer > 0x10000 - 9) + { + ch->last_block = TRUE; + ch->loop = FALSE; + ch->block = ch->decoded; + return; + } + signed char *compressed = (signed char *) &IAPU.RAM [ch->block_pointer]; + + filter = *compressed; + if ((ch->last_block = filter & 1)) + ch->loop = (filter & 2) != 0; + + compressed++; + signed short *raw = ch->block = ch->decoded; + + // Seperate out the header parts used for decoding + + shift = filter >> 4; + + // Header validity check: if range(shift) is over 12, ignore + // all bits of the data for that block except for the sign bit of each + invalid_header = !(shift < 0xD); + + filter = filter&0x0c; + + int32 prev0 = ch->previous [0]; + int32 prev1 = ch->previous [1]; + + for (i = 8; i != 0; i--) + { + sample1 = *compressed++; + sample2 = sample1 << 4; + //Sample 2 = Bottom Nibble, Sign Extended. + sample2 >>= 4; + //Sample 1 = Top Nibble, shifted down and Sign Extended. + sample1 >>= 4; + if (invalid_header) { sample1>>=3; sample2>>=3; } + + for (int nybblesmp = 0; nybblesmp<2; nybblesmp++){ + out=(((nybblesmp) ? sample2 : sample1) << shift); + out >>= 1; + + switch(filter) + { + case 0x00: + // Method0 - [Smp] + break; + + case 0x04: + // Method1 - [Delta]+[Smp-1](15/16) + out+=(prev0>>1)+((-prev0)>>5); + break; + + case 0x08: + // Method2 - [Delta]+[Smp-1](61/32)-[Smp-2](15/16) + out+=(prev0)+((-(prev0 +(prev0>>1)))>>5)-(prev1>>1)+(prev1>>5); + break; + + default: + // Method3 - [Delta]+[Smp-1](115/64)-[Smp-2](13/16) + out+=(prev0)+((-(prev0 + (prev0<<2) + (prev0<<3)))>>7)-(prev1>>1)+((prev1+(prev1>>1))>>4); + break; + + } + CLIP16(out); + *raw++ = (signed short)(out<<1); + prev1=(signed short)prev0; + prev0=(signed short)(out<<1); + } + } + ch->previous [0] = prev0; + ch->previous [1] = prev1; + + ch->block_pointer += 9; +} +#endif + +#ifdef SNES4ALL_STEREO + +static int wave[SOUND_BUFFER_SIZE]; + +static void MixStereo (int sample_count) +{ + + int pitch_mod = SoundData.pitch_mod & ~APU.DSP[APU_NON]; + + for (uint32 J = 0; J < NUM_CHANNELS; J++) + { + int32 VL, VR; + Channel *ch = &SoundData.channels[J]; + unsigned long freq0 = ch->frequency; + + if (ch->state == SOUND_SILENT +#ifdef SNES4ALL_SOUND_SWITCH + || !(so.sound_switch & (1 << J)) +#endif + ) + continue; + + freq0 = (unsigned long) ((double) freq0 * 0.985);//uncommented by jonathan gevaryahu, as it is necessary for most cards in linux + + bool8 mod = pitch_mod & (1 << J); + + ch->nchan=J; + if (ch->needs_decode) + { + DecodeBlock(ch); + ch->needs_decode = FALSE; + ch->sample = ch->block[0]; + ch->sample_pointer = freq0 >> FIXED_POINT_SHIFT; + if (ch->sample_pointer == 0) + ch->sample_pointer = 1; + if (ch->sample_pointer > SOUND_DECODE_LENGTH) + ch->sample_pointer = SOUND_DECODE_LENGTH - 1; + + ch->next_sample=ch->block[ch->sample_pointer]; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; + + if (freq0 < FIXED_POINT && !mod) + ch->interpolate = ((ch->next_sample - ch->sample) * + (long) freq0) / (long) FIXED_POINT; +#endif + } + VL = snd_mul(ch->sample,ch->left_vol_level); + VR = snd_mul(ch->sample,ch->right_vol_level); + + + int *mbuf=(int *)&MixBuffer[0]; +#ifdef ENABLE_ECHO_SOUND + int *ebuf=(int *)&ch->echo_buf_ptr[0]; +#endif + uint32 Imax=((uint32)sample_count)>>1; + + for (uint32 I = 0; I < Imax; I++) + { + unsigned long freq = freq0; + + if (mod) + freq = PITCH_MOD(freq, wave [I]); + + ch->env_error += ch->erate; + if (ch->env_error >= FIXED_POINT) + { + uint32 step = ch->env_error >> FIXED_POINT_SHIFT; + + switch (ch->state) + { + case SOUND_ATTACK: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_DECAY; + if (ch->sustain_level != 8) + { + S9xSetEnvRate (ch, ch->decay_rate, -1, + (MAX_ENVELOPE_HEIGHT * ch->sustain_level) + >> 3); + break; + } + ch->state = SOUND_SUSTAIN; + S9xSetEnvRate (ch, ch->sustain_rate, -1, 0); + } + break; + + case SOUND_DECAY: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= ch->envx_target) + { + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + ch->state = SOUND_SUSTAIN; + S9xSetEnvRate (ch, ch->sustain_rate, -1, 0); + } + break; + + case SOUND_SUSTAIN: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + break; + + case SOUND_RELEASE: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx -= (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) >> 8; // / 256; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + break; + + case SOUND_INCREASE_LINEAR: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_GAIN; + ch->mode = MODE_GAIN; + S9xSetEnvRate (ch, 0, -1, 0); + } + break; + + case SOUND_INCREASE_BENT_LINE: + if (ch->envx >= (MAX_ENVELOPE_HEIGHT * 3) >> 2) + { + while (ch->env_error >= FIXED_POINT) + { + ch->envxx += (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) >> 8; // / 256; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + } + else + { + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + } + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_GAIN; + ch->mode = MODE_GAIN; + S9xSetEnvRate (ch, 0, -1, 0); + } + break; + + case SOUND_DECREASE_LINEAR: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx -= step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + break; + + case SOUND_DECREASE_EXPONENTIAL: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + break; + + case SOUND_GAIN: + S9xSetEnvRate (ch, 0, -1, 0); + break; + } + ch-> left_vol_level = snd_val(ch->envx,ch->volume_left); + ch->right_vol_level = snd_val(ch->envx,ch->volume_right); + VL = snd_mul(ch->sample,ch-> left_vol_level); + VR = snd_mul(ch->sample,ch->right_vol_level); + } + + ch->count += freq; + if (ch->count >= FIXED_POINT) + { + VL = ch->count >> FIXED_POINT_SHIFT; + ch->sample_pointer += VL; + ch->count &= FIXED_POINT_REMAINDER; + + ch->sample = ch->next_sample; + if (ch->sample_pointer >= SOUND_DECODE_LENGTH) + { + if (JUST_PLAYED_LAST_SAMPLE(ch)) + { + S9xAPUSetEndOfSample (ch); + goto stereo_exit; + } + do + { + ch->sample_pointer -= SOUND_DECODE_LENGTH; + if (ch->last_block) + { + if (!ch->loop) + { + ch->sample_pointer = LAST_SAMPLE; + ch->next_sample = ch->sample; + break; + } + else + { + S9xAPUSetEndX(); + ch->last_block = FALSE; + uint8 *dir = S9xGetSampleAddress (ch->sample_number); + ch->block_pointer = READ_WORD(dir + 2); + } + } + DecodeBlock (ch); + } while (ch->sample_pointer >= SOUND_DECODE_LENGTH); + if (!JUST_PLAYED_LAST_SAMPLE (ch)) + ch->next_sample = ch->block [ch->sample_pointer]; + } + else + ch->next_sample = ch->block [ch->sample_pointer]; + + if (ch->type == SOUND_SAMPLE) + { +#ifdef ENABLE_INTERPOLATE_SOUND + if (freq < FIXED_POINT && !mod) + { + ch->interpolate = ((ch->next_sample - ch->sample) * + (long) freq) / (long) FIXED_POINT; + ch->sample = (int16) (ch->sample + (((ch->next_sample - ch->sample) * + (long) (ch->count)) / (long) FIXED_POINT)); + } + else + ch->interpolate = 0; +#endif + } + else + { + for (;VL > 0; VL--) + if ((so.noise_gen <<= 1) & 0x80000000L) + so.noise_gen ^= 0x0040001L; + ch->sample = (so.noise_gen << 17) >> 17; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; +#endif + } + + VL = snd_mul(ch->sample,ch-> left_vol_level); + VR = snd_mul(ch->sample,ch->right_vol_level); + } +#ifdef ENABLE_INTERPOLATE_SOUND + else + { + if (ch->interpolate) + { + int32 s = (int32) ch->sample + ch->interpolate; + + CLIP16(s); + ch->sample = (int16) s; + VL = snd_mul(ch->sample,ch-> left_vol_level); + VR = snd_mul(ch->sample,ch->right_vol_level); + } + } +#endif + + if (pitch_mod & (1 << (J + 1))) + wave [I] = ch->sample * ch->envx; + + *mbuf++ += VL; + *mbuf++ += VR; + +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += VL; + *ebuf++ += VR; +#endif + } +stereo_exit: ; + } +} + +#ifdef __DJGPP +END_OF_FUNCTION(MixStereo); +#endif + +#else + +static int wave[SOUND_BUFFER_SIZE]; + +#ifdef ENABLE_INTERPOLATE_SOUND +static void MixMono_loop (Channel *ch, bool8 mod){ +#else +static void MixMono_loop (Channel *ch){ +#endif + ch->env_error += ch->erate; + if (ch->env_error >= FIXED_POINT) + { + uint32 step = ch->env_error >> FIXED_POINT_SHIFT; + + switch (ch->state) + { + case SOUND_ATTACK: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_DECAY; + if (ch->sustain_level != 8) + { + S9xSetEnvRate (ch, ch->decay_rate, -1, + (MAX_ENVELOPE_HEIGHT * ch->sustain_level) + >> 3); + break; + } + ch->state = SOUND_SUSTAIN; + S9xSetEnvRate (ch, ch->sustain_rate, -1, 0); + } + break; + + case SOUND_DECAY: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= ch->envx_target) + { + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + ch->state = SOUND_SUSTAIN; + S9xSetEnvRate (ch, ch->sustain_rate, -1, 0); + } + break; + + case SOUND_SUSTAIN: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + break; + + case SOUND_RELEASE: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx -= (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) >> 8; // / 256; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + break; + + case SOUND_INCREASE_LINEAR: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_GAIN; + ch->mode = MODE_GAIN; + S9xSetEnvRate (ch, 0, -1, 0); + } + break; + + case SOUND_INCREASE_BENT_LINE: + if (ch->envx >= (MAX_ENVELOPE_HEIGHT * 3) >> 2) + { + while (ch->env_error >= FIXED_POINT) + { + ch->envxx += (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) >> 8; // / 256; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + } + else + { + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx += step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + } + + if (ch->envx >= 126) + { + ch->envx = 127; + ch->envxx = 127 << ENVX_SHIFT; + ch->state = SOUND_GAIN; + ch->mode = MODE_GAIN; + S9xSetEnvRate (ch, 0, -1, 0); + } + break; + + case SOUND_DECREASE_LINEAR: + ch->env_error &= FIXED_POINT_REMAINDER; + ch->envx -= step << 1; + ch->envxx = ch->envx << ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + break; + + case SOUND_DECREASE_EXPONENTIAL: + while (ch->env_error >= FIXED_POINT) + { + ch->envxx = (ch->envxx >> 8) * 255; + ch->env_error -= FIXED_POINT; + } + ch->envx = ch->envxx >> ENVX_SHIFT; + if (ch->envx <= 0) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + break; + + case SOUND_GAIN: + S9xSetEnvRate (ch, 0, -1, 0); + break; + } + ch->left_vol_level = snd_val(ch->envx,ch->volume_left); + ch->current = snd_mul(ch->sample,ch->left_vol_level); + } + + ch->count += ch->freq; + if (ch->count >= FIXED_POINT) + { + ch->current = ch->count >> FIXED_POINT_SHIFT; + ch->sample_pointer += ch->current; + ch->count &= FIXED_POINT_REMAINDER; + + ch->sample = ch->next_sample; + if (ch->sample_pointer >= SOUND_DECODE_LENGTH) + { + if (JUST_PLAYED_LAST_SAMPLE(ch)) + { + S9xAPUSetEndOfSample (ch); + ch->Imax=0; + goto mono_exit; + } + do + { + ch->sample_pointer -= SOUND_DECODE_LENGTH; + if (ch->last_block) + { + if (!ch->loop) + { + ch->sample_pointer = LAST_SAMPLE; + ch->next_sample = ch->sample; + break; + } + else + { + ch->last_block = FALSE; + uint8 *dir = S9xGetSampleAddress (ch->sample_number); + ch->block_pointer = READ_WORD(dir + 2); + S9xAPUSetEndX(); + } + } + DecodeBlock (ch); + } while (ch->sample_pointer >= SOUND_DECODE_LENGTH); + if (!JUST_PLAYED_LAST_SAMPLE (ch)) + ch->next_sample = ch->block [ch->sample_pointer]; + } + else + ch->next_sample = ch->block [ch->sample_pointer]; + + if (ch->type == SOUND_SAMPLE) + { +#ifdef ENABLE_INTERPOLATE_SOUND + if (ch->freq < FIXED_POINT && !mod) + { + ch->interpolate = ((ch->next_sample - ch->sample) * + (long) ch->freq) / (long) FIXED_POINT; + ch->sample = (int16) (ch->sample + (((ch->next_sample - ch->sample) * + (long) (ch->count)) / (long) FIXED_POINT)); + } + else + ch->interpolate = 0; +#endif + } + else + { + for (;ch->current > 0; ch->current--) + if ((so.noise_gen <<= 1) & 0x80000000L) + so.noise_gen ^= 0x0040001L; + ch->sample = (so.noise_gen << 17) >> 17; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; +#endif + } + ch->current = snd_mul(ch->sample,ch-> left_vol_level); + } +#ifdef ENABLE_INTERPOLATE_SOUND + else + { + if (ch->interpolate) + { + int32 s = (int32) ch->sample + ch->interpolate; + + CLIP16(s); + ch->sample = (int16) s; + ch->current = snd_mul(ch->sample,ch-> left_vol_level); + } + } +#endif +mono_exit: ; +} + +static void MixMono (int sample_count) +{ + + int pitch_mod = SoundData.pitch_mod & (~APU.DSP[APU_NON]); + +#ifdef ONE_ALTDECODE + if (SoundData.channels[0].state != SOUND_SILENT +#ifdef SNES4ALL_SOUND_SWITCH + && (so.sound_switch & (1 << 0)) +#endif + ) + { + Channel *ch = &SoundData.channels[0]; + unsigned long freq0 = ch->frequency; + bool8 mod = pitch_mod & (1 << 0); + bool8 next_mod = pitch_mod & (1 << (0 + 1)); + + if (ch->needs_decode) + { + DecodeBlock(ch); + ch->needs_decode = FALSE; + ch->sample = ch->block[0]; + ch->sample_pointer = freq0 >> FIXED_POINT_SHIFT; + if (ch->sample_pointer == 0) + ch->sample_pointer = 1; + if (ch->sample_pointer > SOUND_DECODE_LENGTH) + ch->sample_pointer = SOUND_DECODE_LENGTH - 1; + ch->next_sample = ch->block[ch->sample_pointer]; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; + + if (freq0 < FIXED_POINT && !mod) + ch->interpolate = ((ch->next_sample - ch->sample) * + (long) freq0) / (long) FIXED_POINT; +#endif + } + ch->current = snd_mul(ch->sample,ch->left_vol_level); + + short *mbuf=(short *)&MixBuffer[0]; +#ifdef ENABLE_ECHO_SOUND + int *ebuf=(int *)&ch->echo_buf_ptr[0]; +#endif + ch->nchan=0; + ch->Imax=((uint32)sample_count); + + if (mod) { + if (!next_mod) { + for (uint32 I = 0; I < ch->Imax; I++) { + ch->freq = PITCH_MOD(freq0, wave [I]); +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,1); +#else + MixMono_loop(ch); +#endif + CLIP_SND(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + } + } else { + for (uint32 I = 0; I < ch->Imax; I++) { + ch->freq = PITCH_MOD(freq0, wave [I]); +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,1); +#else + MixMono_loop(ch); +#endif + CLIP_SND(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + wave [I] = ch->sample * ch->envx; + } + } + } else { + ch->freq = freq0; + if (!next_mod) { + for (uint32 I = 0; I < ch->Imax; I++) { +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,0); +#else + MixMono_loop(ch); +#endif + CLIP_SND(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + + } + } else { + for (uint32 I = 0; I < ch->Imax; I++) { +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,0); +#else + MixMono_loop(ch); +#endif + CLIP_SND(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + wave [I] = ch->sample * ch->envx; + + } + } + } + for(int need=ch->Imax;needfrequency; + + if (ch->state == SOUND_SILENT +#ifdef SNES4ALL_SOUND_SWITCH + || !(so.sound_switch & (1 << J)) +#endif + ) + continue; + + // freq0 = (unsigned long) ((double) freq0 * 0.985); + + bool8 mod = pitch_mod & (1 << J); + bool8 next_mod = pitch_mod & (1 << (J + 1)); + + if (ch->needs_decode) + { + DecodeBlock(ch); + ch->needs_decode = FALSE; + ch->sample = ch->block[0]; + ch->sample_pointer = freq0 >> FIXED_POINT_SHIFT; + if (ch->sample_pointer == 0) + ch->sample_pointer = 1; + if (ch->sample_pointer > SOUND_DECODE_LENGTH) + ch->sample_pointer = SOUND_DECODE_LENGTH - 1; + ch->next_sample = ch->block[ch->sample_pointer]; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; + + if (freq0 < FIXED_POINT && !mod) + ch->interpolate = ((ch->next_sample - ch->sample) * + (long) freq0) / (long) FIXED_POINT; +#endif + } + ch->current = snd_mul(ch->sample,ch->left_vol_level); + +#ifdef SINGLE_ALTDECODE + short *mbuf=(short *)&MixBuffer[0]; +#else + int *mbuf=(int *)&MixBuffer[0]; +#endif +#ifdef ENABLE_ECHO_SOUND + int *ebuf=(int *)&ch->echo_buf_ptr[0]; +#endif + ch->nchan=J; + ch->Imax=((uint32)sample_count); + + if (mod) { + if (!next_mod) { + for (uint32 I = 0; I < ch->Imax; I++) { + ch->freq = PITCH_MOD(freq0, wave [I]); +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,1); +#else + MixMono_loop(ch); +#endif + CLIP_SNDP(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + } + } else { + for (uint32 I = 0; I < ch->Imax; I++) { + ch->freq = PITCH_MOD(freq0, wave [I]); +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,1); +#else + MixMono_loop(ch); +#endif + CLIP_SNDP(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + wave [I] = ch->sample * ch->envx; + } + } + } else { + ch->freq = freq0; + if (!next_mod) { + for (uint32 I = 0; I < ch->Imax; I++) { +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,0); +#else + MixMono_loop(ch); +#endif + CLIP_SNDP(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + + } + } else { + for (uint32 I = 0; I < ch->Imax; I++) { +#ifdef ENABLE_INTERPOLATE_SOUND + MixMono_loop(ch,0); +#else + MixMono_loop(ch); +#endif + CLIP_SNDP(*mbuf,ch->current) mbuf++; +#ifdef ENABLE_ECHO_SOUND + *ebuf++ += ch->current; +#endif + wave [I] = ch->sample * ch->envx; + + } + } + } + } +} +#ifdef __DJGPP +END_OF_FUNCTION(MixMono); +#endif + +#endif + +#ifdef __sun +extern uint8 int2ulaw (int); +#endif + +#ifdef USE_MIXSMAPLES0 +// For backwards compatibility with older port specific code +void S9xMixSamplesO (uint8 *buffer, int sample_count, int byte_offset) +{ + S9xMixSamples (buffer+byte_offset, sample_count); +} +#endif +#ifdef __DJGPP +END_OF_FUNCTION(S9xMixSamplesO); +#endif + +void S9xMixSamples (uint8 *buffer, int sample_count) +{ + int J; + int I; + + if (!so.mute_sound) + { +#ifdef SINGLE_ALTDECODE + MixBuffer=(short *)buffer; +#endif +#ifndef ONE_ALTDECODE + bzero(MixBuffer, sample_count * sizeof (MixBuffer [0])); +#endif +#ifdef ENABLE_ECHO_SOUND + if (SoundData.echo_enable) + bzero(EchoBuffer, sample_count * sizeof (EchoBuffer [0])); +#endif + +#ifdef SNES4ALL_STEREO + MixStereo (sample_count); +#else + MixMono (sample_count); +#endif + } + + /* Mix and convert waveforms */ + { + int byte_count = sample_count << 1; + + // 16-bit sound + if (so.mute_sound) + { + bzero(buffer, byte_count); + } + else + { +#ifdef ENABLE_ECHO_SOUND + if (SoundData.echo_enable && SoundData.echo_buffer_size) + { +#ifdef SNES4ALL_STEREO + // 16-bit stereo sound with echo enabled ... + if (SoundData.no_filter) + { + // ... but no filter defined. + for (J = 0; J < sample_count; J++) + { + int E = Echo [SoundData.echo_ptr]; + + Echo [SoundData.echo_ptr] = (E * SoundData.echo_feedback) / 128 + + EchoBuffer [J]; + + if ((SoundData.echo_ptr += 1) >= SoundData.echo_buffer_size) + SoundData.echo_ptr = 0; + + I = (MixBuffer [J] * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume [J & 1] + +#else + 127 + +#endif + E * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.echo_volume [J & 1] +#else + 127 +#endif + ) / VOL_DIV16; + + CLIP16(I); + ((signed short *) buffer)[J] = I; + } + } + else + { + // ... with filter defined. + for (J = 0; J < sample_count; J++) + { + int E = Echo [SoundData.echo_ptr]; + + Loop [(Z - 0) & 15] = E; + E = E * FilterTaps [0]; + E += Loop [(Z - 2) & 15] * FilterTaps [1]; + E += Loop [(Z - 4) & 15] * FilterTaps [2]; + E += Loop [(Z - 6) & 15] * FilterTaps [3]; + E += Loop [(Z - 8) & 15] * FilterTaps [4]; + E += Loop [(Z - 10) & 15] * FilterTaps [5]; + E += Loop [(Z - 12) & 15] * FilterTaps [6]; + E += Loop [(Z - 14) & 15] * FilterTaps [7]; + E /= 128; + Z++; + + Echo [SoundData.echo_ptr] = (E * SoundData.echo_feedback) / 128 + + EchoBuffer [J]; + + if ((SoundData.echo_ptr += 1) >= SoundData.echo_buffer_size) + SoundData.echo_ptr = 0; + + I = (MixBuffer [J] * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume [J & 1] + +#else + 127 + +#endif + E * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.echo_volume [J & 1] +#else + 127 +#endif + ) / VOL_DIV16; + + CLIP16(I); + ((signed short *) buffer)[J] = I; + } + } +#else + // 16-bit mono sound with echo enabled... + if (SoundData.no_filter) + { + // ... no filter defined + for (J = 0; J < sample_count; J++) + { + int E = Echo [SoundData.echo_ptr]; + + Echo [SoundData.echo_ptr] = (E * SoundData.echo_feedback) / 128 + + EchoBuffer [J]; + + if ((SoundData.echo_ptr += 1) >= SoundData.echo_buffer_size) + SoundData.echo_ptr = 0; + + I = (MixBuffer [J] * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume [0] + +#else + 127 + +#endif + E * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.echo_volume [0] +#else + 127 +#endif + ) / VOL_DIV16; + CLIP16(I); + ((signed short *) buffer)[J] = I; + } + } + else + { + // ... with filter defined + for (J = 0; J < sample_count; J++) + { + int E = Echo [SoundData.echo_ptr]; + + Loop [(Z - 0) & 7] = E; + E = E * FilterTaps [0]; + E += Loop [(Z - 1) & 7] * FilterTaps [1]; + E += Loop [(Z - 2) & 7] * FilterTaps [2]; + E += Loop [(Z - 3) & 7] * FilterTaps [3]; + E += Loop [(Z - 4) & 7] * FilterTaps [4]; + E += Loop [(Z - 5) & 7] * FilterTaps [5]; + E += Loop [(Z - 6) & 7] * FilterTaps [6]; + E += Loop [(Z - 7) & 7] * FilterTaps [7]; + E /= 128; + Z++; + + Echo [SoundData.echo_ptr] = (E * SoundData.echo_feedback) / 128 + + EchoBuffer [J]; + + if ((SoundData.echo_ptr += 1) >= SoundData.echo_buffer_size) + SoundData.echo_ptr = 0; + + I = (MixBuffer [J] * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume [0] + +#else + 127 + +#endif + E * +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.echo_volume [0] +#else + 127 +#endif + ) / VOL_DIV16; + CLIP16(I); + ((signed short *) buffer)[J] = I; + } + } +#endif + } + else +#endif +#ifdef SINGLE_ALTDECODE + ; +#else + { + register int ind; + register int max=sample_count; + register int *src=(int *)MixBuffer; + register short *dst=(short *)buffer; + // 16-bit mono or stereo sound, no echo + for (ind = 0; ind < max; ind++) + { +#ifdef ENABLE_MASTER_VOLUMEN + register int dat = ((*src++) * + SoundData.master_volume [ind & 1]) / VOL_DIV16; +#else + register int dat=*src++; + CLIP16(dat); + *dst++=dat; +#endif + } + } +#endif + } + } +} + +#ifdef __DJGPP +END_OF_FUNCTION(S9xMixSamples); +#endif + +void S9xResetSound (bool8 full) +{ + for (int i = 0; i < 8; i++) + { + SoundData.channels[i].state = SOUND_SILENT; + SoundData.channels[i].mode = MODE_NONE; + SoundData.channels[i].type = SOUND_SAMPLE; + SoundData.channels[i].volume_left = 0; + SoundData.channels[i].volume_right = 0; + SoundData.channels[i].hertz = 0; + SoundData.channels[i].count = 0; + SoundData.channels[i].loop = FALSE; + SoundData.channels[i].envx_target = 0; + SoundData.channels[i].env_error = 0; + SoundData.channels[i].erate = 0; + SoundData.channels[i].envx = 0; + SoundData.channels[i].envxx = 0; +#ifdef USE_REAL_SOUND_MUL + SoundData.channels[i].left_vol_level = 0; + SoundData.channels[i].right_vol_level = 0; +#else + SoundData.channels[i].left_vol_level = 32; + SoundData.channels[i].right_vol_level = 32; +#endif + SoundData.channels[i].direction = 0; + SoundData.channels[i].attack_rate = 0; + SoundData.channels[i].decay_rate = 0; + SoundData.channels[i].sustain_rate = 0; + SoundData.channels[i].release_rate = 0; + SoundData.channels[i].sustain_level = 0; +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_ptr = 0; + SoundData.echo_feedback = 0; + SoundData.echo_buffer_size = 1; +#endif + } + FilterTaps [0] = 127; + FilterTaps [1] = 0; + FilterTaps [2] = 0; + FilterTaps [3] = 0; + FilterTaps [4] = 0; + FilterTaps [5] = 0; + FilterTaps [6] = 0; + FilterTaps [7] = 0; + so.mute_sound = TRUE; + so.noise_gen = 1; +#ifdef SNES4ALL_SOUND_SWITCH + so.sound_switch = 255; +#endif + so.samples_mixed_so_far = 0; + so.play_position = 0; + so.err_counter = 0; + + if (full) + { +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume_left = 0; + SoundData.master_volume_right = 0; +#endif +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_volume_left = 0; + SoundData.echo_volume_right = 0; + SoundData.echo_enable = 0; + SoundData.echo_write_enabled = 0; + SoundData.echo_channel_enable = 0; +#endif + SoundData.pitch_mod = 0; + SoundData.dummy[0] = 0; + SoundData.dummy[1] = 0; + SoundData.dummy[2] = 0; +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume[0] = 0; + SoundData.master_volume[1] = 0; +#endif +#ifdef ENABLE_ECHO_SOUND + SoundData.echo_volume[0] = 0; + SoundData.echo_volume[1] = 0; +#endif + SoundData.noise_hertz = 0; + } + +#ifdef ENABLE_MASTER_VOLUMEN + SoundData.master_volume_left = 127; + SoundData.master_volume_right = 127; + SoundData.master_volume [0] = SoundData.master_volume [1] = 127; +#endif +#ifdef SNES4ALL_PLAYBACK_RATE + if (so.playback_rate) + so.err_rate = (uint32) (FIXED_POINT * SNES_SCANLINE_TIME / (1.0 / so.playback_rate)); + else + so.err_rate = 0; +#endif + SoundData.no_filter = TRUE; +} + +void S9xSetPlaybackRate (uint32 playback_rate) +{ +#ifdef SNES4ALL_PLAYBACK_RATE + so.playback_rate = playback_rate; + so.err_rate = (uint32) (SNES_SCANLINE_TIME * FIXED_POINT / (1.0 / (double) so.playback_rate)); +#endif +#ifdef ENABLE_ECHO_SOUND + S9xSetEchoDelay (APU.DSP [APU_EDL] & 0xf); +#endif + for (int i = 0; i < 8; i++) + S9xSetSoundFrequency (i, SoundData.channels [i].hertz); +} + +bool8 S9xInitSound (int mode, bool8 stereo, int buffer_size) +{ +#ifdef SNES4ALL_SOUND_FD + so.sound_fd = -1; +#endif +#ifdef SNES4ALL_SOUND_SWITCH + so.sound_switch = 255; +#endif + +#ifdef SNES4ALL_PLAYBACK_RATE + so.playback_rate = 0; +#endif + so.buffer_size = 0; +#ifdef SNES4ALL_STEREO + so.stereo = stereo; +#endif +#if 0 + so.encoded = FALSE; +#endif + + S9xResetSound (TRUE); + + if (!(mode & 7)) + return (1); + + S9xSetSoundMute (TRUE); + if (!S9xOpenSoundDevice (mode, stereo, buffer_size)) + { +/* + S9xMessage (S9X_ERROR, S9X_SOUND_DEVICE_OPEN_FAILED, + "Sound device open failed"); +*/ + return (0); + } + + return (1); +} + +bool8 S9xSetSoundMode (int channel, int mode) +{ + Channel *ch = &SoundData.channels[channel]; + + switch (mode) + { + case MODE_RELEASE: + if (ch->mode != MODE_NONE) + { + ch->mode = MODE_RELEASE; + return (TRUE); + } + break; + + case MODE_DECREASE_LINEAR: + case MODE_DECREASE_EXPONENTIAL: + case MODE_GAIN: + if (ch->mode != MODE_RELEASE) + { + ch->mode = mode; + if (ch->state != SOUND_SILENT) + ch->state = mode; + + return (TRUE); + } + break; + + case MODE_INCREASE_LINEAR: + case MODE_INCREASE_BENT_LINE: + if (ch->mode != MODE_RELEASE) + { + ch->mode = mode; + if (ch->state != SOUND_SILENT) + ch->state = mode; + + return (TRUE); + } + break; + + case MODE_ADSR: + if (ch->mode == MODE_NONE || ch->mode == MODE_ADSR) + { + ch->mode = mode; + return (TRUE); + } + } + + return (FALSE); +} + +#if 0 +void S9xSetSoundControl (int sound_switch) +{ + so.sound_switch = sound_switch; +} +#endif + +void S9xPlaySample (int channel) +{ + Channel *ch = &SoundData.channels[channel]; + + ch->state = SOUND_SILENT; + ch->mode = MODE_NONE; + ch->envx = 0; + ch->envxx = 0; + + S9xFixEnvelope (channel, + APU.DSP [APU_GAIN + (channel << 4)], + APU.DSP [APU_ADSR1 + (channel << 4)], + APU.DSP [APU_ADSR2 + (channel << 4)]); + + ch->sample_number = APU.DSP [APU_SRCN + channel * 0x10]; + if (APU.DSP [APU_NON] & (1 << channel)) + ch->type = SOUND_NOISE; + else + ch->type = SOUND_SAMPLE; + + S9xSetSoundFrequency (channel, ch->hertz); + ch->loop = FALSE; + ch->needs_decode = TRUE; + ch->last_block = FALSE; + ch->previous [0] = ch->previous[1] = 0; + uint8 *dir = S9xGetSampleAddress (ch->sample_number); + ch->block_pointer = READ_WORD (dir); + ch->sample_pointer = 0; + ch->env_error = 0; + ch->next_sample = 0; +#ifdef ENABLE_INTERPOLATE_SOUND + ch->interpolate = 0; +#endif + switch (ch->mode) + { + case MODE_ADSR: + if (ch->attack_rate == 0) + { + if (ch->decay_rate == 0 || ch->sustain_level == 8) + { + ch->state = SOUND_SUSTAIN; + ch->envx = (MAX_ENVELOPE_HEIGHT * ch->sustain_level) >> 3; + S9xSetEnvRate (ch, ch->sustain_rate, -1, 0); + } + else + { + ch->state = SOUND_DECAY; + ch->envx = MAX_ENVELOPE_HEIGHT; + S9xSetEnvRate (ch, ch->decay_rate, -1, + (MAX_ENVELOPE_HEIGHT * ch->sustain_level) >> 3); + } + ch-> left_vol_level = snd_val(ch->envx,ch->volume_left); +#ifndef SNES4ALL_STERE + ch->right_vol_level = snd_val(ch->envx,ch->volume_right); +#endif + } + else + { + ch->state = SOUND_ATTACK; + ch->envx = 0; +#ifdef USE_REAL_SOUND_MUL + ch->left_vol_level = 0; +#ifndef SNES4ALL_STEREO + ch->right_vol_level = 0; +#endif +#else + ch->left_vol_level = -1; +#ifndef SNES4ALL_STEREO + ch->right_vol_level = -1; +#endif +#endif + S9xSetEnvRate (ch, ch->attack_rate, 1, MAX_ENVELOPE_HEIGHT); + } + ch->envxx = ch->envx << ENVX_SHIFT; + break; + + case MODE_GAIN: + ch->state = SOUND_GAIN; + break; + + case MODE_INCREASE_LINEAR: + ch->state = SOUND_INCREASE_LINEAR; + break; + + case MODE_INCREASE_BENT_LINE: + ch->state = SOUND_INCREASE_BENT_LINE; + break; + + case MODE_DECREASE_LINEAR: + ch->state = SOUND_DECREASE_LINEAR; + break; + + case MODE_DECREASE_EXPONENTIAL: + ch->state = SOUND_DECREASE_EXPONENTIAL; + break; + + default: + break; + } + + S9xFixEnvelope (channel, + APU.DSP [APU_GAIN + (channel << 4)], + APU.DSP [APU_ADSR1 + (channel << 4)], + APU.DSP [APU_ADSR2 + (channel << 4)]); +} + diff --git a/src/spc.cpp b/src/spc.cpp new file mode 100644 index 0000000..c12c831 --- /dev/null +++ b/src/spc.cpp @@ -0,0 +1,133 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +void S9xSPCDump (const char *filename) +{ + FILE *fs; + + bool8 read_only = FALSE; + char def [PATH_MAX]; + char title [PATH_MAX]; + char drive [_MAX_DRIVE]; + char dir [_MAX_DIR]; + char ext [_MAX_EXT]; + + S9xSetSoundMute (TRUE); + +#if 0 + _splitpath (Memory.ROMFilename, drive, dir, def, ext); + strcat (def, ".spc"); + sprintf (title, "%s SPC filename", + read_only ? "Select load" : "Choose save"); + const char *filename; + + filename = S9xSelectFilename (def, ".", "spc", title); +#endif + + fs = fopen (filename, "wb"); + fputs ("SNES-SPC700 Sound File Data 0.10", fs); + fseek (fs, 37, SEEK_SET); + fwrite (&APURegisters.PC, 2, 1, fs); + + fputc (APURegisters.YA.B.A, fs); + fputc (APURegisters.X, fs); + fputc (APURegisters.YA.B.Y, fs); + fputc (APURegisters.P, fs); + fputc (APURegisters.S - 0x100, fs); // ??? + fseek (fs, 256, SEEK_SET); + + fwrite (IAPU.RAM, 1, 65536, fs); + + fwrite (APU.DSP, 1, 192, fs); + fwrite (APU.ExtraRAM, 1, 64, fs); + + fclose (fs); + + S9xSetSoundMute (FALSE); +} + diff --git a/src/spc700.cpp b/src/spc700.cpp new file mode 100644 index 0000000..46683d2 --- /dev/null +++ b/src/spc700.cpp @@ -0,0 +1,2531 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "snes9x.h" +#include "spc700.h" +#include "memmap.h" +#include "display.h" +#include "cpuexec.h" +#include "apu.h" + +// SPC700/Sound DSP chips have a 24.57MHz crystal on their PCB. + +#ifdef INLINE +#undef INLINE +#endif + +#if defined(NO_INLINE_SET_GET) || defined(USE_MMU) +#define INLINE static +#else +#define INLINE static __inline__ +#endif + +#include "apumem.h" + +START_EXTERN_C +extern uint8 Work8; +extern uint16 Work16; +extern uint32 Work32; +extern signed char Int8; +extern short Int16; +extern long Int32; +extern short Int16; +extern uint8 W1; +extern uint8 W2; + +END_EXTERN_C + +#define OP1 (*(IAPU.PC + 1)) +#define OP2 (*(IAPU.PC + 2)) + +#ifdef USE_ALWAYS_APU_SYNC +#define COND_APUShutdown (IAPU.WaitCounter == 0) +#else +#define COND_APUShutdown (IAPU.WaitCounter == 0 || snes4all_sound_enable <= 1) +#endif + +#ifdef SPC700_SHUTDOWN +#define APUShutdown() \ + if (Settings.Shutdown && (IAPU.PC == IAPU.WaitAddress1 || IAPU.PC == IAPU.WaitAddress2)) \ + { \ + if COND_APUShutdown \ + { \ + if (!ICPU.CPUExecuting) \ + { \ + if (CPU.Cycles < CPU.NextEvent) \ + CPU.Cycles = CPU.NextEvent; \ + APU.Cycles = CPU.Cycles; \ + S9xUpdateAPUTimer(); \ + } \ + else \ + IAPU.APUExecuting = FALSE; \ + } \ + else \ + if (IAPU.WaitCounter >= 2) \ + IAPU.WaitCounter = 1; \ + else \ + IAPU.WaitCounter--; \ + } +#else +#define APUShutdown() +#endif + +#define _APU_Shutdown_(COND,CYC) \ + if (COND) { \ + IAPU.PC = IAPU.RAM + (uint16) Int16; \ + APU.Cycles += IAPU.TwoCycles; \ + APUShutdown (); \ + } else \ + IAPU.PC += (CYC) + +#if defined(NO_INLINE_SET_GET) || defined(USE_MMU) +static void APU_Shutdown(int cond, int cyc){ + _APU_Shutdown_(cond,cyc); +} +#else +#define APU_Shutdown(COND,CYC) _APU_Shutdown_(COND,CYC) +#endif + +#define APUSetZN8(b)\ + IAPU._Zero = (b); + +#define APUSetZN16(w)\ + IAPU._Zero = ((w) != 0) | ((w) >> 8); + +static void STOP (char *s) +{ +#if 0 + char buffer[100]; + + sprintf (String, "Sound CPU in unknown state executing %s at %04X\n%s\n", s, IAPU.PC - IAPU.RAM, buffer); + S9xMessage (S9X_ERROR, S9X_APU_STOPPED, String); +#endif + APU.TimerEnabled[0] = APU.TimerEnabled[1] = APU.TimerEnabled[2] = FALSE; + IAPU.APUExecuting = FALSE; + +#if 0 + S9xExit (); +#endif +} + +#define TCALL(n)\ +{\ + PushW (IAPU.PC - IAPU.RAM + 1); \ + IAPU.PC = IAPU.RAM + (APU.ExtraRAM [((15 - n) << 1)] + \ + (APU.ExtraRAM [((15 - n) << 1) + 1] << 8)); \ +} + +// XXX: HalfCarry - BJ fixed? +#define SBC(a,b)\ +Int16 = (short) (a) - (short) (b) + (short) (APUCheckCarry ()) - 1;\ +IAPU._Carry = Int16 >= 0;\ +if ((((a) ^ (b)) & 0x80) && (((a) ^ (uint8) Int16) & 0x80))\ + APUSetOverflow ();\ +else \ + APUClearOverflow (); \ +APUSetHalfCarry ();\ +if(((a) ^ (b) ^ (uint8) Int16) & 0x10)\ + APUClearHalfCarry ();\ +(a) = (uint8) Int16;\ +APUSetZN8 ((uint8) Int16); + +// XXX: HalfCarry - BJ fixed? +#define ADC(a,b)\ +Work16 = (a) + (b) + APUCheckCarry();\ +IAPU._Carry = Work16 >= 0x100; \ +if (~((a) ^ (b)) & ((b) ^ (uint8) Work16) & 0x80)\ + APUSetOverflow ();\ +else \ + APUClearOverflow (); \ +APUClearHalfCarry ();\ +if(((a) ^ (b) ^ (uint8) Int16) & 0x10)\ + APUSetHalfCarry ();\ +(a) = (uint8) Work16;\ +APUSetZN8 ((uint8) Work16); + +#define CMP(a,b)\ +Int16 = (short) (a) - (short) (b);\ +IAPU._Carry = Int16 >= 0;\ +APUSetZN8 ((uint8) Int16); + +#define ASL(b)\ + IAPU._Carry = ((b) & 0x80) != 0; \ + (b) <<= 1;\ + APUSetZN8 (b); +#define LSR(b)\ + IAPU._Carry = (b) & 1;\ + (b) >>= 1;\ + APUSetZN8 (b); +#define ROL(b)\ + Work16 = ((b) << 1) | APUCheckCarry (); \ + IAPU._Carry = Work16 >= 0x100; \ + (b) = (uint8) Work16; \ + APUSetZN8 (b); +#define ROR(b)\ + Work16 = (b) | ((uint16) APUCheckCarry () << 8); \ + IAPU._Carry = (uint8) Work16 & 1; \ + Work16 >>= 1; \ + (b) = (uint8) Work16; \ + APUSetZN8 (b); + +#define Push(b)\ + *(IAPU.RAM + 0x100 + APURegisters.S) = b;\ + APURegisters.S--; + +#define Pop(b)\ + APURegisters.S++;\ + (b) = *(IAPU.RAM + 0x100 + APURegisters.S); + +#ifdef FAST_LSB_WORD_ACCESS +#define PushW(w)\ + *(uint16 *) (IAPU.RAM + 0xff + APURegisters.S) = w;\ + APURegisters.S -= 2; +#define PopW(w)\ + APURegisters.S += 2;\ + w = *(uint16 *) (IAPU.RAM + 0xff + APURegisters.S); +#else +#define PushW(w)\ + *(IAPU.RAM + 0xff + APURegisters.S) = w;\ + *(IAPU.RAM + 0x100 + APURegisters.S) = (w >> 8);\ + APURegisters.S -= 2; +#define PopW(w)\ + APURegisters.S += 2; \ + (w) = *(IAPU.RAM + 0xff + APURegisters.S) + (*(IAPU.RAM + 0x100 + APURegisters.S) << 8); +#endif + +#define Relative()\ + Int8 = OP1;\ + Int16 = (int) (IAPU.PC + 2 - IAPU.RAM) + Int8; + +#define Relative2()\ + Int8 = OP2;\ + Int16 = (int) (IAPU.PC + 3 - IAPU.RAM) + Int8; + +#ifdef FAST_LSB_WORD_ACCESS +#define IndexedXIndirect()\ + IAPU.Address = *(uint16 *) (IAPU.DirectPage + ((OP1 + APURegisters.X) & 0xff)); + +#define Absolute()\ + IAPU.Address = *(uint16 *) (IAPU.PC + 1); + +#define AbsoluteX()\ + IAPU.Address = *(uint16 *) (IAPU.PC + 1) + APURegisters.X; + +#define AbsoluteY()\ + IAPU.Address = *(uint16 *) (IAPU.PC + 1) + APURegisters.YA.B.Y; + +#define MemBit()\ + IAPU.Address = *(uint16 *) (IAPU.PC + 1);\ + IAPU.Bit = (uint8)(IAPU.Address >> 13);\ + IAPU.Address &= 0x1fff; + +#define IndirectIndexedY()\ + IAPU.Address = *(uint16 *) (IAPU.DirectPage + OP1) + APURegisters.YA.B.Y; +#else +#define IndexedXIndirect()\ + IAPU.Address = *(IAPU.DirectPage + ((OP1 + APURegisters.X) & 0xff)) + \ + (*(IAPU.DirectPage + ((OP1 + APURegisters.X + 1) & 0xff)) << 8); +#define Absolute()\ + IAPU.Address = OP1 + (OP2 << 8); + +#define AbsoluteX()\ + IAPU.Address = OP1 + (OP2 << 8) + APURegisters.X; + +#define AbsoluteY()\ + IAPU.Address = OP1 + (OP2 << 8) + APURegisters.YA.B.Y; + +#define MemBit()\ + IAPU.Address = OP1 + (OP2 << 8);\ + IAPU.Bit = (int8) (IAPU.Address >> 13);\ + IAPU.Address &= 0x1fff; + +#define IndirectIndexedY()\ + IAPU.Address = *(IAPU.DirectPage + OP1) + \ + (*(IAPU.DirectPage + OP1 + 1) << 8) + \ + APURegisters.YA.B.Y; +#endif + +static void Apu00 () +{ +// NOP + IAPU.PC++; +} + +static void Apu01 () { TCALL (0) } + +static void Apu11 () { TCALL (1) } + +static void Apu21 () { TCALL (2) } + +static void Apu31 () { TCALL (3) } + +static void Apu41 () { TCALL (4) } + +static void Apu51 () { TCALL (5) } + +static void Apu61 () { TCALL (6) } + +static void Apu71 () { TCALL (7) } + +static void Apu81 () { TCALL (8) } + +static void Apu91 () { TCALL (9) } + +static void ApuA1 () { TCALL (10) } + +static void ApuB1 () { TCALL (11) } + +static void ApuC1 () { TCALL (12) } + +static void ApuD1 () { TCALL (13) } + +static void ApuE1 () { TCALL (14) } + +static void ApuF1 () { TCALL (15) } + +static void Apu3F () // CALL absolute +{ + Absolute (); + // 0xB6f for Star Fox 2 + PushW (IAPU.PC + 3 - IAPU.RAM); + IAPU.PC = IAPU.RAM + IAPU.Address; +} + +static void Apu4F () // PCALL $XX +{ + Work8 = OP1; + PushW (IAPU.PC + 2 - IAPU.RAM); + IAPU.PC = IAPU.RAM + 0xff00 + Work8; +} + +#define SET(b) \ +S9xAPUSetByteZ ((uint8) (S9xAPUGetByteZ (OP1 ) | (1 << (b))), OP1); \ +IAPU.PC += 2 + +static void Apu02 () +{ + SET (0); +} + +static void Apu22 () +{ + SET (1); +} + +static void Apu42 () +{ + SET (2); +} + +static void Apu62 () +{ + SET (3); +} + +static void Apu82 () +{ + SET (4); +} + +static void ApuA2 () +{ + SET (5); +} + +static void ApuC2 () +{ + SET (6); +} + +static void ApuE2 () +{ + SET (7); +} + +#define CLR(b) \ +S9xAPUSetByteZ ((uint8) (S9xAPUGetByteZ (OP1) & ~(1 << (b))), OP1); \ +IAPU.PC += 2; + +static void Apu12 () +{ + CLR (0); +} + +static void Apu32 () +{ + CLR (1); +} + +static void Apu52 () +{ + CLR (2); +} + +static void Apu72 () +{ + CLR (3); +} + +static void Apu92 () +{ + CLR (4); +} + +static void ApuB2 () +{ + CLR (5); +} + +static void ApuD2 () +{ + CLR (6); +} + +static void ApuF2 () +{ + CLR (7); +} + +#define BBS(b) \ +Work8 = OP1; \ +Relative2 (); \ +if (S9xAPUGetByteZ (Work8) & (1 << (b))) \ +{ \ + IAPU.PC = IAPU.RAM + (uint16) Int16; \ + APU.Cycles += IAPU.TwoCycles; \ +} \ +else \ + IAPU.PC += 3 + +static void Apu03 () +{ + BBS (0); +} + +static void Apu23 () +{ + BBS (1); +} + +static void Apu43 () +{ + BBS (2); +} + +static void Apu63 () +{ + BBS (3); +} + +static void Apu83 () +{ + BBS (4); +} + +static void ApuA3 () +{ + BBS (5); +} + +static void ApuC3 () +{ + BBS (6); +} + +static void ApuE3 () +{ + BBS (7); +} + +#define BBC(b) \ +Work8 = OP1; \ +Relative2 (); \ +if (!(S9xAPUGetByteZ (Work8) & (1 << (b)))) \ +{ \ + IAPU.PC = IAPU.RAM + (uint16) Int16; \ + APU.Cycles += IAPU.TwoCycles; \ +} \ +else \ + IAPU.PC += 3 + +static void Apu13 () +{ + BBC (0); +} + +static void Apu33 () +{ + BBC (1); +} + +static void Apu53 () +{ + BBC (2); +} + +static void Apu73 () +{ + BBC (3); +} + +static void Apu93 () +{ + BBC (4); +} + +static void ApuB3 () +{ + BBC (5); +} + +static void ApuD3 () +{ + BBC (6); +} + +static void ApuF3 () +{ + BBC (7); +} + +static void Apu04 () +{ +// OR A,dp + APURegisters.YA.B.A |= S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu05 () +{ +// OR A,abs + Absolute (); + APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu06 () +{ +// OR A,(X) + APURegisters.YA.B.A |= S9xAPUGetByteZ (APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu07 () +{ +// OR A,(dp+X) + IndexedXIndirect (); + APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu08 () +{ +// OR A,#00 + APURegisters.YA.B.A |= OP1; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu09 () +{ +// OR dp(dest),dp(src) + Work8 = S9xAPUGetByteZ (OP1); + Work8 |= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu14 () +{ +// OR A,dp+X + APURegisters.YA.B.A |= S9xAPUGetByteZ (OP1 + APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu15 () +{ +// OR A,abs+X + AbsoluteX (); + APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu16 () +{ +// OR A,abs+Y + AbsoluteY (); + APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu17 () +{ +// OR A,(dp)+Y + IndirectIndexedY (); + APURegisters.YA.B.A |= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu18 () +{ +// OR dp,#00 + Work8 = OP1; + Work8 |= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu19 () +{ +// OR (X),(Y) + Work8 = S9xAPUGetByteZ (APURegisters.X) | S9xAPUGetByteZ (APURegisters.YA.B.Y); + APUSetZN8 (Work8); + S9xAPUSetByteZ (Work8, APURegisters.X); + IAPU.PC++; +} + +static void Apu0A () +{ +// OR1 C,membit + MemBit (); + if (!APUCheckCarry ()) + { + if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) + APUSetCarry (); + } + IAPU.PC += 3; +} + +static void Apu2A () +{ +// OR1 C,not membit + MemBit (); + if (!APUCheckCarry ()) + { + if (!(S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) + APUSetCarry (); + } + IAPU.PC += 3; +} + +static void Apu4A () +{ +// AND1 C,membit + MemBit (); + if (APUCheckCarry ()) + { + if (!(S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) + APUClearCarry (); + } + IAPU.PC += 3; +} + +static void Apu6A () +{ +// AND1 C, not membit + MemBit (); + if (APUCheckCarry ()) + { + if ((S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit))) + APUClearCarry (); + } + IAPU.PC += 3; +} + +static void Apu8A () +{ +// EOR1 C, membit + MemBit (); + if (APUCheckCarry ()) + { + if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) + APUClearCarry (); + } + else + { + if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) + APUSetCarry (); + } + IAPU.PC += 3; +} + +static void ApuAA () +{ +// MOV1 C,membit + MemBit (); + if (S9xAPUGetByte (IAPU.Address) & (1 << IAPU.Bit)) + APUSetCarry (); + else + APUClearCarry (); + IAPU.PC += 3; +} + +static void ApuCA () +{ +// MOV1 membit,C + MemBit (); + if (APUCheckCarry ()) + { + S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) | (1 << IAPU.Bit), IAPU.Address); + } + else + { + S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) & ~(1 << IAPU.Bit), IAPU.Address); + } + IAPU.PC += 3; +} + +static void ApuEA () +{ +// NOT1 membit + MemBit (); + S9xAPUSetByte (S9xAPUGetByte (IAPU.Address) ^ (1 << IAPU.Bit), IAPU.Address); + IAPU.PC += 3; +} + +static void Apu0B () +{ +// ASL dp + Work8 = S9xAPUGetByteZ (OP1); + ASL (Work8); + S9xAPUSetByteZ (Work8, OP1); + IAPU.PC += 2; +} + +static void Apu0C () +{ +// ASL abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + ASL (Work8); + S9xAPUSetByte (Work8, IAPU.Address); + IAPU.PC += 3; +} + +static void Apu1B () +{ +// ASL dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + ASL (Work8); + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void Apu1C () +{ +// ASL A + ASL (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu0D () +{ +// PUSH PSW + S9xAPUPackStatus (); + Push (APURegisters.P); + IAPU.PC++; +} + +static void Apu2D () +{ +// PUSH A + Push (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu4D () +{ +// PUSH X + Push (APURegisters.X); + IAPU.PC++; +} + +static void Apu6D () +{ +// PUSH Y + Push (APURegisters.YA.B.Y); + IAPU.PC++; +} + +static void Apu8E () +{ +// POP PSW + Pop (APURegisters.P); + S9xAPUUnpackStatus (); + if (APUCheckDirectPage ()) + IAPU.DirectPage = IAPU.RAM + 0x100; + else + IAPU.DirectPage = IAPU.RAM; + IAPU.PC++; +} + +static void ApuAE () +{ +// POP A + Pop (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuCE () +{ +// POP X + Pop (APURegisters.X); + IAPU.PC++; +} + +static void ApuEE () +{ +// POP Y + Pop (APURegisters.YA.B.Y); + IAPU.PC++; +} + +static void Apu0E () +{ +// TSET1 abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + S9xAPUSetByte (Work8 | APURegisters.YA.B.A, IAPU.Address); + Work8 &= APURegisters.YA.B.A; + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu4E () +{ +// TCLR1 abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + S9xAPUSetByte (Work8 & ~APURegisters.YA.B.A, IAPU.Address); + Work8 &= APURegisters.YA.B.A; + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu0F () +{ +// BRK + +#if 0 + STOP ("BRK"); +#else + PushW (IAPU.PC + 1 - IAPU.RAM); + S9xAPUPackStatus (); + Push (APURegisters.P); + APUSetBreak (); + APUClearInterrupt (); +// XXX:Where is the BRK vector ??? + IAPU.PC = IAPU.RAM + APU.ExtraRAM[0x20] + (APU.ExtraRAM[0x21] << 8); +#endif +} + +static void ApuEF () +{ +// SLEEP + // XXX: sleep + // STOP ("SLEEP"); + IAPU.APUExecuting = FALSE; + IAPU.PC++; +} + +static void ApuFF () +{ +// STOP + // STOP ("STOP"); + IAPU.APUExecuting = FALSE; + IAPU.PC++; +} + +static void Apu10 () +{ +// BPL + Relative (); + APU_Shutdown(!APUCheckNegative (), 2); +} + +static void Apu30 () +{ +// BMI + Relative (); + APU_Shutdown(APUCheckNegative (), 2); +} + +static void Apu90 () +{ +// BCC + Relative (); + APU_Shutdown(!APUCheckCarry (),2); +} + +static void ApuB0 () +{ +// BCS + Relative (); + APU_Shutdown(APUCheckCarry (),2); +} + +static void ApuD0 () +{ +// BNE + Relative (); + APU_Shutdown(!APUCheckZero (),2); +} + +static void ApuF0 () +{ +// BEQ + Relative (); + APU_Shutdown (APUCheckZero (),2); +} + +static void Apu50 () +{ +// BVC + Relative (); + if (!APUCheckOverflow ()) + { + IAPU.PC = IAPU.RAM + (uint16) Int16; + APU.Cycles += IAPU.TwoCycles; + } + else + IAPU.PC += 2; +} + +static void Apu70 () +{ +// BVS + Relative (); + if (APUCheckOverflow ()) + { + IAPU.PC = IAPU.RAM + (uint16) Int16; + APU.Cycles += IAPU.TwoCycles; + } + else + IAPU.PC += 2; +} + +static void Apu2F () +{ +// BRA + Relative (); + IAPU.PC = IAPU.RAM + (uint16) Int16; +} + +static void Apu80 () +{ +// SETC + APUSetCarry (); + IAPU.PC++; +} + +static void ApuED () +{ +// NOTC + IAPU._Carry ^= 1; + IAPU.PC++; +} + +static void Apu40 () +{ +// SETP + APUSetDirectPage (); + IAPU.DirectPage = IAPU.RAM + 0x100; + IAPU.PC++; +} + +static void Apu1A () +{ +// DECW dp + Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + Work16--; + S9xAPUSetByteZ ((uint8) Work16, OP1); + S9xAPUSetByteZ (Work16 >> 8, OP1 + 1); + APUSetZN16 (Work16); + IAPU.PC += 2; +} + +static void Apu5A () +{ +// CMPW YA,dp + Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + Int32 = (long) APURegisters.YA.W - (long) Work16; + IAPU._Carry = Int32 >= 0; + APUSetZN16 ((uint16) Int32); + IAPU.PC += 2; +} + +static void Apu3A () +{ +// INCW dp + Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + Work16++; + S9xAPUSetByteZ ((uint8) Work16, OP1); + S9xAPUSetByteZ (Work16 >> 8, OP1 + 1); + APUSetZN16 (Work16); + IAPU.PC += 2; +} + +// XXX: HalfCarry - BJ Fixed? Or is it between bits 7 and 8 for ADDW/SUBW? +static void Apu7A () +{ +// ADDW YA,dp + Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + Work32 = (uint32) APURegisters.YA.W + Work16; + IAPU._Carry = Work32 >= 0x10000; + if (~(APURegisters.YA.W ^ Work16) & (Work16 ^ (uint16) Work32) & 0x8000) + APUSetOverflow (); + else + APUClearOverflow (); + APUClearHalfCarry (); + if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) + APUSetHalfCarry (); + APURegisters.YA.W = (uint16) Work32; + APUSetZN16 (APURegisters.YA.W); + IAPU.PC += 2; +} + +// XXX: BJ: i think the old HalfCarry behavior was wrong... +// XXX: Or is it between bits 7 and 8 for ADDW/SUBW? +static void Apu9A () +{ +// SUBW YA,dp + Work16 = S9xAPUGetByteZ (OP1) + (S9xAPUGetByteZ (OP1 + 1) << 8); + Int32 = (long) APURegisters.YA.W - (long) Work16; + APUClearHalfCarry (); + IAPU._Carry = Int32 >= 0; + if (((APURegisters.YA.W ^ Work16) & 0x8000) && + ((APURegisters.YA.W ^ (uint16) Int32) & 0x8000)) + APUSetOverflow (); + else + APUClearOverflow (); + if (((APURegisters.YA.W ^ Work16) & 0x0080) && + ((APURegisters.YA.W ^ (uint16) Int32) & 0x0080)) + APUSetHalfCarry (); + APUSetHalfCarry (); + if((APURegisters.YA.W ^ Work16 ^ (uint16) Work32) & 0x10) + APUClearHalfCarry (); + APURegisters.YA.W = (uint16) Int32; + APUSetZN16 (APURegisters.YA.W); + IAPU.PC += 2; +} + +static void ApuBA () +{ +// MOVW YA,dp + APURegisters.YA.B.A = S9xAPUGetByteZ (OP1); + APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + 1); + APUSetZN16 (APURegisters.YA.W); + IAPU.PC += 2; +} + +static void ApuDA () +{ +// MOVW dp,YA + S9xAPUSetByteZ (APURegisters.YA.B.A, OP1); + S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + 1); + IAPU.PC += 2; +} + +static void Apu64 () +{ +// CMP A,dp + Work8 = S9xAPUGetByteZ (OP1); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu65 () +{ +// CMP A,abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu66 () +{ +// CMP A,(X) + Work8 = S9xAPUGetByteZ (APURegisters.X); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC++; +} + +static void Apu67 () +{ +// CMP A,(dp+X) + IndexedXIndirect (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu68 () +{ +// CMP A,#00 + Work8 = OP1; + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu69 () +{ +// CMP dp(dest), dp(src) + W1 = S9xAPUGetByteZ (OP1); + Work8 = S9xAPUGetByteZ (OP2); + CMP (Work8, W1); + IAPU.PC += 3; +} + +static void Apu74 () +{ +// CMP A, dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu75 () +{ +// CMP A,abs+X + AbsoluteX (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu76 () +{ +// CMP A, abs+Y + AbsoluteY (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu77 () +{ +// CMP A,(dp)+Y + IndirectIndexedY (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu78 () +{ +// CMP dp,#00 + Work8 = OP1; + W1 = S9xAPUGetByteZ (OP2); + CMP (W1, Work8); + IAPU.PC += 3; +} + +static void Apu79 () +{ +// CMP (X),(Y) + W1 = S9xAPUGetByteZ (APURegisters.X); + Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + CMP (W1, Work8); + IAPU.PC++; +} + +static void Apu1E () +{ +// CMP X,abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.X, Work8); + IAPU.PC += 3; +} + +static void Apu3E () +{ +// CMP X,dp + Work8 = S9xAPUGetByteZ (OP1); + CMP (APURegisters.X, Work8); + IAPU.PC += 2; +} + +static void ApuC8 () +{ +// CMP X,#00 + CMP (APURegisters.X, OP1); + IAPU.PC += 2; +} + +static void Apu5E () +{ +// CMP Y,abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + CMP (APURegisters.YA.B.Y, Work8); + IAPU.PC += 3; +} + +static void Apu7E () +{ +// CMP Y,dp + Work8 = S9xAPUGetByteZ (OP1); + CMP (APURegisters.YA.B.Y, Work8); + IAPU.PC += 2; +} + +static void ApuAD () +{ +// CMP Y,#00 + Work8 = OP1; + CMP (APURegisters.YA.B.Y, Work8); + IAPU.PC += 2; +} + +static void Apu1F () +{ +// JMP (abs+X) + Absolute (); + IAPU.PC = IAPU.RAM + S9xAPUGetByte (IAPU.Address + APURegisters.X) + + (S9xAPUGetByte (IAPU.Address + APURegisters.X + 1) << 8); +// XXX: HERE: + // APU.Flags |= TRACE_FLAG; +} + +static void Apu5F () +{ +// JMP abs + Absolute (); + IAPU.PC = IAPU.RAM + IAPU.Address; +} + +static void Apu20 () +{ +// CLRP + APUClearDirectPage (); + IAPU.DirectPage = IAPU.RAM; + IAPU.PC++; +} + +static void Apu60 () +{ +// CLRC + APUClearCarry (); + IAPU.PC++; +} + +static void ApuE0 () +{ +// CLRV + APUClearHalfCarry (); + APUClearOverflow (); + IAPU.PC++; +} + +static void Apu24 () +{ +// AND A,dp + APURegisters.YA.B.A &= S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu25 () +{ +// AND A,abs + Absolute (); + APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu26 () +{ +// AND A,(X) + APURegisters.YA.B.A &= S9xAPUGetByteZ (APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu27 () +{ +// AND A,(dp+X) + IndexedXIndirect (); + APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu28 () +{ +// AND A,#00 + APURegisters.YA.B.A &= OP1; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu29 () +{ +// AND dp(dest),dp(src) + Work8 = S9xAPUGetByteZ (OP1); + Work8 &= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu34 () +{ +// AND A,dp+X + APURegisters.YA.B.A &= S9xAPUGetByteZ (OP1 + APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu35 () +{ +// AND A,abs+X + AbsoluteX (); + APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu36 () +{ +// AND A,abs+Y + AbsoluteY (); + APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu37 () +{ +// AND A,(dp)+Y + IndirectIndexedY (); + APURegisters.YA.B.A &= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu38 () +{ +// AND dp,#00 + Work8 = OP1; + Work8 &= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu39 () +{ +// AND (X),(Y) + Work8 = S9xAPUGetByteZ (APURegisters.X) & S9xAPUGetByteZ (APURegisters.YA.B.Y); + APUSetZN8 (Work8); + S9xAPUSetByteZ (Work8, APURegisters.X); + IAPU.PC++; +} + +static void Apu2B () +{ +// ROL dp + Work8 = S9xAPUGetByteZ (OP1); + ROL (Work8); + S9xAPUSetByteZ (Work8, OP1); + IAPU.PC += 2; +} + +static void Apu2C () +{ +// ROL abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + ROL (Work8); + S9xAPUSetByte (Work8, IAPU.Address); + IAPU.PC += 3; +} + +static void Apu3B () +{ +// ROL dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + ROL (Work8); + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void Apu3C () +{ +// ROL A + ROL (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu2E () +{ +// CBNE dp,rel + Work8 = OP1; + Relative2 (); + + APU_Shutdown(S9xAPUGetByteZ (Work8) != APURegisters.YA.B.A, 3); +} + +static void ApuDE () +{ +// CBNE dp+X,rel + Work8 = OP1 + APURegisters.X; + Relative2 (); + + APU_Shutdown(S9xAPUGetByteZ (Work8) != APURegisters.YA.B.A, 3); +} + +static void Apu3D () +{ +// INC X + APURegisters.X++; + APUSetZN8 (APURegisters.X); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void ApuFC () +{ +// INC Y + APURegisters.YA.B.Y++; + APUSetZN8 (APURegisters.YA.B.Y); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void Apu1D () +{ +// DEC X + APURegisters.X--; + APUSetZN8 (APURegisters.X); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void ApuDC () +{ +// DEC Y + APURegisters.YA.B.Y--; + APUSetZN8 (APURegisters.YA.B.Y); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void ApuAB () +{ +// INC dp + Work8 = S9xAPUGetByteZ (OP1) + 1; + S9xAPUSetByteZ (Work8, OP1); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 2; +} + +static void ApuAC () +{ +// INC abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address) + 1; + S9xAPUSetByte (Work8, IAPU.Address); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 3; +} + +static void ApuBB () +{ +// INC dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X) + 1; + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 2; +} + +static void ApuBC () +{ +// INC A + APURegisters.YA.B.A++; + APUSetZN8 (APURegisters.YA.B.A); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void Apu8B () +{ +// DEC dp + Work8 = S9xAPUGetByteZ (OP1) - 1; + S9xAPUSetByteZ (Work8, OP1); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 2; +} + +static void Apu8C () +{ +// DEC abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address) - 1; + S9xAPUSetByte (Work8, IAPU.Address); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 3; +} + +static void Apu9B () +{ +// DEC dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X) - 1; + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + APUSetZN8 (Work8); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC += 2; +} + +static void Apu9C () +{ +// DEC A + APURegisters.YA.B.A--; + APUSetZN8 (APURegisters.YA.B.A); + +#ifdef SPC700_SHUTDOWN + IAPU.WaitCounter++; +#endif + + IAPU.PC++; +} + +static void Apu44 () +{ +// EOR A,dp + APURegisters.YA.B.A ^= S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu45 () +{ +// EOR A,abs + Absolute (); + APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu46 () +{ +// EOR A,(X) + APURegisters.YA.B.A ^= S9xAPUGetByteZ (APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu47 () +{ +// EOR A,(dp+X) + IndexedXIndirect (); + APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu48 () +{ +// EOR A,#00 + APURegisters.YA.B.A ^= OP1; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu49 () +{ +// EOR dp(dest),dp(src) + Work8 = S9xAPUGetByteZ (OP1); + Work8 ^= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu54 () +{ +// EOR A,dp+X + APURegisters.YA.B.A ^= S9xAPUGetByteZ (OP1 + APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu55 () +{ +// EOR A,abs+X + AbsoluteX (); + APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu56 () +{ +// EOR A,abs+Y + AbsoluteY (); + APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void Apu57 () +{ +// EOR A,(dp)+Y + IndirectIndexedY (); + APURegisters.YA.B.A ^= S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void Apu58 () +{ +// EOR dp,#00 + Work8 = OP1; + Work8 ^= S9xAPUGetByteZ (OP2); + S9xAPUSetByteZ (Work8, OP2); + APUSetZN8 (Work8); + IAPU.PC += 3; +} + +static void Apu59 () +{ +// EOR (X),(Y) + Work8 = S9xAPUGetByteZ (APURegisters.X) ^ S9xAPUGetByteZ (APURegisters.YA.B.Y); + APUSetZN8 (Work8); + S9xAPUSetByteZ (Work8, APURegisters.X); + IAPU.PC++; +} + +static void Apu4B () +{ +// LSR dp + Work8 = S9xAPUGetByteZ (OP1); + LSR (Work8); + S9xAPUSetByteZ (Work8, OP1); + IAPU.PC += 2; +} + +static void Apu4C () +{ +// LSR abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + LSR (Work8); + S9xAPUSetByte (Work8, IAPU.Address); + IAPU.PC += 3; +} + +static void Apu5B () +{ +// LSR dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + LSR (Work8); + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void Apu5C () +{ +// LSR A + LSR (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu7D () +{ +// MOV A,X + APURegisters.YA.B.A = APURegisters.X; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuDD () +{ +// MOV A,Y + APURegisters.YA.B.A = APURegisters.YA.B.Y; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu5D () +{ +// MOV X,A + APURegisters.X = APURegisters.YA.B.A; + APUSetZN8 (APURegisters.X); + IAPU.PC++; +} + +static void ApuFD () +{ +// MOV Y,A + APURegisters.YA.B.Y = APURegisters.YA.B.A; + APUSetZN8 (APURegisters.YA.B.Y); + IAPU.PC++; +} + +static void Apu9D () +{ +//MOV X,SP + APURegisters.X = APURegisters.S; + APUSetZN8 (APURegisters.X); + IAPU.PC++; +} + +static void ApuBD () +{ +// MOV SP,X + APURegisters.S = APURegisters.X; + IAPU.PC++; +} + +static void Apu6B () +{ +// ROR dp + Work8 = S9xAPUGetByteZ (OP1); + ROR (Work8); + S9xAPUSetByteZ (Work8, OP1); + IAPU.PC += 2; +} + +static void Apu6C () +{ +// ROR abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + ROR (Work8); + S9xAPUSetByte (Work8, IAPU.Address); + IAPU.PC += 3; +} + +static void Apu7B () +{ +// ROR dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + ROR (Work8); + S9xAPUSetByteZ (Work8, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void Apu7C () +{ +// ROR A + ROR (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu6E () +{ +// DBNZ dp,rel + Work8 = OP1; + Relative2 (); + W1 = S9xAPUGetByteZ (Work8) - 1; + S9xAPUSetByteZ (W1, Work8); + if (W1 != 0) + { + IAPU.PC = IAPU.RAM + (uint16) Int16; + APU.Cycles += IAPU.TwoCycles; + } + else + IAPU.PC += 3; +} + +static void ApuFE () +{ +// DBNZ Y,rel + Relative (); + APURegisters.YA.B.Y--; + if (APURegisters.YA.B.Y != 0) + { + IAPU.PC = IAPU.RAM + (uint16) Int16; + APU.Cycles += IAPU.TwoCycles; + } + else + IAPU.PC += 2; +} + +static void Apu6F () +{ +// RET + PopW (APURegisters.PC); + IAPU.PC = IAPU.RAM + APURegisters.PC; +} + +static void Apu7F () +{ +// RETI + // STOP ("RETI"); + Pop (APURegisters.P); + S9xAPUUnpackStatus (); + PopW (APURegisters.PC); + IAPU.PC = IAPU.RAM + APURegisters.PC; +} + +static void Apu84 () +{ +// ADC A,dp + Work8 = S9xAPUGetByteZ (OP1); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu85 () +{ +// ADC A, abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu86 () +{ +// ADC A,(X) + Work8 = S9xAPUGetByteZ (APURegisters.X); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC++; +} + +static void Apu87 () +{ +// ADC A,(dp+X) + IndexedXIndirect (); + Work8 = S9xAPUGetByte (IAPU.Address); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu88 () +{ +// ADC A,#00 + Work8 = OP1; + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu89 () +{ +// ADC dp(dest),dp(src) + Work8 = S9xAPUGetByteZ (OP1); + W1 = S9xAPUGetByteZ (OP2); + ADC (W1, Work8); + S9xAPUSetByteZ (W1, OP2); + IAPU.PC += 3; +} + +static void Apu94 () +{ +// ADC A,dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu95 () +{ +// ADC A, abs+X + AbsoluteX (); + Work8 = S9xAPUGetByte (IAPU.Address); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu96 () +{ +// ADC A, abs+Y + AbsoluteY (); + Work8 = S9xAPUGetByte (IAPU.Address); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void Apu97 () +{ +// ADC A, (dp)+Y + IndirectIndexedY (); + Work8 = S9xAPUGetByte (IAPU.Address); + ADC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void Apu98 () +{ +// ADC dp,#00 + Work8 = OP1; + W1 = S9xAPUGetByteZ (OP2); + ADC (W1, Work8); + S9xAPUSetByteZ (W1, OP2); + IAPU.PC += 3; +} + +static void Apu99 () +{ +// ADC (X),(Y) + W1 = S9xAPUGetByteZ (APURegisters.X); + Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + ADC (W1, Work8); + S9xAPUSetByteZ (W1, APURegisters.X); + IAPU.PC++; +} + +static void Apu8D () +{ +// MOV Y,#00 + APURegisters.YA.B.Y = OP1; + APUSetZN8 (APURegisters.YA.B.Y); + IAPU.PC += 2; +} + +static void Apu8F () +{ +// MOV dp,#00 + Work8 = OP1; + S9xAPUSetByteZ (Work8, OP2); + IAPU.PC += 3; +} + +static void Apu9E () +{ +// DIV YA,X + if (APURegisters.X == 0) + { + APUSetOverflow (); + APURegisters.YA.B.Y = 0xff; + APURegisters.YA.B.A = 0xff; + } + else + { + APUClearOverflow (); + Work8 = APURegisters.YA.W / APURegisters.X; + APURegisters.YA.B.Y = APURegisters.YA.W % APURegisters.X; + APURegisters.YA.B.A = Work8; + } +// XXX How should Overflow, Half Carry, Zero and Negative flags be set?? + // APUSetZN16 (APURegisters.YA.W); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void Apu9F () +{ +// XCN A + APURegisters.YA.B.A = (APURegisters.YA.B.A >> 4) | (APURegisters.YA.B.A << 4); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuA4 () +{ +// SBC A, dp + Work8 = S9xAPUGetByteZ (OP1); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void ApuA5 () +{ +// SBC A, abs + Absolute (); + Work8 = S9xAPUGetByte (IAPU.Address); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void ApuA6 () +{ +// SBC A, (X) + Work8 = S9xAPUGetByteZ (APURegisters.X); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC++; +} + +static void ApuA7 () +{ +// SBC A,(dp+X) + IndexedXIndirect (); + Work8 = S9xAPUGetByte (IAPU.Address); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void ApuA8 () +{ +// SBC A,#00 + Work8 = OP1; + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void ApuA9 () +{ +// SBC dp(dest), dp(src) + Work8 = S9xAPUGetByteZ (OP1); + W1 = S9xAPUGetByteZ (OP2); + SBC (W1, Work8); + S9xAPUSetByteZ (W1, OP2); + IAPU.PC += 3; +} + +static void ApuB4 () +{ +// SBC A, dp+X + Work8 = S9xAPUGetByteZ (OP1 + APURegisters.X); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void ApuB5 () +{ +// SBC A,abs+X + AbsoluteX (); + Work8 = S9xAPUGetByte (IAPU.Address); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void ApuB6 () +{ +// SBC A,abs+Y + AbsoluteY (); + Work8 = S9xAPUGetByte (IAPU.Address); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 3; +} + +static void ApuB7 () +{ +// SBC A,(dp)+Y + IndirectIndexedY (); + Work8 = S9xAPUGetByte (IAPU.Address); + SBC (APURegisters.YA.B.A, Work8); + IAPU.PC += 2; +} + +static void ApuB8 () +{ +// SBC dp,#00 + Work8 = OP1; + W1 = S9xAPUGetByteZ (OP2); + SBC (W1, Work8); + S9xAPUSetByteZ (W1, OP2); + IAPU.PC += 3; +} + +static void ApuB9 () +{ +// SBC (X),(Y) + W1 = S9xAPUGetByteZ (APURegisters.X); + Work8 = S9xAPUGetByteZ (APURegisters.YA.B.Y); + SBC (W1, Work8); + S9xAPUSetByteZ (W1, APURegisters.X); + IAPU.PC++; +} + +static void ApuAF () +{ +// MOV (X)+, A + S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X++); + IAPU.PC++; +} + +static void ApuBE () +{ +// DAS + if ((APURegisters.YA.B.A & 0x0f) > 9 || !APUCheckHalfCarry()) + { + APURegisters.YA.B.A -= 6; + } + if (APURegisters.YA.B.A > 0x9f || !IAPU._Carry) + { + APURegisters.YA.B.A -= 0x60; + APUClearCarry (); + } + else { APUSetCarry (); } + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuBF () +{ +// MOV A,(X)+ + APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X++); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuC0 () +{ +// DI + APUClearInterrupt (); + IAPU.PC++; +} + +static void ApuA0 () +{ +// EI + APUSetInterrupt (); + IAPU.PC++; +} + +static void ApuC4 () +{ +// MOV dp,A + S9xAPUSetByteZ (APURegisters.YA.B.A, OP1); + IAPU.PC += 2; +} + +static void ApuC5 () +{ +// MOV abs,A + Absolute (); + S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + IAPU.PC += 3; +} + +static void ApuC6 () +{ +// MOV (X), A + S9xAPUSetByteZ (APURegisters.YA.B.A, APURegisters.X); + IAPU.PC++; +} + +static void ApuC7 () +{ +// MOV (dp+X),A + IndexedXIndirect (); + S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + IAPU.PC += 2; +} + +static void ApuC9 () +{ +// MOV abs,X + Absolute (); + S9xAPUSetByte (APURegisters.X, IAPU.Address); + IAPU.PC += 3; +} + +static void ApuCB () +{ +// MOV dp,Y + S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1); + IAPU.PC += 2; +} + +static void ApuCC () +{ +// MOV abs,Y + Absolute (); + S9xAPUSetByte (APURegisters.YA.B.Y, IAPU.Address); + IAPU.PC += 3; +} + +static void ApuCD () +{ +// MOV X,#00 + APURegisters.X = OP1; + APUSetZN8 (APURegisters.X); + IAPU.PC += 2; +} + +static void ApuCF () +{ +// MUL YA + APURegisters.YA.W = (uint16) APURegisters.YA.B.A * APURegisters.YA.B.Y; + APUSetZN16 (APURegisters.YA.W); + IAPU.PC++; +} + +static void ApuD4 () +{ +// MOV dp+X, A + S9xAPUSetByteZ (APURegisters.YA.B.A, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void ApuD5 () +{ +// MOV abs+X,A + AbsoluteX (); + S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + IAPU.PC += 3; +} + +static void ApuD6 () +{ +// MOV abs+Y,A + AbsoluteY (); + S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + IAPU.PC += 3; +} + +static void ApuD7 () +{ +// MOV (dp)+Y,A + IndirectIndexedY (); + S9xAPUSetByte (APURegisters.YA.B.A, IAPU.Address); + IAPU.PC += 2; +} + +static void ApuD8 () +{ +// MOV dp,X + S9xAPUSetByteZ (APURegisters.X, OP1); + IAPU.PC += 2; +} + +static void ApuD9 () +{ +// MOV dp+Y,X + S9xAPUSetByteZ (APURegisters.X, OP1 + APURegisters.YA.B.Y); + IAPU.PC += 2; +} + +static void ApuDB () +{ +// MOV dp+X,Y + S9xAPUSetByteZ (APURegisters.YA.B.Y, OP1 + APURegisters.X); + IAPU.PC += 2; +} + +static void ApuDF () +{ +// DAA + if ((APURegisters.YA.B.A & 0x0f) > 9 || APUCheckHalfCarry()) + { + if(APURegisters.YA.B.A > 0xf0) APUSetCarry (); + APURegisters.YA.B.A += 6; + //APUSetHalfCarry (); Intel procs do this, but this is a Sony proc... + } + //else { APUClearHalfCarry (); } ditto as above + if (APURegisters.YA.B.A > 0x9f || IAPU._Carry) + { + APURegisters.YA.B.A += 0x60; + APUSetCarry (); + } + else { APUClearCarry (); } + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuE4 () +{ +// MOV A, dp + APURegisters.YA.B.A = S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void ApuE5 () +{ +// MOV A,abs + Absolute (); + APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void ApuE6 () +{ +// MOV A,(X) + APURegisters.YA.B.A = S9xAPUGetByteZ (APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC++; +} + +static void ApuE7 () +{ +// MOV A,(dp+X) + IndexedXIndirect (); + APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void ApuE8 () +{ +// MOV A,#00 + APURegisters.YA.B.A = OP1; + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void ApuE9 () +{ +// MOV X, abs + Absolute (); + APURegisters.X = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.X); + IAPU.PC += 3; +} + +static void ApuEB () +{ +// MOV Y,dp + APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.YA.B.Y); + IAPU.PC += 2; +} + +static void ApuEC () +{ +// MOV Y,abs + Absolute (); + APURegisters.YA.B.Y = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.Y); + IAPU.PC += 3; +} + +static void ApuF4 () +{ +// MOV A, dp+X + APURegisters.YA.B.A = S9xAPUGetByteZ (OP1 + APURegisters.X); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void ApuF5 () +{ +// MOV A, abs+X + AbsoluteX (); + APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void ApuF6 () +{ +// MOV A, abs+Y + AbsoluteY (); + APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 3; +} + +static void ApuF7 () +{ +// MOV A, (dp)+Y + IndirectIndexedY (); + APURegisters.YA.B.A = S9xAPUGetByte (IAPU.Address); + APUSetZN8 (APURegisters.YA.B.A); + IAPU.PC += 2; +} + +static void ApuF8 () +{ +// MOV X,dp + APURegisters.X = S9xAPUGetByteZ (OP1); + APUSetZN8 (APURegisters.X); + IAPU.PC += 2; +} + +static void ApuF9 () +{ +// MOV X,dp+Y + APURegisters.X = S9xAPUGetByteZ (OP1 + APURegisters.YA.B.Y); + APUSetZN8 (APURegisters.X); + IAPU.PC += 2; +} + +static void ApuFA () +{ +// MOV dp(dest),dp(src) + S9xAPUSetByteZ (S9xAPUGetByteZ (OP1), OP2); + IAPU.PC += 3; +} + +static void ApuFB () +{ +// MOV Y,dp+X + APURegisters.YA.B.Y = S9xAPUGetByteZ (OP1 + APURegisters.X); + APUSetZN8 (APURegisters.YA.B.Y); + IAPU.PC += 2; +} + +void (*S9xApuOpcodes[256]) (void) = +{ + Apu00, Apu01, Apu02, Apu03, Apu04, Apu05, Apu06, Apu07, + Apu08, Apu09, Apu0A, Apu0B, Apu0C, Apu0D, Apu0E, Apu0F, + Apu10, Apu11, Apu12, Apu13, Apu14, Apu15, Apu16, Apu17, + Apu18, Apu19, Apu1A, Apu1B, Apu1C, Apu1D, Apu1E, Apu1F, + Apu20, Apu21, Apu22, Apu23, Apu24, Apu25, Apu26, Apu27, + Apu28, Apu29, Apu2A, Apu2B, Apu2C, Apu2D, Apu2E, Apu2F, + Apu30, Apu31, Apu32, Apu33, Apu34, Apu35, Apu36, Apu37, + Apu38, Apu39, Apu3A, Apu3B, Apu3C, Apu3D, Apu3E, Apu3F, + Apu40, Apu41, Apu42, Apu43, Apu44, Apu45, Apu46, Apu47, + Apu48, Apu49, Apu4A, Apu4B, Apu4C, Apu4D, Apu4E, Apu4F, + Apu50, Apu51, Apu52, Apu53, Apu54, Apu55, Apu56, Apu57, + Apu58, Apu59, Apu5A, Apu5B, Apu5C, Apu5D, Apu5E, Apu5F, + Apu60, Apu61, Apu62, Apu63, Apu64, Apu65, Apu66, Apu67, + Apu68, Apu69, Apu6A, Apu6B, Apu6C, Apu6D, Apu6E, Apu6F, + Apu70, Apu71, Apu72, Apu73, Apu74, Apu75, Apu76, Apu77, + Apu78, Apu79, Apu7A, Apu7B, Apu7C, Apu7D, Apu7E, Apu7F, + Apu80, Apu81, Apu82, Apu83, Apu84, Apu85, Apu86, Apu87, + Apu88, Apu89, Apu8A, Apu8B, Apu8C, Apu8D, Apu8E, Apu8F, + Apu90, Apu91, Apu92, Apu93, Apu94, Apu95, Apu96, Apu97, + Apu98, Apu99, Apu9A, Apu9B, Apu9C, Apu9D, Apu9E, Apu9F, + ApuA0, ApuA1, ApuA2, ApuA3, ApuA4, ApuA5, ApuA6, ApuA7, + ApuA8, ApuA9, ApuAA, ApuAB, ApuAC, ApuAD, ApuAE, ApuAF, + ApuB0, ApuB1, ApuB2, ApuB3, ApuB4, ApuB5, ApuB6, ApuB7, + ApuB8, ApuB9, ApuBA, ApuBB, ApuBC, ApuBD, ApuBE, ApuBF, + ApuC0, ApuC1, ApuC2, ApuC3, ApuC4, ApuC5, ApuC6, ApuC7, + ApuC8, ApuC9, ApuCA, ApuCB, ApuCC, ApuCD, ApuCE, ApuCF, + ApuD0, ApuD1, ApuD2, ApuD3, ApuD4, ApuD5, ApuD6, ApuD7, + ApuD8, ApuD9, ApuDA, ApuDB, ApuDC, ApuDD, ApuDE, ApuDF, + ApuE0, ApuE1, ApuE2, ApuE3, ApuE4, ApuE5, ApuE6, ApuE7, + ApuE8, ApuE9, ApuEA, ApuEB, ApuEC, ApuED, ApuEE, ApuEF, + ApuF0, ApuF1, ApuF2, ApuF3, ApuF4, ApuF5, ApuF6, ApuF7, + ApuF8, ApuF9, ApuFA, ApuFB, ApuFC, ApuFD, ApuFE, ApuFF +}; + +void S9xApuExecute(void) { + if (IAPU.APUExecuting) + while (APU.Cycles <= CPU.Cycles) + APU_EXECUTE1(); +} diff --git a/src/spc7110.cpp b/src/spc7110.cpp new file mode 100644 index 0000000..1dba450 --- /dev/null +++ b/src/spc7110.cpp @@ -0,0 +1,2348 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +//#define SPC7110_DEBUG +// +#ifdef DREAMCAST +#include +#define chdir(A) fs_chdir(A) +static __inline__ char *_getcwd(char *buf, size_t tam) +{ + const char *w=fs_getwd(); + if (w) + { + strncpy(buf,w,tam); + return buf; + } + return NULL; +} +#define getcwd _getcwd +#endif + +#include "spc7110.h" +#include "memmap.h" +#include +#include + +//Windows includes +#ifdef __WIN32__ +#ifndef _XBOX // chdir and getcwd not supported on Xbox hardware +#include +#define chdir _chdir +#define getcwd _getcwd +#endif +#define FREEZEFOLDER GUI.FreezeFileDir +//zinx suggested this, for *nix compatibility +#define PATH_MAX MAX_PATH +#else // Unix +#include "display.h" +#include +#include +#define FREEZEFOLDER S9xGetSnapshotDirectory () +#endif + +extern "C" const char *S9xGetFilename (const char *); +extern "C" char *osd_GetPackDir(); +//really not needed, but usually MS adds the _ to POSIX functions, +//while *nix doesn't, so this was to "un-M$" the function. +#define splitpath _splitpath + +//not much headroom, but FEOEZ has 41 tables, I think, and SPL4 has 38. +#define MAX_TABLES 48 + +//default to using 5 megs of RAM for method 3 caching. +uint16 cacheMegs=5; + +//using function pointers to initialize cache management +#if 0 +void (*CleanUp7110)(void)=NULL; +void (*LoadUp7110)(char*)=&SPC7110Load; +void (*Copy7110)(void)=NULL; +#endif + +//size and offset of the pack data +//offset and size of reads from pack +typedef struct SPC7110DecompressionLocationStruct +{ + uint32 offset; + uint32 size; + uint16 used_offset; + uint16 used_len; +} Data7110; + +//this maps an index.bin table to the decompression pack +typedef struct SPC7110DecompressionIndexStruct +{ + int table; + bool is_file; + Data7110 location[256]; +} Index7110; + +//this contains all the data for the decompression pack. +typedef struct SPC7110DecompressionPackStructure +{ + uint8* binfiles[MAX_TABLES]; + Index7110 tableEnts[MAX_TABLES]; + int last_table; + int idx; + uint8 last_idx; + uint16 last_offset; +} Pack7110; + + +char pfold[9]; //hack variable for log naming (each game makes a different log) +Pack7110* decompack=NULL; //decompression pack uses a fair chunk of RAM, so dynalloc it. +SPC7110Regs s7r; //SPC7110 registers, about 33KB +S7RTC rtc_f9; //FEOEZ (and Shounen Jump no SHou) RTC +void S9xUpdateRTC (); //S-RTC function hacked to work with the RTC + +//Emulate power on state +void S9xSpc7110Init() +{ + s7r.DataRomOffset=0x00100000;//handy constant! + s7r.DataRomSize=CMemory_CalculatedSize-s7r.DataRomOffset; + s7r.reg4800=0; + s7r.reg4801=0; + s7r.reg4802=0; + s7r.reg4803=0; + s7r.reg4804=0; + s7r.reg4805=0; + s7r.reg4806=0; + s7r.reg4807=0; + s7r.reg4808=0; + s7r.reg4809=0; + s7r.reg480A=0; + s7r.reg480B=0; + s7r.reg480C=0; + s7r.reg4811=0; + s7r.reg4812=0; + s7r.reg4813=0; + s7r.reg4814=0; + s7r.reg4815=0; + s7r.reg4816=0; + s7r.reg4817=0; + s7r.reg4818=0; + s7r.reg4820=0; + s7r.reg4821=0; + s7r.reg4822=0; + s7r.reg4823=0; + s7r.reg4824=0; + s7r.reg4825=0; + s7r.reg4826=0; + s7r.reg4827=0; + s7r.reg4828=0; + s7r.reg4829=0; + s7r.reg482A=0; + s7r.reg482B=0; + s7r.reg482C=0; + s7r.reg482D=0; + s7r.reg482E=0; + s7r.reg482F=0; + s7r.reg4830=0; + s7r.reg4831=0; + s7r.reg4832=1; + s7r.reg4833=2; + s7r.reg4834=0; + s7r.reg4840=0; + s7r.reg4841=0; + s7r.reg4842=0; + s7r.written=0; + s7r.offset_add=0; + s7r.AlignBy=1; + +#if 0 + (*LoadUp7110)(osd_GetPackDir()); +#endif + +#if 0 + if(Settings.SPC7110RTC) + Settings.TurboMode=false; +#endif + + s7r.bank50Internal=0; + memset(s7r.bank50,0x00,DECOMP_BUFFER_SIZE); +} + + +#if 0 +//full cache decompression routine (memcpy) Method 1 +void MovePackData() +{ + //log the last entry + Data7110* log=&(decompack->tableEnts[decompack->idx].location[decompack->last_idx]); + if((log->used_len+log->used_offset)<(decompack->last_offset+(unsigned short)s7r.bank50Internal)) + { + log->used_len=s7r.bank50Internal; + log->used_offset=decompack->last_offset; + } + + //set up for next logging + decompack->last_offset=(s7r.reg4805)|(s7r.reg4806<<8); + + decompack->last_idx=s7r.reg4804; + + //start decompression + int table=(s7r.reg4803<<16)|(s7r.reg4802<<8)|s7r.reg4801; + + //the table is a offset multiplier byte and a big-endian pointer + int j= 4*s7r.reg4804; + j+=s7r.DataRomOffset; + j+=table; + + //set proper offsetting. + if(s7r.reg480B==0) + s7r.AlignBy=0; + else + { + switch(ROM[j]) + { + case 0x03: + s7r.AlignBy=8; + break; + case 0x01: + s7r.AlignBy=2; + break; + case 0x02: + s7r.AlignBy=4; + break; + case 0x00: + default: + s7r.AlignBy=1; + break; + } + } + //note that we are still setting up for the next log. + decompack->last_offset*=s7r.AlignBy; + decompack->last_offset%=DECOMP_BUFFER_SIZE; + + //find the table + if(table!=decompack->last_table) + { + int i=0; + while(itableEnts[i].table!=table) + i++; + if(i==MAX_TABLES) + { +#ifdef _XBOX + FILE* fp=fopen("T:\\sp7err.out","a"); +#else + FILE* fp=fopen("sp7err.out","a"); +#endif + + fprintf(fp, "Table Entry %06X:%02X not found\n", table, s7r.reg4804); + fclose(fp); + return; + } + decompack->idx=i; + decompack->last_table=table; + } + + //copy data + if(decompack->binfiles[decompack->idx]) + { + memcpy(s7r.bank50, + &(decompack->binfiles[decompack->idx][decompack->tableEnts[decompack->idx].location[s7r.reg4804].offset]), + decompack->tableEnts[decompack->idx].location[s7r.reg4804].size); + } +} +#endif + + +#if 0 +//this is similar to the last function, but it keeps the last 5 accessed files open, +// and reads the data directly. Method 2 +void ReadPackData() +{ + static int table_age_2; + static int table_age_3; + static int table_age_4; + static int table_age_5; + + int table=(s7r.reg4803<<16)|(s7r.reg4802<<8)|s7r.reg4801; + + if(table==0) + { + table_age_2=table_age_3=table_age_4=table_age_5=MAX_TABLES; + return; + } + + if(table_age_2==0&&table_age_3==0&&table_age_4==0&&table_age_5==0) + table_age_2=table_age_3=table_age_4=table_age_5=MAX_TABLES; + Data7110* log=&(decompack->tableEnts[decompack->idx].location[decompack->last_idx]); + if((log->used_len+log->used_offset)<(decompack->last_offset+(unsigned short)s7r.bank50Internal)) + { + log->used_len=s7r.bank50Internal; + log->used_offset=decompack->last_offset; + } + + decompack->last_offset=(s7r.reg4805)|(s7r.reg4806<<8); + + decompack->last_idx=s7r.reg4804; + + int j= 4*s7r.reg4804; + j+=s7r.DataRomOffset; + j+=table; + + if(s7r.reg480B==0) + s7r.AlignBy=0; + else + { + switch(ROM[j]) + { + case 0x03: + s7r.AlignBy=8; + break; + case 0x01: + s7r.AlignBy=2; + break; + case 0x02: + s7r.AlignBy=4; + break; + case 0x00: + default: + s7r.AlignBy=1; + break; + } + } + decompack->last_offset*=s7r.AlignBy; + decompack->last_offset%=DECOMP_BUFFER_SIZE; + if(table!=decompack->last_table) + { + int i=0; + while(itableEnts[i].table!=table) + i++; + if(i==MAX_TABLES) + { + FILE* fp=fopen("sp7err.out","a"); + fprintf(fp, "Table Entry %06X:%02X not found\n", table, s7r.reg4804); + fclose(fp); + return; + } + if(i!= table_age_2 && i!= table_age_3 && i!= table_age_4 && i!= table_age_5) + { + if(table_age_5!=MAX_TABLES&&decompack->binfiles[table_age_5]) + { + fclose((FILE*)(decompack->binfiles[table_age_5])); + (decompack->binfiles[table_age_5])=NULL; + } + table_age_5=table_age_4; + table_age_4=table_age_3; + table_age_3=table_age_2; + table_age_2=decompack->idx; + char name[PATH_MAX]; + //open file + char drive [_MAX_DRIVE + 1]; + char dir [_MAX_DIR + 1]; + char fname [_MAX_FNAME + 1]; + char ext [_MAX_EXT + 1]; + if (strlen (FREEZEFOLDER)) + { + //splitpath (CMemory_ROMFilename, drive, dir, fname, ext); + strcpy (name, FREEZEFOLDER); + strcat (name, "/"); + } + else + { + splitpath (CMemory_ROMFilename, drive, dir, fname, ext); + strcpy(name, drive); + //strcat(filename, "\\"); + strcat(name, dir); + } + strcat(name, pfold); + char bfname[11]; + sprintf(bfname, "%06X.bin", table); + strcat(name, "/"); + strcat(name, bfname); + decompack->binfiles[i]=(uint8*)fopen(name, "rb"); + } + else + { + //fix tables in this case + if(table_age_5==i) + { + table_age_5=table_age_4; + table_age_4=table_age_3; + table_age_3=table_age_2; + table_age_2=decompack->idx; + } + if(table_age_4==i) + { + table_age_4=table_age_3; + table_age_3=table_age_2; + table_age_2=decompack->idx; + } + if(table_age_3==i) + { + table_age_3=table_age_2; + table_age_2=decompack->idx; + } + if(table_age_2==i) + { + table_age_2=decompack->idx; + } + } + decompack->idx=i; + decompack->last_table=table; + } + //do read here. + if(decompack->binfiles[decompack->idx]) + { + fseek((FILE*)(decompack->binfiles[decompack->idx]), decompack->tableEnts[decompack->idx].location[s7r.reg4804].offset, 0); + fread(s7r.bank50,1, (decompack->tableEnts[decompack->idx].location[s7r.reg4804].size), (FILE*)(decompack->binfiles[decompack->idx])); + } +} +#endif + +#if 0 +//Cache Method 3: some entries are cached, others are file handles. +//use is_file to distinguish. +void GetPackData() +{ + Data7110* log=&(decompack->tableEnts[decompack->idx].location[decompack->last_idx]); + if((log->used_len+log->used_offset)<(decompack->last_offset+(unsigned short)s7r.bank50Internal)) + { + log->used_len=s7r.bank50Internal; + log->used_offset=decompack->last_offset; + } + + decompack->last_offset=(s7r.reg4805)|(s7r.reg4806<<8); + + decompack->last_idx=s7r.reg4804; + int table=(s7r.reg4803<<16)|(s7r.reg4802<<8)|s7r.reg4801; + + int j= 4*s7r.reg4804; + j+=s7r.DataRomOffset; + j+=table; + + if(s7r.reg480B==0) + s7r.AlignBy=0; + else + { + switch(ROM[j]) + { + case 0x03: + s7r.AlignBy=8; + break; + case 0x01: + s7r.AlignBy=2; + break; + case 0x02: + s7r.AlignBy=4; + break; + case 0x00: + default: + s7r.AlignBy=1; + break; + } + } + decompack->last_offset*=s7r.AlignBy; + decompack->last_offset%=DECOMP_BUFFER_SIZE; + if(table!=decompack->last_table) + { + int i=0; + while(itableEnts[i].table!=table) + i++; + if(i==MAX_TABLES) + { + FILE* fp=fopen("sp7err.out","a"); + fprintf(fp, "Table Entry %06X:%02X not found\n", table, s7r.reg4804); + fclose(fp); + return; + } + decompack->idx=i; + decompack->last_table=table; + } + if(decompack->binfiles[decompack->idx]) + { + if(decompack->tableEnts[decompack->idx].is_file) + { + fseek((FILE*)decompack->binfiles[decompack->idx], decompack->tableEnts[decompack->idx].location[s7r.reg4804].offset, 0); + fread(s7r.bank50,1, (decompack->tableEnts[decompack->idx].location[s7r.reg4804].size), (FILE*)(decompack->binfiles[decompack->idx])); + } + else + { + memcpy(s7r.bank50, + &(decompack->binfiles[decompack->idx][decompack->tableEnts[decompack->idx].location[s7r.reg4804].offset]), + decompack->tableEnts[decompack->idx].location[s7r.reg4804].size); + } + } +} +#endif + +extern "C"{ +//reads SPC7110 and RTC registers. +uint8 S9xGetSPC7110(uint16 Address) +{ +#ifdef SPC7110_DEBUG + printf("%04X read\n", Address); +#endif + switch (Address) + { + //decompressed data read port. decrements 4809-A (with wrap) + //4805-6 is the offset into the bank + //AlignBy is set (afaik) at decompression time, and is the offset multiplier + //bank50internal is an internal pointer to the actual byte to read. + //so you read from offset*multiplier + bank50internal + //the offset registers cannot be incremented due to the offset multiplier. + case 0x4800: + { + unsigned short count=s7r.reg4809|(s7r.reg480A<<8); + uint32 i, j; + j=(s7r.reg4805|(s7r.reg4806<<8)); + j*=s7r.AlignBy; + i=j; + if(count >0) + count--; + else count = 0xFFFF; + s7r.reg4809=0x00ff&count; + s7r.reg480A=(0xff00&count)>>8; + i+=s7r.bank50Internal; + i%=DECOMP_BUFFER_SIZE; + s7r.reg4800=s7r.bank50[i]; + + s7r.bank50Internal++; + s7r.bank50Internal%=DECOMP_BUFFER_SIZE; +#ifdef SPC7110_DEBUG + printf("Returned %02X\n", s7r.reg4800); +#endif + } + return s7r.reg4800; + //table register low + case 0x4801: return s7r.reg4801; + //table register middle + case 0x4802: return s7r.reg4802; + //table register high + case 0x4803: return s7r.reg4803; + //index of pointer in table (each entry is 4 bytes) + case 0x4804: return s7r.reg4804; + //offset register low + case 0x4805: return s7r.reg4805; + //offset register high + case 0x4806: return s7r.reg4806; + //DMA channel (not that I see this usually set, + //regardless of what channel DMA is on) + case 0x4807: return s7r.reg4807; + //C r/w option, unknown, defval:00 is what Dark Force says + //afaict, Snes9x doesn't use this at all. + case 0x4808: return s7r.reg4808; + //C-Length low + //counts down the number of bytes left to read from the decompression buffer. + //this is set by the ROM, and wraps on bounds. + case 0x4809: return s7r.reg4809; + //C Length high + case 0x480A: return s7r.reg480A; + //Offset enable. + //if this is zero, 4805-6 are useless. Emulated by setting AlignBy to 0 + case 0x480B: + return s7r.reg480B; + //decompression finished: just emulated by switching each read. + case 0x480C: + s7r.reg480C^=0x80; + return s7r.reg480C^0x80; + + //Data access port + //reads from the data ROM (anywhere over the first 8 mbits + //behavior is complex, will document later, + //possibly missing cases, because of the number of switches in play + case 0x4810: + if(s7r.written==0) + return 0; + if((s7r.written&0x07)==0x07) + { + uint32 i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + i%=s7r.DataRomSize; + if(s7r.reg4818&0x02) + { + if(s7r.reg4818&0x08) + { + signed short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + i+=r4814; + r4814++; + s7r.reg4815=(uint8)(r4814>>8); + s7r.reg4814=(uint8)(r4814&0x00FF); + } + else + { + unsigned short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + i+=r4814; + if(r4814!=0xFFFF) + r4814++; + else r4814=0; + s7r.reg4815=(uint8)(r4814>>8); + s7r.reg4814=(uint8)(r4814&0x00FF); + + } + } + i+=s7r.DataRomOffset; + uint8 tmp=CMemory_ROM[i]; + i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + + if(s7r.reg4818&0x02) + { + } + else if(s7r.reg4818&0x01) + { + if(s7r.reg4818&0x04) + { + signed short inc; + inc=(s7r.reg4817<<8)|s7r.reg4816; + + if(!(s7r.reg4818&0x10)) + i+=inc; + else + { + if(s7r.reg4818&0x08) + { + signed short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=inc; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + } + else + { + unsigned short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=inc; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + + } + } + //is signed + } + else + { + uint16 inc; + inc=(s7r.reg4817<<8)|s7r.reg4816; + if(!(s7r.reg4818&0x10)) + i+=inc; + else + { + if(s7r.reg4818&0x08) + { + signed short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=inc; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + } + else + { + unsigned short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=inc; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + + } + } + } + } + else + { + if(!(s7r.reg4818&0x10)) + i+=1; + else + { + if(s7r.reg4818&0x08) + { + signed short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=1; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + } + else + { + unsigned short r4814; + r4814=(s7r.reg4815<<8)|s7r.reg4814; + r4814+=1; + s7r.reg4815=(r4814&0xFF00)>>8; + s7r.reg4814=r4814&0xFF; + + } + } + } + +#ifdef SPC7110_DEBUG + printf("Returned %02X\n", tmp); +#endif + + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + return tmp; + } + else return 0; + //direct read address low + case 0x4811: return s7r.reg4811; + //direct read address middle + case 0x4812: return s7r.reg4812; + //direct read access high + case 0x4813: return s7r.reg4813; + //read adjust low + case 0x4814: return s7r.reg4814; + //read adjust high + case 0x4815: return s7r.reg4815; + //read increment low + case 0x4816: return s7r.reg4816; + //read increment high + case 0x4817: return s7r.reg4817; + //Data ROM command mode + //essentially, this controls the insane code of $4810 and $481A + case 0x4818: return s7r.reg4818; + //read after adjust port + //what this does, besides more nasty stuff like 4810, + //I don't know. Just assume it is a different implementation of $4810, + //if it helps your sanity + case 0x481A: + if(s7r.written==0x1F) + { + uint32 i=((s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811); + if(s7r.reg4818&0x08) + { + short adj; + adj=((short)(s7r.reg4815<<8))|s7r.reg4814; + i+=adj; + } + else + { + uint16 adj; + adj=(s7r.reg4815<<8)|s7r.reg4814; + i+=adj; + } + + i%=s7r.DataRomSize; + i+=s7r.DataRomOffset; + uint8 tmp=CMemory_ROM[i]; + i=((s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811); + if(0x60==(s7r.reg4818&0x60)) + { + i=((s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811); + + if(!(s7r.reg4818&0x10)) + { + if(s7r.reg4818&0x08) + { + short adj; + adj=((short)(s7r.reg4815<<8))|s7r.reg4814; + i+=adj; + } + else + { + uint16 adj; + adj=(s7r.reg4815<<8)|s7r.reg4814; + i+=adj; + } + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + } + else + { + if(s7r.reg4818&0x08) + { + short adj; + adj=((short)(s7r.reg4815<<8))|s7r.reg4814; + adj+=adj; + s7r.reg4815=(adj&0xFF00)>>8; + s7r.reg4814=adj&0xFF; + } + else + { + uint16 adj; + adj=(s7r.reg4815<<8)|s7r.reg4814; + adj+=adj; + s7r.reg4815=(adj&0xFF00)>>8; + s7r.reg4814=adj&0xFF; + } + } + } +#ifdef SPC7110_DEBUG + printf("Returned %02X\n", tmp); +#endif + return tmp; + } + else return 0; + + //multiplicand low or dividend lowest + case 0x4820: return s7r.reg4820; + //multiplicand high or divdend lower + case 0x4821: return s7r.reg4821; + //dividend higher + case 0x4822: return s7r.reg4822; + //dividend highest + case 0x4823: return s7r.reg4823; + //multiplier low + case 0x4824: return s7r.reg4824; + //multiplier high + case 0x4825: return s7r.reg4825; + //divisor low + case 0x4826: return s7r.reg4826; + //divisor high + case 0x4827: return s7r.reg4827; + + //result lowest + case 0x4828: + return s7r.reg4828; + //result lower + case 0x4829: + return s7r.reg4829; + //result higher + case 0x482A: + return s7r.reg482A; + //result highest + case 0x482B: + return s7r.reg482B; + //remainder (division) low + case 0x482C: return s7r.reg482C; + //remainder (division) high + case 0x482D: return s7r.reg482D; + //signed/unsigned + case 0x482E: return s7r.reg482E; + //finished flag, emulated as an on-read toggle. + case 0x482F: + if(s7r.reg482F) + { + s7r.reg482F=0; + return 0x80; + } + return 0; + break; + + //SRAM toggle + case 0x4830: + return s7r.reg4830; + //DX bank mapping + case 0x4831: + return s7r.reg4831; + //EX bank mapping + case 0x4832: + return s7r.reg4832; + //FX bank mapping + case 0x4833: + return s7r.reg4833; + //SRAM mapping? We have no clue! + case 0x4834: + return s7r.reg4834; +//RTC enable + case 0x4840: + if(!Settings.SPC7110RTC) + return Address>>8; + return s7r.reg4840; +//command/index/value of RTC (essentially, zero unless we're in read mode + case 0x4841: + if(!Settings.SPC7110RTC) + return Address>>8; + if(rtc_f9.init) + { + S9xUpdateRTC(); + uint8 tmp=rtc_f9.reg[rtc_f9.index]; + rtc_f9.index++; + rtc_f9.index%=0x10; +#ifdef SPC7110_DEBUG + printf("$4841 returned %02X\n", tmp); +#endif + return tmp; + } + else return 0; +//RTC done flag + case 0x4842: + if(!Settings.SPC7110RTC) + return Address>>8; + s7r.reg4842^=0x80; + return s7r.reg4842^0x80; + default: +#ifdef SPC7110_DEBUG + printf("Access to Reg %04X\n", Address); +#endif + return 0x00; + } +} +} +void S9xSetSPC7110 (uint8 data, uint16 Address) +{ +#ifdef SPC7110_DEBUG + printf("%04X written to, value %02X\n", Address, data); +#endif + switch(Address) + { +//Writes to $4800 are undefined. + + //table low, middle, and high. + case 0x4801: + s7r.reg4801=data; + break; + case 0x4802: + s7r.reg4802=data; + break; + case 0x4803: + s7r.reg4803=data; + break; + + //table index (4 byte entries, bigendian with a multiplier byte) + case 0x4804: + s7r.reg4804=data; + break; + + //offset low + case 0x4805: + s7r.reg4805=data; + break; + + //offset high, starts decompression + case 0x4806: + s7r.reg4806=data; +#if 0 + (*Copy7110)(); +#endif + s7r.bank50Internal=0; + s7r.reg480C&=0x7F; + break; + + //DMA channel register (Is it used??) + case 0x4807: + s7r.reg4807=data; + break; + + //C r/w? I have no idea. If you get weird values written here before a bug, + //The Dumper should probably be contacted about running a test. + case 0x4808: + s7r.reg4808=data; + break; + + //C-Length low + case 0x4809: + s7r.reg4809=data; + break; + //C-Length high + case 0x480A: + s7r.reg480A=data; + break; + + //Offset enable + case 0x480B: + { + s7r.reg480B=data; + int table=(s7r.reg4803<<16)|(s7r.reg4802<<8)|s7r.reg4801; + + int j= 4*s7r.reg4804; + j+=s7r.DataRomOffset; + j+=table; + + if(s7r.reg480B==0) + s7r.AlignBy=0; + else + { + switch(CMemory_ROM[j]) + { + case 0x03: + s7r.AlignBy=8; + break; + case 0x01: + s7r.AlignBy=2; + break; + case 0x02: + s7r.AlignBy=4; + break; + case 0x00: + default: + s7r.AlignBy=1; + break; + } + } +// s7r.decomp_set=true; + } + break; +//$4810 is probably read only. + + //Data port address low + case 0x4811: + s7r.reg4811=data; + s7r.written|=0x01; + break; + + //data port address middle + case 0x4812: + s7r.reg4812=data; + s7r.written|=0x02; + break; + + //data port address high + case 0x4813: + s7r.reg4813=data; + s7r.written|=0x04; + break; + + //data port adjust low (has a funky immediate increment mode) + case 0x4814: + s7r.reg4814=data; + if(s7r.reg4818&0x02) + { + if((s7r.reg4818&0x20)&&!(s7r.reg4818&0x40)) + { + s7r.offset_add|=0x01; + if(s7r.offset_add==3) + { + if(s7r.reg4818&0x10) + { + } + else + { + uint32 i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + if(s7r.reg4818&0x08) + { + i+=(signed char)s7r.reg4814; + } + else + { + i+=s7r.reg4814; + } + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + } + } + } + else if((s7r.reg4818&0x40)&&!(s7r.reg4818&0x20)) + { + s7r.offset_add|=0x01; + if(s7r.offset_add==3) + { + if(s7r.reg4818&0x10) + { + } + else + { + uint32 i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + if(s7r.reg4818&0x08) + { + short adj; + adj=((short)(s7r.reg4815<<8))|s7r.reg4814; + i+=adj; + } + else + { + uint16 adj; + adj=(s7r.reg4815<<8)|s7r.reg4814; + i+=adj; + } + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + } + } + + } + } + + s7r.written|=0x08; + break; + + //data port adjust high (has a funky immediate increment mode) + case 0x4815: + s7r.reg4815=data; + if(s7r.reg4818&0x02) + { + if(s7r.reg4818&0x20&&!(s7r.reg4818&0x40)) + { + s7r.offset_add|=0x02; + if(s7r.offset_add==3) + { + if(s7r.reg4818&0x10) + { + } + else + { + uint32 i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + + if(s7r.reg4818&0x08) + { + i+=(signed char)s7r.reg4814; + } + else + { + i+=s7r.reg4814; + } + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + } + } + } + else if(s7r.reg4818&0x40&&!(s7r.reg4818&0x20)) + { + s7r.offset_add|=0x02; + if(s7r.offset_add==3) + { + if(s7r.reg4818&0x10) + { + } + else + { + uint32 i=(s7r.reg4813<<16)|(s7r.reg4812<<8)|s7r.reg4811; + if(s7r.reg4818&0x08) + { + short adj; + adj=((short)(s7r.reg4815<<8))|s7r.reg4814; + i+=adj; + } + else + { + uint16 adj; + adj=(s7r.reg4815<<8)|s7r.reg4814; + i+=adj; + } + i%=s7r.DataRomSize; + s7r.reg4811=i&0x00FF; + s7r.reg4812=(i&0x00FF00)>>8; + s7r.reg4813=((i&0xFF0000)>>16); + } + } + } + } + s7r.written|=0x10; + break; + //data port increment low + case 0x4816: + s7r.reg4816=data; + break; + //data port increment high + case 0x4817: + s7r.reg4817=data; + break; + + //data port mode switches + //note that it starts inactive. + case 0x4818: + if((s7r.written&0x18)!=0x18) + break; + s7r.offset_add=0; + s7r.reg4818=data; + break; + + //multiplicand low or dividend lowest + case 0x4820: + s7r.reg4820=data; + break; + //multiplicand high or dividend lower + case 0x4821: + s7r.reg4821=data; + break; + //dividend higher + case 0x4822: + s7r.reg4822=data; + break; + //dividend highest + case 0x4823: + s7r.reg4823=data; + break; + //multiplier low + case 0x4824: + s7r.reg4824=data; + break; + //multiplier high (triggers operation) + case 0x4825: + s7r.reg4825=data; + if(s7r.reg482E&0x01) + { + int mul; + short m1=(short)((s7r.reg4824)|(s7r.reg4825<<8)); + short m2=(short)((s7r.reg4820)|(s7r.reg4821<<8)); + + mul=m1*m2; + s7r.reg4828=(uint8)(mul&0x000000FF); + s7r.reg4829=(uint8)((mul&0x0000FF00)>>8); + s7r.reg482A=(uint8)((mul&0x00FF0000)>>16); + s7r.reg482B=(uint8)((mul&0xFF000000)>>24); + } + else + { + uint32 mul; + uint16 m1=(uint16)((s7r.reg4824)|(s7r.reg4825<<8)); + uint16 m2=(uint16)((s7r.reg4820)|(s7r.reg4821<<8)); + + mul=m1*m2; + s7r.reg4828=(uint8)(mul&0x000000FF); + s7r.reg4829=(uint8)((mul&0x0000FF00)>>8); + s7r.reg482A=(uint8)((mul&0x00FF0000)>>16); + s7r.reg482B=(uint8)((mul&0xFF000000)>>24); + } + s7r.reg482F=0x80; + break; + //divisor low + case 0x4826: + s7r.reg4826=data; + break; + //divisor high (triggers operation) + case 0x4827: + s7r.reg4827=data; + if(s7r.reg482E&0x01) + { + int quotient; + short remainder; + int dividend=(int)(s7r.reg4820|(s7r.reg4821<<8)|(s7r.reg4822<<16)|(s7r.reg4823<<24)); + short divisor=(short)(s7r.reg4826|(s7r.reg4827<<8)); + if(divisor != 0) + { + quotient=(int)(dividend/divisor); + remainder=(short)(dividend%divisor); + } + else + { + quotient=0; + remainder=dividend&0x0000FFFF; + } + s7r.reg4828=(uint8)(quotient&0x000000FF); + s7r.reg4829=(uint8)((quotient&0x0000FF00)>>8); + s7r.reg482A=(uint8)((quotient&0x00FF0000)>>16); + s7r.reg482B=(uint8)((quotient&0xFF000000)>>24); + s7r.reg482C=(uint8)remainder&0x00FF; + s7r.reg482D=(uint8)((remainder&0xFF00)>>8); + } + else + { + uint32 quotient; + uint16 remainder; + uint32 dividend=(uint32)(s7r.reg4820|(s7r.reg4821<<8)|(s7r.reg4822<<16)|(s7r.reg4823<<24)); + uint16 divisor=(uint16)(s7r.reg4826|(s7r.reg4827<<8)); + if(divisor != 0) + { + quotient=(uint32)(dividend/divisor); + remainder=(uint16)(dividend%divisor); + } + else + { + quotient=0; + remainder=dividend&0x0000FFFF; + } + s7r.reg4828=(uint8)(quotient&0x000000FF); + s7r.reg4829=(uint8)((quotient&0x0000FF00)>>8); + s7r.reg482A=(uint8)((quotient&0x00FF0000)>>16); + s7r.reg482B=(uint8)((quotient&0xFF000000)>>24); + s7r.reg482C=(uint8)remainder&0x00FF; + s7r.reg482D=(uint8)((remainder&0xFF00)>>8); + } + s7r.reg482F=0x80; + break; + //result registers are possibly read-only + + //reset: writes here nuke the whole math unit + //Zero indicates unsigned math, resets with non-zero values turn on signed math + case 0x482E: + s7r.reg4820=s7r.reg4821=s7r.reg4822=s7r.reg4823=s7r.reg4824=s7r.reg4825=s7r.reg4826=s7r.reg4827=s7r.reg4828=s7r.reg4829=s7r.reg482A=s7r.reg482B=s7r.reg482C=s7r.reg482D=0; + s7r.reg482E=data; + break; + + //math status register possibly read only + + //SRAM toggle + case 0x4830: + CMemory_SPC7110Sram(data); + s7r.reg4830=data; + break; + //Bank DX mapping + case 0x4831: + s7r.reg4831=data; + break; + //Bank EX mapping + case 0x4832: + s7r.reg4832=data; + break; + //Bank FX mapping + case 0x4833: + s7r.reg4833=data; + break; + //S-RAM mapping? who knows? + case 0x4834: + s7r.reg4834=data; + break; + //RTC Toggle + case 0x4840: + if(0==data) + { + S9xUpdateRTC(); + // rtc_f9.init=false; + // rtc_f9.index=-1; + } + if(data&0x01) + { + s7r.reg4842=0x80; + //rtc_f9.last_used=time(NULL);//???? + rtc_f9.init=false; + rtc_f9.index=-1; + } + s7r.reg4840=data; + break; + //RTC init/command/index register + case 0x4841: + if(rtc_f9.init) + { + if(-1==rtc_f9.index) + { + rtc_f9.index=data&0x0F; + break; + } + if(rtc_f9.control==0x0C) + { + rtc_f9.index=data&0x0F; + s7r.reg4842=0x80; + rtc_f9.last_used=time(NULL); + } + else + { + + if(0x0D==rtc_f9.index) + { + if(data&0x08) + { + if(rtc_f9.reg[1]<3) + { + S9xUpdateRTC(); + rtc_f9.reg[0]=0; + rtc_f9.reg[1]=0; + rtc_f9.last_used=time(NULL); + } + else + { + S9xUpdateRTC(); + rtc_f9.reg[0]=0; + rtc_f9.reg[1]=0; + rtc_f9.last_used=time(NULL)-60; + S9xUpdateRTC(); + rtc_f9.last_used=time(NULL); + } + data&=0x07; + } + if(rtc_f9.reg[0x0D]&0x01) + { + if(!(data%2)) + { + rtc_f9.reg[rtc_f9.index&0x0F]=data; + rtc_f9.last_used=time(NULL)-1; + S9xUpdateRTC(); + rtc_f9.last_used=time(NULL); + } + } + } + if(0x0F==rtc_f9.index) + { + if(data&0x01&&!(rtc_f9.reg[0x0F]&0x01)) + { + S9xUpdateRTC(); + rtc_f9.reg[0]=0; + rtc_f9.reg[1]=0; + rtc_f9.last_used=time(NULL); + } + if(data&0x02&&!(rtc_f9.reg[0x0F]&0x02)) + { + S9xUpdateRTC(); + rtc_f9.last_used=time(NULL); + } + } + rtc_f9.reg[rtc_f9.index&0x0F]=data; + s7r.reg4842=0x80; + rtc_f9.index=(rtc_f9.index+1)%0x10; + } + } + else + { + if(data==0x03||data==0x0C) + { + rtc_f9.init=true; + rtc_f9.control=data; + rtc_f9.index=-1; + } + } + break; + //writes to RTC status register aren't expected to be meaningful + default: + Address-=0x4800; + break; + //16 BIT MULTIPLIER: ($FF00) high byte, defval:00 + } +} +extern "C"{ +//emulate the SPC7110's ability to remap banks Dx, Ex, and Fx. +uint8 S9xGetSPC7110Byte(uint32 Address) +{ + uint32 i; + switch((Address&0x00F00000)>>16) + { + case 0xD0: + i=s7r.reg4831*0x00100000; + break; + case 0xE0: + i=s7r.reg4832*0x00100000; + break; + case 0xF0: + i=s7r.reg4833*0x00100000; + break; + default:i=0; + } + i+=Address&0x000FFFFF; + i+=s7r.DataRomOffset; + return CMemory_ROM[i]; +} +} +/**********************************************************************************************/ +/* S9xSRTCDaysInMonth() */ +/* Return the number of days in a specific month for a certain year */ +/* copied directly for RTC functionality, separated in case of incompatibilities */ +/**********************************************************************************************/ +int S9xRTCDaysInMonth( int month, int year ) +{ + int mdays; + + switch ( month ) + { + case 2: + if ( ( year % 4 == 0 ) ) // DKJM2 only uses 199x - 22xx + mdays = 29; + else + mdays = 28; + break; + + case 4: + case 6: + case 9: + case 11: + mdays = 30; + break; + + default: // months 1,3,5,7,8,10,12 + mdays = 31; + break; + } + + return mdays; +} + + +#define DAYTICKS (60*60*24) +#define HOURTICKS (60*60) +#define MINUTETICKS 60 + + +/**********************************************************************************************/ +/* S9xUpdateRTC() */ +/* Advance the RTC time */ +/**********************************************************************************************/ + +void S9xUpdateRTC () +{ + time_t cur_systime; + long time_diff; + + // Keep track of game time by computing the number of seconds that pass on the system + // clock and adding the same number of seconds to the RTC clock structure. + + if (rtc_f9.init && 0==(rtc_f9.reg[0x0D]&0x01) && 0==(rtc_f9.reg[0x0F]&0x03)) + { + cur_systime = time (NULL); + + // This method assumes one time_t clock tick is one second + // which should work on PCs and GNU systems. + // If your tick interval is different adjust the + // DAYTICK, HOURTICK, and MINUTETICK defines + + time_diff = (long) (cur_systime - rtc_f9.last_used); + rtc_f9.last_used = cur_systime; + + if ( time_diff > 0 ) + { + int seconds; + int minutes; + int hours; + int days; + int month; + int year; + int temp_days; + + int year_hundreds; + int year_tens; + int year_ones; + + + if ( time_diff > DAYTICKS ) + { + days = time_diff / DAYTICKS; + time_diff = time_diff - days * DAYTICKS; + } + else + { + days = 0; + } + + if ( time_diff > HOURTICKS ) + { + hours = time_diff / HOURTICKS; + time_diff = time_diff - hours * HOURTICKS; + } + else + { + hours = 0; + } + + if ( time_diff > MINUTETICKS ) + { + minutes = time_diff / MINUTETICKS; + time_diff = time_diff - minutes * MINUTETICKS; + } + else + { + minutes = 0; + } + + if ( time_diff > 0 ) + { + seconds = time_diff; + } + else + { + seconds = 0; + } + + + seconds += (rtc_f9.reg[1]*10 + rtc_f9.reg[0]); + if ( seconds >= 60 ) + { + seconds -= 60; + minutes += 1; + } + + minutes += (rtc_f9.reg[3]*10 + rtc_f9.reg[2]); + if ( minutes >= 60 ) + { + minutes -= 60; + hours += 1; + } + + hours += (rtc_f9.reg[5]*10 + rtc_f9.reg[4]); + if ( hours >= 24 ) + { + hours -= 24; + days += 1; + } + + year = rtc_f9.reg[11]*10 + rtc_f9.reg[10]; + year += ( 1900 ); + month = rtc_f9.reg[8]+10*rtc_f9.reg[9]; + rtc_f9.reg[12]+=days; + days += (rtc_f9.reg[7]*10 + rtc_f9.reg[6]); + if ( days > 0 ) + { + while ( days > (temp_days = S9xRTCDaysInMonth( month, year )) ) + { + days -= temp_days; + month += 1; + if ( month > 12 ) + { + year += 1; + month = 1; + } + } + } + + year_tens = year % 100; + year_ones = year_tens % 10; + year_tens /= 10; + year_hundreds = (year - 1000) / 100; + + rtc_f9.reg[0] = seconds % 10; + rtc_f9.reg[1] = seconds / 10; + rtc_f9.reg[2] = minutes % 10; + rtc_f9.reg[3] = minutes / 10; + rtc_f9.reg[4] = hours % 10; + rtc_f9.reg[5] = hours / 10; + rtc_f9.reg[6] = days % 10; + rtc_f9.reg[7] = days / 10; + rtc_f9.reg[8] = month%10; + rtc_f9.reg[9] = month /10; + rtc_f9.reg[10] = year_ones; + rtc_f9.reg[11] = year_tens; + rtc_f9.reg[12] %= 7; + return; + } + } +} +extern "C"{ + +//allows DMA from the ROM (is this even possible on the SPC7110? +uint8* Get7110BasePtr(uint32 Address) +{ + uint32 i; + switch((Address&0x00F00000)>>16) + { + case 0xD0: + i=s7r.reg4831*0x100000; + break; + case 0xE0: + i=s7r.reg4832*0x100000; + break; + case 0xF0: + i=s7r.reg4833*0x100000; + break; + default:i=0; + } + i+=Address&0x000F0000; + return &CMemory_ROM[i]; +} +//end extern +} + +#if 0 +//loads the index into memory. +//index.bin is little-endian +//format index (1)-table(3)-file offset(4)-length(4) +bool Load7110Index(char* filename) +{ + FILE* fp; + uint8 buffer[12]; + int table=0; + uint8 index=0; + uint32 offset=0; + uint32 size=0; + int i=0; + fp=fopen(filename, "rb"); + if(NULL==fp) + return false; + do + { + i=0; + fread(buffer, 1, 12,fp); + table=(buffer[3]<<16)|(buffer[2]<<8)|buffer[1]; + index=buffer[0]; + offset=(buffer[7]<<24)|(buffer[6]<<16)|(buffer[5]<<8)|buffer[4]; + size=(buffer[11]<<24)|(buffer[10]<<16)|(buffer[9]<<8)|buffer[8]; + while(itableEnts[i].table!=table&&decompack->tableEnts[i].table!=0) + i++; + if(i==MAX_TABLES) + return false; + //added + decompack->tableEnts[i].table=table; + //----- + decompack->tableEnts[i].location[index].offset=offset; + decompack->tableEnts[i].location[index].size=size; + decompack->tableEnts[i].location[index].used_len=0; + decompack->tableEnts[i].location[index].used_offset=0; + + } + while(!feof(fp)); + fclose(fp); + return true; +} +#endif + +#if 0 +//Cache 1 load function +void SPC7110Load(char* dirname) +{ + char temp_path[PATH_MAX]; + int i=0; + + decompack=(Pack7110 *)malloc(sizeof(Pack7110));//new Pack7110; + +#ifndef _XBOX + getcwd(temp_path,PATH_MAX); +#endif + + ZeroMemory(decompack, sizeof(Pack7110)); + +#ifndef _XBOX + if(-1==chdir(dirname)) + { + S9xMessage(0,0,"Graphics Pack not found!"); + } +#endif + +#ifndef _XBOX + Load7110Index("index.bin"); +#else + // D:\\ is always app.path in Xbox + Load7110Index("d:\\index.bin"); +#endif + + for(i=0;itableEnts[i].table!=0) + { + char binname[PATH_MAX]; +#ifndef _XBOX + sprintf(binname,"%06X.bin",decompack->tableEnts[i].table); +#else + sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table); +#endif + struct stat buf; + if(-1!=stat(binname, &buf)) + decompack->binfiles[i]=(uint8*)malloc(buf.st_size);//new uint8[buf.st_size]; + FILE* fp=fopen(binname, "rb"); + if(fp) + { + fread(decompack->binfiles[i],buf.st_size,1,fp); + fclose(fp); + } + } + } + +#ifndef _XBOX + chdir(temp_path); +#endif + + Copy7110=&MovePackData; + CleanUp7110=&Del7110Gfx; +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); + #endif +#endif +} +#endif + +#if 0 +//Cache 2 load function +void SPC7110Open(char* dirname) +{ + char temp_path[PATH_MAX]; + int i=0; + + decompack=(Pack7110*)malloc(sizeof(Pack7110)); //new Pack7110; + +#ifndef _XBOX + getcwd(temp_path,PATH_MAX); +#endif + + ZeroMemory(decompack, sizeof(Pack7110)); + +#ifndef _XBOX + if(-1==chdir(dirname)) + { + S9xMessage(0,0,"Graphics Pack not found!"); + } +#endif + +#ifndef _XBOX + Load7110Index("index.bin"); +#else + // D:\\ is always app.path in Xbox + Load7110Index("d:\\index.bin"); +#endif + + for (i=0; ibinfiles[i]=NULL; + + ReadPackData(); + +#ifndef _XBOX + chdir(temp_path); +#endif + + Copy7110=&ReadPackData; + CleanUp7110=&Close7110Gfx; + +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); + #endif +#endif +} +#endif + +//Cache 3's load function +#if 0 +void SPC7110Grab(char* dirname) +{ + char temp_path[PATH_MAX]; + int i=0; + + decompack=(Pack7110*)malloc(sizeof(Pack7110)); //new Pack7110; + +#ifndef _XBOX + getcwd(temp_path,PATH_MAX); +#endif + + int32 buffer_size=1024*1024*cacheMegs;//*some setting + + ZeroMemory(decompack, sizeof(Pack7110)); +#ifndef _XBOX + + if(-1==chdir(dirname)) + { + S9xMessage(0,0,"Graphics Pack not found!"); + } +#endif + +#ifndef _XBOX + Load7110Index("index.bin"); +#else + // D:\\ is always app.path in Xbox + Load7110Index("d:\\index.bin"); +#endif + + for(i=0;itableEnts[i].table!=0) + { + char binname[PATH_MAX]; +#ifndef _XBOX + sprintf(binname,"%06X.bin",decompack->tableEnts[i].table); +#else + sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table); +#endif + struct stat buf; +//add load/no load calculations here + if(-1!=stat(binname, &buf)) + { + if(buf.st_sizebinfiles[i]=(uint8*)malloc(buf.st_size); //new uint8[buf.st_size]; + FILE* fp=fopen(binname, "rb"); + //use them here + if(fp) + { + if(buf.st_sizebinfiles[i],buf.st_size,1,fp); + fclose(fp); + buffer_size-=buf.st_size; + decompack->tableEnts[i].is_file=false; + } + else + { + decompack->binfiles[i]=(uint8*)fp; + decompack->tableEnts[i].is_file=true; + } + } + } + } + } + +#ifndef _XBOX + chdir(temp_path); +#endif + + Copy7110=&GetPackData; + CleanUp7110=&Drop7110Gfx; + + +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED); + #endif +#endif +} +#endif + +#if 0 +//Cache 1 clean up function +static void Del7110Gfx() +{ + int i; + if(Settings.SPC7110) + { +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); + #endif +#endif + Do7110Logging(); + } + for(i=0;ibinfiles[i]!=NULL) + { + free(decompack->binfiles[i]);//delete []decompack->binfiles[i]; + decompack->binfiles[i]=NULL; + } + } + Settings.SPC7110=false; + Settings.SPC7110RTC=false; + if(NULL!=decompack) + free(decompack);// delete decompack; + decompack=NULL; + CleanUp7110=NULL; + Copy7110=NULL; +} +#endif + +#if 0 +//Cache2 cleanup function +void Close7110Gfx() +{ + int i; + if(Settings.SPC7110) + { +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); + #endif +#endif + Do7110Logging(); + } + for(i=0;ibinfiles[i]!=NULL) + { + fclose((FILE*)decompack->binfiles[i]); + decompack->binfiles[i]=NULL; + } + } + Settings.SPC7110=false; + Settings.SPC7110RTC=false; + if(NULL!=decompack) + free(decompack); //delete decompack; + decompack=NULL; + CleanUp7110=NULL; + Copy7110=NULL; +} +#endif + +#if 0 +//cache 3's clean-up code +void Drop7110Gfx() +{ + int i; + if(Settings.SPC7110) + { +#ifdef __WIN32__ + #ifndef _XBOX + EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED); + #endif +#endif + Do7110Logging(); + } + for(i=0;ibinfiles[i]!=NULL) + { + if(decompack->tableEnts[i].is_file) + { + fclose((FILE*)decompack->binfiles[i]); + decompack->binfiles[i]=NULL; + } + else + { + free(decompack->binfiles[i]); //delete []decompack->binfiles[i]; + decompack->binfiles[i]=NULL; + } + } + } + Settings.SPC7110=false; + Settings.SPC7110RTC=false; + if(NULL!=decompack) + free(decompack); //delete decompack; + decompack=NULL; + CleanUp7110=NULL; + Copy7110=NULL; +} +#endif + +//emulate a reset. +void S9xSpc7110Reset() +{ + s7r.reg4800=0; + s7r.reg4801=0; + s7r.reg4802=0; + s7r.reg4803=0; + s7r.reg4804=0; + s7r.reg4805=0; + s7r.reg4806=0; + s7r.reg4807=0; + s7r.reg4808=0; + s7r.reg4809=0; + s7r.reg480A=0; + s7r.reg480B=0; + s7r.reg480C=0; + s7r.reg4811=0; + s7r.reg4812=0; + s7r.reg4813=0; + s7r.reg4814=0; + s7r.reg4815=0; + s7r.reg4816=0; + s7r.reg4817=0; + s7r.reg4818=0; + s7r.reg4820=0; + s7r.reg4821=0; + s7r.reg4822=0; + s7r.reg4823=0; + s7r.reg4824=0; + s7r.reg4825=0; + s7r.reg4826=0; + s7r.reg4827=0; + s7r.reg4828=0; + s7r.reg4829=0; + s7r.reg482A=0; + s7r.reg482B=0; + s7r.reg482C=0; + s7r.reg482D=0; + s7r.reg482E=0; + s7r.reg482F=0; + s7r.reg4830=0; + s7r.reg4831=0; + s7r.reg4832=1; + s7r.reg4833=2; + s7r.reg4834=0; + s7r.reg4840=0; + s7r.reg4841=0; + s7r.reg4842=0; + s7r.written=0; + s7r.offset_add=0; + s7r.AlignBy=1; + s7r.bank50Internal=0; + memset(s7r.bank50,0x00,DECOMP_BUFFER_SIZE); +} + + +#if 0 +//outputs a cumulative log for the game. +//there's nothing really weird here, just +//reading the old log, and writing a new one. +//note the logs are explicitly little-endian, not host byte order. +static void Do7110Logging() +{ + uint8 ent_temp; + FILE* flog; + int entries=0; + + if(Settings.SPC7110) + { + //flush last read into logging + (*Copy7110)(); + + if(!strncmp((char*)&CMemory_ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) + { +#ifdef _XBOX + flog=fopen("T:\\spl4-sp7.dat","rb"); +#else + flog=fopen("spl4-sp7.dat","rb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "MOMOTETSU HAPPY ",21)) + { +#ifdef _XBOX + flog=fopen("T:\\smht-sp7.dat","rb"); +#else + flog=fopen("smht-sp7.dat","rb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) + { +#ifdef _XBOX + flog=fopen("T:\\feoezsp7.dat","rb"); +#else + flog=fopen("feoezsp7.dat","rb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) + { +#ifdef _XBOX + flog=fopen("T:\\sjumpsp7.dat","rb"); +#else + flog=fopen("sjumpsp7.dat","rb"); +#endif + } + else + { +#ifdef _XBOX + flog=fopen("T:\\misc-sp7.dat","rb"); +#else + flog=fopen("misc-sp7.dat","rb"); +#endif + } + + if(flog) + { + uint8 buffer[8]; + int table=0; + uint16 offset=0; + uint16 length=0; + fseek(flog, 35,0); + do + { + int i=0; + Data7110 *log=NULL; + fread(buffer, 1, 8, flog); + table=buffer[0]|(buffer[1]<<8)|(buffer[2]<<16); + offset=buffer[6]|(buffer[7]<<8); + length=buffer[4]|(buffer[5]<<8); + while(itableEnts[i].table==table) + { + log=&(decompack->tableEnts[i].location[(buffer[3])]); + if((log->used_offset+log->used_len)<(offset+length)) + { + log->used_offset=offset; + log->used_len=length; + } + } + i++; + } + } + while(!feof(flog)); + fclose(flog); + } + + + if(!strncmp((char*)&CMemory_ROM [0xffc0], "SUPER POWER LEAG 4 ", 21)) + { +#ifdef _XBOX // cwd could be the dvd-rom, so write to T:\\ which is storage region for each title + flog=fopen("T:\\spl4-sp7.dat","wb"); +#else + flog=fopen("spl4-sp7.dat","wb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "MOMOTETSU HAPPY ",21)) + { +#ifdef _XBOX + flog=fopen("T:\\smht-sp7.dat","wb"); +#else + flog=fopen("smht-sp7.dat","wb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21)) + { +#ifdef _XBOX + flog=fopen("T:\\feoezsp7.dat","wb"); +#else + flog=fopen("feoezsp7.dat","wb"); +#endif + } + else if(!strncmp((char*)&CMemory_ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21)) + { +#ifdef _XBOX + flog=fopen("T:\\sjumpsp7.dat","wb"); +#else + flog=fopen("sjumpsp7.dat","wb"); +#endif + } + else + { +#ifdef _XBOX + flog=fopen("T:\\misc-sp7.dat","wb"); +#else + flog=fopen("misc-sp7.dat","wb"); +#endif + } + //count entries + if(flog) + { + int j=0; + int temp=0; + for(j=0;jtableEnts[j].location[k].used_len!=0) + entries++; + } + } + ent_temp=entries&0xFF; + fwrite(&ent_temp,1,1,flog); + ent_temp=(entries>>8)&0xFF; + fwrite(&ent_temp,1,1,flog); + ent_temp=(entries>>16)&0xFF; + fwrite(&ent_temp,1,1,flog); + ent_temp=(entries>>24)&0xFF; + fwrite(&ent_temp,1,1,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + + ent_temp=0; + fwrite(&ent_temp,1,1,flog); + ent_temp=0; + fwrite(&ent_temp,1,1,flog); + ent_temp=0; + fwrite(&ent_temp,1,1,flog); + + for(j=0;jtableEnts[j].location[k].used_len!=0) + { + ent_temp=decompack->tableEnts[j].table&0xFF; + fwrite(&ent_temp,1,1,flog);//801 + ent_temp=(decompack->tableEnts[j].table>>8)&0xFF;; + fwrite(&ent_temp,1,1,flog);//802 + ent_temp=(decompack->tableEnts[j].table>>16)&0xFF;; + fwrite(&ent_temp,1,1,flog);//803 + ent_temp=k&0xFF; + fwrite(&ent_temp,1,1,flog);//804 + ent_temp=decompack->tableEnts[j].location[k].used_len&0xFF; + fwrite(&ent_temp,1,1,flog);//lsb of + ent_temp=(decompack->tableEnts[j].location[k].used_len>>8)&0xFF; + fwrite(&ent_temp,1,1,flog);//msb of + ent_temp=(decompack->tableEnts[j].location[k].used_offset)&0xFF; + fwrite(&ent_temp,1,1,flog);//lsb of + ent_temp=(decompack->tableEnts[j].location[k].used_offset>>8)&0xFF; + fwrite(&ent_temp,1,1,flog);//msb of + } + } + } + fwrite(&temp,1,4,flog); + fwrite(&temp,1,4,flog); + fclose(flog); + } + } +} +#endif + +bool8 S9xSaveSPC7110RTC (S7RTC *rtc_f9) +{ + FILE* fp; + + if((fp=fopen(S9xGetFilename(".rtc"), "wb"))==NULL) + return (FALSE); + int i=0; + uint8 temp=0; + for (i=0;i<16;i++) + fwrite(&rtc_f9->reg[i],1,1,fp); + temp=rtc_f9->index&0x00FF; + fwrite(&temp,1,1,fp); + temp=(rtc_f9->index)>>8; + fwrite(&temp,1,1,fp); + temp=(uint8)rtc_f9->control; + fwrite(&temp,1,1,fp); + temp=(uint8)rtc_f9->init; + fwrite(&temp,1,1,fp); + temp=rtc_f9->last_used&0x00FF; + fwrite(&temp,1,1,fp); + temp=(rtc_f9->last_used>>8)&0x00FF; + fwrite(&temp,1,1,fp); + temp=(rtc_f9->last_used>>16)&0x00FF; + fwrite(&temp,1,1,fp); + temp=(rtc_f9->last_used>>24)&0x00FF;; + fwrite(&temp,1,1,fp); + fclose(fp); + return (TRUE); +} + +bool8 S9xLoadSPC7110RTC (S7RTC *rtc_f9) +{ + FILE* fp; + + if((fp=fopen(S9xGetFilename(".rtc"), "rb"))==NULL) + return (FALSE); + for (int i=0; i<16;i++) + { + fread(&(rtc_f9->reg[i]),1,1,fp); + } + uint8 temp=0; + fread(&temp,1,1,fp); + rtc_f9->index=temp; + fread(&temp,1,1,fp); + rtc_f9->index|=(temp<<8); + fread(&rtc_f9->control,1,1,fp); + fread(&rtc_f9->init,1,1,fp); + + fread(&temp,1,1,fp); + rtc_f9->last_used=temp; + fread(&temp,1,1,fp); + rtc_f9->last_used|=(temp<<8); + fread(&temp,1,1,fp); + rtc_f9->last_used|=(temp<<16); + fread(&temp,1,1,fp); + rtc_f9->last_used|=(temp<<24); + fclose(fp); + return (TRUE); +} + diff --git a/src/spccycles.cpp b/src/spccycles.cpp new file mode 100644 index 0000000..3cb572e --- /dev/null +++ b/src/spccycles.cpp @@ -0,0 +1,110 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + +static uint8 spc700cycles [256] = +{ + /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, */ + /* 00 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 6, 8, + /* 10 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 4, 6, + /* 20 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 4, 5, 4, + /* 30 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 6, 5, 2, 2, 3, 8, + /* 40 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 6, 6, + /* 50 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 4, 5, 2, 2, 4, 3, + /* 60 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 4, 5, 5, + /* 70 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 6, + /* 80 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 6, 5, 4, 5, 2, 4, 5, + /* 90 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2,12, 5, + /* a0 */ 3, 8, 4, 5, 3, 4, 3, 6, 2, 6, 4, 4, 5, 2, 4, 4, + /* b0 */ 2, 8, 4, 5, 4, 5, 5, 6, 5, 5, 5, 5, 2, 2, 3, 4, + /* c0 */ 3, 8, 4, 5, 4, 5, 4, 7, 2, 5, 6, 4, 5, 2, 4, 9, + /* d0 */ 2, 8, 4, 5, 5, 6, 6, 7, 4, 5, 4, 5, 2, 2, 6, 3, + /* e0 */ 2, 8, 4, 5, 3, 4, 3, 6, 2, 4, 5, 3, 4, 3, 4, 3, + /* f0 */ 2, 8, 4, 5, 4, 5, 5, 6, 3, 4, 5, 4, 2, 2, 4, 3 +}; + diff --git a/src/spctool.cpp b/src/spctool.cpp new file mode 100644 index 0000000..36f09f8 --- /dev/null +++ b/src/spctool.cpp @@ -0,0 +1,192 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include "snes9x.h" +#include "spctool/dsp.h" +#include "spctool/spc700.h" +#include "spctool/soundmod.h" +#include "apu.h" + +bool8 S9xOpenSoundDevice (int, bool8, int); + +void S9xSetPlaybackRate (uint32 rate) +{ + DOpt SmpOpt; + + SmpOpt.Smp8bit=false; + SmpOpt.SmpMono=false; + SmpOpt.IntType=IntC; + SmpOpt.OldBRE=false; + SmpOpt.MixRout=1; + SetSPUOpt (rate, SmpOpt); + +// so.playback_rate = playback_rate; +// so.err_rate = (uint32) (SNES_SCANLINE_TIME * FIXED_POINT / (1.0 / (double) so.playback_rate)); + } + +bool8 S9xSetSoundMute (bool8 mute) +{ + return (TRUE); +} + +START_EXTERN_C +bool8 S9xInitSound (int mode, bool8 stereo, int buffer_size) +{ + if (!(mode & 7)) + return (TRUE); + + S9xSetSoundMute (TRUE); + if (!S9xOpenSoundDevice (mode, stereo, buffer_size)) + { + S9xMessage (S9X_ERROR, S9X_SOUND_DEVICE_OPEN_FAILED, + "Sound device open failed"); + return (FALSE); + } + return (TRUE); +} + +void TraceSPC (unsigned char *PC, unsigned short YA, unsigned char X, + SPCFlags PS, unsigned char *SP) +{ + APURegisters.YA.W = YA; + APURegisters.X = X; + APURegisters.S = SP - IAPU.RAM; + IAPU.PC = PC; + IAPU._Carry = PS.C; + IAPU._Zero = !PS.Z | (PS.N << 7); + IAPU._Overflow = PS.V; + APURegisters.P = *(uint8 *) &PS; + S9xTraceAPU (); +} + +bool8 S9xInitAPU () +{ + void *SPCBase; //Base pointer and aligned pointer to SPC RAM + + SPCBase=malloc(131072); //Allocate memory for SPC RAM + memset(SPCBase, 0, 131072); + + IAPU.RAM=(uint8 *) InitSPU(SPCBase); //Initialize SPU w/ ptr to SPC RAM (Call only once) + + S9xSetPlaybackRate (22000); + ResetSPU(20); //Reset SPU with pre-amp level of 30 +// _SetSPCDbg(TraceSPC); //Install debug handler + return (TRUE); +} + +void S9xResetAPU () +{ + ResetSPU(20); + IAPU.RAM [0xf1] = 0x80; + _FixSPC (0xffc0, 0, 0, 0, 0, 0xff); +// FixDSP (); +} + +extern "C" void EDSP (uint8 *, int32); + +void S9xMixSamplesO (uint8 *buffer, int sample_count, int byte_offset) +{ +// _EmuDSP (buffer + byte_offset, sample_count / 2); + + EDSP (buffer + byte_offset, sample_count / 2); +#if 0 +for (int i = 0; i < 32; i++) +printf ("%02x,", *(buffer + byte_offset + i)); +printf ("\n"); +#endif +} +END_EXTERN_C + +void S9xFixSoundAfterSnapshotLoad () +{ +} + +void S9xSetSoundControl (int) +{ +} + diff --git a/src/srtc.cpp b/src/srtc.cpp new file mode 100644 index 0000000..65f6168 --- /dev/null +++ b/src/srtc.cpp @@ -0,0 +1,577 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ +#include +#include "snes9x.h" +#include "srtc.h" +#include "memmap.h" + +/*** The format of the rtc_data structure is: + +Index Description Range (nibble) +----- -------------- --------------------------------------- + + 0 Seconds low 0-9 + 1 Seconds high 0-5 + + 2 Minutes low 0-9 + 3 Minutes high 0-5 + + 4 Hour low 0-9 + 5 Hour high 0-2 + + 6 Day low 0-9 + 7 Day high 0-3 + + 8 Month 1-C (0xC is December, 12th month) + + 9 Year ones 0-9 + A Year tens 0-9 + B Year High 9-B (9=19xx, A=20xx, B=21xx) + + C Day of week 0-6 (0=Sunday, 1=Monday,...,6=Saturday) + +***/ + +SRTC_DATA rtc; + + +static int month_keys[12] = { 1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 }; + + +/********************************************************************************************* + * + * Note, if you are doing a save state for this game: + * + * On save: + * + * Call S9xUpdateSrtcTime and save the rtc data structure. + * + * On load: + * + * restore the rtc data structure + * rtc.system_timestamp = time (NULL); + * + * + *********************************************************************************************/ + + +void S9xResetSRTC () +{ + rtc.index = -1; + rtc.mode = MODE_READ; +} + +void S9xHardResetSRTC () +{ + ZeroMemory (&rtc, sizeof (rtc)); + rtc.index = -1; + rtc.mode = MODE_READ; + rtc.count_enable = FALSE; + rtc.needs_init = TRUE; + + // Get system timestamp + rtc.system_timestamp = time (NULL); +} + +/**********************************************************************************************/ +/* S9xSRTCComputeDayOfWeek() */ +/* Return 0-6 for Sunday-Saturday */ +/**********************************************************************************************/ +unsigned int S9xSRTCComputeDayOfWeek () +{ + unsigned year = rtc.data[10]*10 + rtc.data[9]; + unsigned month = rtc.data[8]; + unsigned day = rtc.data[7]*10 + rtc.data[6]; + unsigned day_of_week; + + year += (rtc.data[11] - 9) * 100; + + // Range check the month for valid array indicies + if ( month > 12 ) + month = 1; + + day_of_week = year + (year / 4) + month_keys[month-1] + day - 1; + + if(( year % 4 == 0 ) && ( month <= 2 ) ) + day_of_week--; + + day_of_week %= 7; + + return day_of_week; +} + + +/**********************************************************************************************/ +/* S9xSRTCDaysInMonth() */ +/* Return the number of days in a specific month for a certain year */ +/**********************************************************************************************/ +int S9xSRTCDaysInMmonth( int month, int year ) +{ + int mdays; + + switch ( month ) + { + case 2: + if ( ( year % 4 == 0 ) ) // DKJM2 only uses 199x - 22xx + mdays = 29; + else + mdays = 28; + break; + + case 4: + case 6: + case 9: + case 11: + mdays = 30; + break; + + default: // months 1,3,5,7,8,10,12 + mdays = 31; + break; + } + + return mdays; +} + + +#define DAYTICKS (60*60*24) +#define HOURTICKS (60*60) +#define MINUTETICKS 60 + + +/**********************************************************************************************/ +/* S9xUpdateSrtcTime() */ +/* Advance the S-RTC time if counting is enabled */ +/**********************************************************************************************/ +void S9xUpdateSrtcTime () +{ + time_t cur_systime; + long time_diff; + + // Keep track of game time by computing the number of seconds that pass on the system + // clock and adding the same number of seconds to the S-RTC clock structure. + // I originally tried using mktime and localtime library functions to keep track + // of time but some of the GNU time functions fail when the year goes to 2099 + // (and maybe less) and this would have caused a bug with DKJM2 so I'm doing + // it this way to get around that problem. + + // Note: Dai Kaijyu Monogatari II only allows dates in the range 1996-21xx. + + if (rtc.count_enable && !rtc.needs_init) + { + cur_systime = time (NULL); + + // This method assumes one time_t clock tick is one second + // which should work on PCs and GNU systems. + // If your tick interval is different adjust the + // DAYTICK, HOURTICK, and MINUTETICK defines + + time_diff = (long) (cur_systime - rtc.system_timestamp); + rtc.system_timestamp = cur_systime; + + if ( time_diff > 0 ) + { + int seconds; + int minutes; + int hours; + int days; + int month; + int year; + int temp_days; + + int year_hundreds; + int year_tens; + int year_ones; + + + if ( time_diff > DAYTICKS ) + { + days = time_diff / DAYTICKS; + time_diff = time_diff - days * DAYTICKS; + } + else + { + days = 0; + } + + if ( time_diff > HOURTICKS ) + { + hours = time_diff / HOURTICKS; + time_diff = time_diff - hours * HOURTICKS; + } + else + { + hours = 0; + } + + if ( time_diff > MINUTETICKS ) + { + minutes = time_diff / MINUTETICKS; + time_diff = time_diff - minutes * MINUTETICKS; + } + else + { + minutes = 0; + } + + if ( time_diff > 0 ) + { + seconds = time_diff; + } + else + { + seconds = 0; + } + + + seconds += (rtc.data[1]*10 + rtc.data[0]); + if ( seconds >= 60 ) + { + seconds -= 60; + minutes += 1; + } + + minutes += (rtc.data[3]*10 + rtc.data[2]); + if ( minutes >= 60 ) + { + minutes -= 60; + hours += 1; + } + + hours += (rtc.data[5]*10 + rtc.data[4]); + if ( hours >= 24 ) + { + hours -= 24; + days += 1; + } + + if ( days > 0 ) + { + year = rtc.data[10]*10 + rtc.data[9]; + year += ( 1000 + rtc.data[11] * 100 ); + + month = rtc.data[8]; + days += (rtc.data[7]*10 + rtc.data[6]); + while ( days > (temp_days = S9xSRTCDaysInMmonth( month, year )) ) + { + days -= temp_days; + month += 1; + if ( month > 12 ) + { + year += 1; + month = 1; + } + } + + year_tens = year % 100; + year_ones = year_tens % 10; + year_tens /= 10; + year_hundreds = (year - 1000) / 100; + + rtc.data[6] = days % 10; + rtc.data[7] = days / 10; + rtc.data[8] = month; + rtc.data[9] = year_ones; + rtc.data[10] = year_tens; + rtc.data[11] = year_hundreds; + rtc.data[12] = S9xSRTCComputeDayOfWeek (); + } + + rtc.data[0] = seconds % 10; + rtc.data[1] = seconds / 10; + rtc.data[2] = minutes % 10; + rtc.data[3] = minutes / 10; + rtc.data[4] = hours % 10; + rtc.data[5] = hours / 10; + + return; + } + } +} + + +/**********************************************************************************************/ +/* S9xSetSRTC() */ +/* This function sends data to the S-RTC used in Dai Kaijyu Monogatari II */ +/**********************************************************************************************/ +void S9xSetSRTC (uint8 data, uint16 Address) +{ + + data &= 0x0F; // Data is only 4-bits, mask out unused bits. + + if( data >= 0xD ) + { + // It's an RTC command + + switch ( data ) + { + case 0xD: + rtc.mode = MODE_READ; + rtc.index = -1; + break; + + case 0xE: + rtc.mode = MODE_COMMAND; + break; + + default: + // Ignore the write if it's an 0xF ??? + // Probably should switch back to read mode -- but this + // sequence never occurs in DKJM2 + break; + } + + return; + } + + if ( rtc.mode == MODE_LOAD_RTC ) + { + if ( (rtc.index >= 0) || (rtc.index < MAX_RTC_INDEX) ) + { + rtc.data[rtc.index++] = data; + + if ( rtc.index == MAX_RTC_INDEX ) + { + // We have all the data for the RTC load + + rtc.system_timestamp = time (NULL); // Get local system time + + // Get the day of the week + rtc.data[rtc.index++] = S9xSRTCComputeDayOfWeek (); + + // Start RTC counting again + rtc.count_enable = TRUE; + rtc.needs_init = FALSE; + } + + return; + } + else + { + // Attempting to write too much data + // error(); // ignore?? + } + } + else if ( rtc.mode == MODE_COMMAND ) + { + switch( data ) + { + case COMMAND_CLEAR_RTC: + // Disable RTC counter + rtc.count_enable = FALSE; + + ZeroMemory (rtc.data, MAX_RTC_INDEX+1); + rtc.index = -1; + rtc.mode = MODE_COMMAND_DONE; + break; + + case COMMAND_LOAD_RTC: + // Disable RTC counter + rtc.count_enable = FALSE; + + rtc.index = 0; // Setup for writing + rtc.mode = MODE_LOAD_RTC; + break; + + default: + rtc.mode = MODE_COMMAND_DONE; + // unrecognized command - need to implement. + } + + return; + } + else + { + if ( rtc.mode == MODE_READ ) + { + // Attempting to write while in read mode. Ignore. + } + + if ( rtc.mode == MODE_COMMAND_DONE ) + { + // Maybe this isn't an error. Maybe we should kick off + // a new E command. But is this valid? + } + } +} + +/**********************************************************************************************/ +/* S9xGetSRTC() */ +/* This function retrieves data from the S-RTC */ +/**********************************************************************************************/ +uint8 S9xGetSRTC (uint16 Address) +{ + if ( rtc.mode == MODE_READ ) + { + if ( rtc.index < 0 ) + { + S9xUpdateSrtcTime (); // Only update it if the game reads it + rtc.index++; + return ( 0x0f ); // Send start marker. + } + else if (rtc.index > MAX_RTC_INDEX) + { + rtc.index = -1; // Setup for next set of reads + return ( 0x0f ); // Data done marker. + } + else + { + // Feed out the data + return rtc.data[rtc.index++]; + } + } + else + { + return 0x0; + } +} + +void S9xSRTCPreSaveState () +{ + if (Settings.SRTC) + { + S9xUpdateSrtcTime (); + + int s = CMemory_SRAMSize ? + (1 << (CMemory_SRAMSize + 3)) * 128 : 0; + if (s > 0x20000) + s = 0x20000; + + CMemory_SRAM [s + 0] = rtc.needs_init; + CMemory_SRAM [s + 1] = rtc.count_enable; + memmove (&CMemory_SRAM [s + 2], rtc.data, MAX_RTC_INDEX + 1); + CMemory_SRAM [s + 3 + MAX_RTC_INDEX] = rtc.index; + CMemory_SRAM [s + 4 + MAX_RTC_INDEX] = rtc.mode; + +#ifdef LSB_FIRST + memmove (&CMemory_SRAM [s + 5 + MAX_RTC_INDEX], &rtc.system_timestamp, 8); +#else + CMemory_SRAM [s + 5 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 0); + CMemory_SRAM [s + 6 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 8); + CMemory_SRAM [s + 7 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 16); + CMemory_SRAM [s + 8 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 24); + CMemory_SRAM [s + 9 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 32); + CMemory_SRAM [s + 10 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 40); + CMemory_SRAM [s + 11 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 48); + CMemory_SRAM [s + 12 + MAX_RTC_INDEX] = (uint8) (rtc.system_timestamp >> 56); +#endif + } +} + +void S9xSRTCPostLoadState () +{ + if (Settings.SRTC) + { + int s = CMemory_SRAMSize ? + (1 << (CMemory_SRAMSize + 3)) * 128 : 0; + if (s > 0x20000) + s = 0x20000; + + rtc.needs_init = CMemory_SRAM [s + 0]; + rtc.count_enable = CMemory_SRAM [s + 1]; + memmove (rtc.data, &CMemory_SRAM [s + 2], MAX_RTC_INDEX + 1); + rtc.index = CMemory_SRAM [s + 3 + MAX_RTC_INDEX]; + rtc.mode = CMemory_SRAM [s + 4 + MAX_RTC_INDEX]; + +#ifdef LSB_FIRST + memmove (&rtc.system_timestamp, &CMemory_SRAM [s + 5 + MAX_RTC_INDEX], 8); +#else + rtc.system_timestamp |= (CMemory_SRAM [s + 5 + MAX_RTC_INDEX] << 0); + rtc.system_timestamp |= (CMemory_SRAM [s + 6 + MAX_RTC_INDEX] << 8); + rtc.system_timestamp |= (CMemory_SRAM [s + 7 + MAX_RTC_INDEX] << 16); + rtc.system_timestamp |= (CMemory_SRAM [s + 8 + MAX_RTC_INDEX] << 24); + rtc.system_timestamp |= (CMemory_SRAM [s + 9 + MAX_RTC_INDEX] << 32); + rtc.system_timestamp |= (CMemory_SRAM [s + 10 + MAX_RTC_INDEX] << 40); + rtc.system_timestamp |= (CMemory_SRAM [s + 11 + MAX_RTC_INDEX] << 48); + rtc.system_timestamp |= (CMemory_SRAM [s + 12 + MAX_RTC_INDEX] << 56); +#endif + S9xUpdateSrtcTime (); + } +} + diff --git a/src/tile.cpp b/src/tile.cpp new file mode 100644 index 0000000..c237d68 --- /dev/null +++ b/src/tile.cpp @@ -0,0 +1,1469 @@ +/******************************************************************************* + Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. + + (c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and + Jerremy Koot (jkoot@snes9x.com) + + (c) Copyright 2001 - 2004 John Weidman (jweidman@slip.net) + + (c) Copyright 2002 - 2004 Brad Jorsch (anomie@users.sourceforge.net), + funkyass (funkyass@spam.shaw.ca), + Joel Yliluoma (http://iki.fi/bisqwit/) + Kris Bleakley (codeviolation@hotmail.com), + Matthew Kendora, + Nach (n-a-c-h@users.sourceforge.net), + Peter Bortas (peter@bortas.org) and + zones (kasumitokoduck@yahoo.com) + + C4 x86 assembler and some C emulation code + (c) Copyright 2000 - 2003 zsKnight (zsknight@zsnes.com), + _Demo_ (_demo_@zsnes.com), and Nach + + C4 C++ code + (c) Copyright 2003 Brad Jorsch + + DSP-1 emulator code + (c) Copyright 1998 - 2004 Ivar (ivar@snes9x.com), _Demo_, Gary Henderson, + John Weidman, neviksti (neviksti@hotmail.com), + Kris Bleakley, Andreas Naive + + DSP-2 emulator code + (c) Copyright 2003 Kris Bleakley, John Weidman, neviksti, Matthew Kendora, and + Lord Nightmare (lord_nightmare@users.sourceforge.net + + OBC1 emulator code + (c) Copyright 2001 - 2004 zsKnight, pagefault (pagefault@zsnes.com) and + Kris Bleakley + Ported from x86 assembler to C by sanmaiwashi + + SPC7110 and RTC C++ emulator code + (c) Copyright 2002 Matthew Kendora with research by + zsKnight, John Weidman, and Dark Force + + S-DD1 C emulator code + (c) Copyright 2003 Brad Jorsch with research by + Andreas Naive and John Weidman + + S-RTC C emulator code + (c) Copyright 2001 John Weidman + + ST010 C++ emulator code + (c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora + + Super FX x86 assembler emulator code + (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault + + Super FX C emulator code + (c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman + + + SH assembler code partly based on x86 assembler code + (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se) + + + Specific ports contains the works of other authors. See headers in + individual files. + + Snes9x homepage: http://www.snes9x.com + + Permission to use, copy, modify and distribute Snes9x in both binary and + source form, for non-commercial purposes, is hereby granted without fee, + providing that this license information and copyright notice appear with + all copies and any derived work. + + This software is provided 'as-is', without any express or implied + warranty. In no event shall the authors be held liable for any damages + arising from the use of this software. + + Snes9x is freeware for PERSONAL USE only. Commercial users should + seek permission of the copyright holders first. Commercial use includes + charging money for Snes9x or software derived from Snes9x. + + The copyright holders request that bug fixes and improvements to the code + should be forwarded to them so everyone can benefit from the modifications + in future versions. + + Super NES and Super Nintendo Entertainment System are trademarks of + Nintendo Co., Limited and its subsidiary companies. +*******************************************************************************/ + + +#include "snes9x.h" + +#include "snes4all.h" + +#include "memmap.h" +#include "ppu.h" +#include "display.h" +#include "gfx.h" +#include "tile.h" + +//#define USE_OLD_WRITE_PIXEL +//#define USE_OLD_DRAW_TILE +//#undef TILES_INLINE + +extern uint32 HeadMask [4]; +extern uint32 TailMask [5]; + +#ifdef TILES_INLINE +#define STATIC_INLINE static __inline__ +#else +#define STATIC_INLINE static +#endif + + +uint8 ConvertTile (uint8 *pCache, uint32 TileAddr) +{ +//printf("ConvertTile(%i), shift=%i\n",TileAddr, BG.BitShift); + register uint8 *tp = &CMemory_VRAM[TileAddr]; + uint32 *p = (uint32 *) pCache; + uint32 non_zero = 0; + uint8 line; + + switch (BG.BitShift) + { + case 8: + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; + +#if defined(DREAMCAST) && defined(USE_CONVERTILE_PREFETCH) + asm("pref @%0" : : "r" (tp + 32)); +#endif + if ((pix = *(tp + 0))) + { + p1 |= odd_high[0][pix >> 4]; + p2 |= odd_low[0][pix & 0xf]; + } + if ((pix = *(tp + 1))) + { + p1 |= even_high[0][pix >> 4]; + p2 |= even_low[0][pix & 0xf]; + } + if ((pix = *(tp + 16))) + { + p1 |= odd_high[1][pix >> 4]; + p2 |= odd_low[1][pix & 0xf]; + } + if ((pix = *(tp + 17))) + { + p1 |= even_high[1][pix >> 4]; + p2 |= even_low[1][pix & 0xf]; + } + if ((pix = *(tp + 32))) + { + p1 |= odd_high[2][pix >> 4]; + p2 |= odd_low[2][pix & 0xf]; + } + if ((pix = *(tp + 33))) + { + p1 |= even_high[2][pix >> 4]; + p2 |= even_low[2][pix & 0xf]; + } + if ((pix = *(tp + 48))) + { + p1 |= odd_high[3][pix >> 4]; + p2 |= odd_low[3][pix & 0xf]; + } + if ((pix = *(tp + 49))) + { + p1 |= even_high[3][pix >> 4]; + p2 |= even_low[3][pix & 0xf]; + } + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + break; + + case 4: + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; +#if defined(DREAMCAST) && defined(USE_CONVERTILE_PREF) + asm("pref @%0" : : "r" (tp + 32)); +#endif + if ((pix = *(tp + 0))) + { + p1 |= odd_high[0][pix >> 4]; + p2 |= odd_low[0][pix & 0xf]; + } + if ((pix = *(tp + 1))) + { + p1 |= even_high[0][pix >> 4]; + p2 |= even_low[0][pix & 0xf]; + } + if ((pix = *(tp + 16))) + { + p1 |= odd_high[1][pix >> 4]; + p2 |= odd_low[1][pix & 0xf]; + } + if ((pix = *(tp + 17))) + { + p1 |= even_high[1][pix >> 4]; + p2 |= even_low[1][pix & 0xf]; + } + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + break; + + case 2: + for (line = 8; line != 0; line--, tp += 2) + { + uint32 p1 = 0; + uint32 p2 = 0; + register uint8 pix; +#if defined(DREAMCAST) && defined(USE_CONVERTILE_PREF) + asm("pref @%0" : : "r" (tp + 32)); +#endif + if ((pix = *(tp + 0))) + { + p1 |= odd_high[0][pix >> 4]; + p2 |= odd_low[0][pix & 0xf]; + } + if ((pix = *(tp + 1))) + { + p1 |= even_high[0][pix >> 4]; + p2 |= even_low[0][pix & 0xf]; + } + *p++ = p1; + *p++ = p2; + non_zero |= p1 | p2; + } + break; + } +//printf("=%i\n",non_zero); + return (non_zero ? TRUE : BLANK_TILE); +} + + +/* +STATIC_INLINE void WRITE_4PIXELS (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS_FLIPPED (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELSx2 (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel((N<<1)+1, Pixel); \ + TILE_SetPixel((N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel((N<<1)+1, Pixel); \ + TILE_SetPixel((N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELSx2x2 (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel((N<<1), Pixel); \ + TILE_SetPixel((N<<1)+1, Pixel); \ + TILE_SetPixel(SNES4ALL_SCREEN_PITCH+(N<<1), Pixel); \ + TILE_SetPixel(SNES4ALL_SCREEN_PITCH+(N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) +{ + uint8 Pixel; + uint8 *Screen = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel(N<<1, Pixel); \ + TILE_SetPixel((N<<1)+1, Pixel); \ + TILE_SetPixel(SNES4ALL_SCREEN_PITCH+(N<<1), Pixel); \ + TILE_SetPixel(SNES4ALL_SCREEN_PITCH+(N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#undef FN +} + +void DrawTile (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4) +} + +void DrawClippedTile (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS, WRITE_4PIXELS_FLIPPED, 4) +} + +void DrawTilex2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELSx2, WRITE_4PIXELS_FLIPPEDx2, 8) +} + +void DrawClippedTilex2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELSx2, WRITE_4PIXELS_FLIPPEDx2, 8) +} + +void DrawTilex2x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELSx2x2, WRITE_4PIXELS_FLIPPEDx2x2, 8) +} + +void DrawClippedTilex2x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELSx2x2, WRITE_4PIXELS_FLIPPEDx2x2, 8) +} +*/ + +STATIC_INLINE void WRITE_4PIXELS16 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() +#endif +#undef FN +} + +#ifndef USE_OLD_DRAW_TILE +static void WRITE_4PIXELS16_2 (uint32 Offset, uint8 *Pixels, uint32 LineCount) +{ + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + for (uint32 l = LineCount; l != 0; l--) { + uint32 Pixel; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + if (*(uint32 *)Pixels) { + FN(0) + FN(1) + FN(2) + FN(3) + } + if (*(uint32 *)(Pixels+4)) { + FN(4) + FN(5) + FN(6) + FN(7) + } + Pixels+=8; + Screen+=SNES4ALL_SCREEN_PITCH2; + Depth+=SNES4ALL_SCREEN_PITCH2; +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + if (*(uint32 *)Pixels) { + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + } else { + Pixels+=4; Depth+=4; Screen+=4; + } + if (*(uint32 *)Pixels) { + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + } else { + Pixels+=4; Depth+=4; Screen+=4; + } + Screen+=SNES4ALL_SCREEN_PITCH2-8; + Depth+=SNES4ALL_SCREEN_PITCH2-8; +#endif + } +#undef FN +} + +static void WRITE_4PIXELS16_2V (uint32 Offset, uint8 *Pixels, uint32 LineCount) +{ + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + for (uint32 l = LineCount; l != 0; l--) { + uint32 Pixel; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + if (*(uint32 *)Pixels) { + FN(0) + FN(1) + FN(2) + FN(3) + } + if (*(uint32 *)(Pixels+4)) { + FN(4) + FN(5) + FN(6) + FN(7) + } + Pixels-=8; + Screen+=SNES4ALL_SCREEN_PITCH2; + Depth+=SNES4ALL_SCREEN_PITCH2; +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + if (*(uint32 *)Pixels) { + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + } else { + Pixels+=4; Depth+=4; Screen+=4; + } + if (*(uint32 *)Pixels) { + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels++; + FN() Screen++; Depth++; Pixels-=15; + } else { + Pixels-=12; Depth+=4; Screen+=4; + } + Screen+=SNES4ALL_SCREEN_PITCH2-8; + Depth+=SNES4ALL_SCREEN_PITCH2-8; +#endif + } +#undef FN +} +#endif + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + + Pixels += 3; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() +#endif +#undef FN +} + +#ifndef USE_OLD_DRAW_TILE +static void WRITE_4PIXELS16_FLIPPED_2 (uint32 Offset, uint8 *Pixels, uint32 LineCount) +{ + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; +#ifndef USE_OLD_WRITE_PIXEL + Pixels+=4; +#endif + for (uint32 l = LineCount; l != 0; l--) { + uint32 Pixel; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N,M) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[M])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + if (*(uint32 *)(Pixels+4)) { + FN(0,4+3) + FN(1,4+2) + FN(2,4+1) + FN(3,4+0) + } + if (*(uint32 *)(Pixels)) { + FN(4+0,3) + FN(4+1,2) + FN(4+2,1) + FN(4+3,0) + } + Pixels+=8; + Screen+=SNES4ALL_SCREEN_PITCH2; + Depth+=SNES4ALL_SCREEN_PITCH2; +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + + if (*(uint32 *)Pixels) { + Pixels += 3; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; + } else { + Depth+=4; Screen+=4; + } + Pixels -= 4; + if (*(uint32 *)Pixels) { + Pixels+=3; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; + } else { + Depth+=4; Screen+=4; + } + Pixels+=12; + Screen+=SNES4ALL_SCREEN_PITCH2-8; + Depth+=SNES4ALL_SCREEN_PITCH2-8; + +#endif + } +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_2V (uint32 Offset, uint8 *Pixels, uint32 LineCount) +{ + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; +#ifndef USE_OLD_WRITE_PIXEL + Pixels+=4; +#endif + for (uint32 l = LineCount; l != 0; l--) { + uint32 Pixel; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N,M) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[M])) \ + { \ + TILE_SetPixel16(N, Pixel); \ + } + + if (*(uint32 *)(Pixels+4)) { + FN(0,4+3) + FN(1,4+2) + FN(2,4+1) + FN(3,4+0) + } + if (*(uint32 *)(Pixels)) { + FN(4+0,3) + FN(4+1,2) + FN(4+2,1) + FN(4+3,0) + } + Pixels-=8; + Screen+=SNES4ALL_SCREEN_PITCH2; + Depth+=SNES4ALL_SCREEN_PITCH2; +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + } + + if (*(uint32 *)Pixels) { + Pixels += 3; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; + } else { + Depth+=4; Screen+=4; + } + Pixels-=4; + if (*(uint32 *)Pixels) { + Pixels += 3; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; Pixels--; + FN() Screen++; Depth++; + } else { + Depth+=4; Screen+=4; + } + Pixels-=4; + Screen+=SNES4ALL_SCREEN_PITCH2-8; + Depth+=SNES4ALL_SCREEN_PITCH2-8; + +#endif + } +#undef FN +} +#endif + +#if 0 +STATIC_INLINE void WRITE_4PIXELS16x2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel16((N<<1), Pixel); \ + TILE_SetPixel16((N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + } else \ + Screen+=2; Depth+=2; \ + + FN() Pixels++; + FN() Pixels++; + FN() Pixels++; + FN() +#endif +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPEDx2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel16((N<<1), Pixel); \ + TILE_SetPixel16((N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + } else \ + Screen+=2; Depth+=2; \ + + Pixels += 3; + FN() Pixels--; + FN() Pixels--; + FN() Pixels--; + FN() +#endif +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16x2x2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[N])) \ + { \ + TILE_SetPixel16((N<<1), Pixel); \ + TILE_SetPixel16((N<<1)+1, Pixel); \ + TILE_SetPixel16((SNES4ALL_SCREEN_PITCH>>1)+(N<<1), Pixel); \ + TILE_SetPixel16((SNES4ALL_SCREEN_PITCH>>1)+(N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen+=(SNES4ALL_SCREEN_PITCH>>1)-1; Depth+=(SNES4ALL_SCREEN_PITCH>>1)-1; \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen-=(SNES4ALL_SCREEN_PITCH>>1)-1; Depth-=(SNES4ALL_SCREEN_PITCH>>1)-1; \ + } else \ + Screen+=2; Depth+=2; + + FN() Pixels++; + FN() Pixels++; + FN() Pixels++; + FN() +#endif +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPEDx2x2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + +#ifdef USE_OLD_WRITE_PIXEL +#define FN(N) \ + if (GFX.Z1 > Depth [N << 1] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SetPixel16((N<<1), Pixel); \ + TILE_SetPixel16((N<<1)+1, Pixel); \ + TILE_SetPixel16((SNES4ALL_SCREEN_PITCH>>1)+(N<<1), Pixel); \ + TILE_SetPixel16((SNES4ALL_SCREEN_PITCH>>1)+(N<<1)+1, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) +#else + const uint8 _GFX_Z2_=GFX.Z2; + const uint8 _GFX_Z1_=GFX.Z1; +#define FN() \ + if (_GFX_Z1_ > *Depth && (Pixel = *Pixels)) { \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen+=(SNES4ALL_SCREEN_PITCH>>1)-1; Depth+=(SNES4ALL_SCREEN_PITCH>>1)-1; \ + TILE_SetPixel16_(Pixel); \ + Screen++; Depth++; \ + TILE_SetPixel16_(Pixel); \ + Screen-=(SNES4ALL_SCREEN_PITCH>>1)-1; Depth-=(SNES4ALL_SCREEN_PITCH>>1)-1; \ + } else \ + Screen+=2; Depth+=2; + + Pixels+=3; + FN() Pixels--; + FN() Pixels--; + FN() Pixels--; + FN() +#endif +#undef FN +} +#endif + +void DrawTile16 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + +#ifdef USE_OLD_DRAW_TILE + RENDER_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4) +#else + RENDER_TILE2(WRITE_4PIXELS16_2, WRITE_4PIXELS16_2V, WRITE_4PIXELS16_FLIPPED_2, WRITE_4PIXELS16_FLIPPED_2V) +#endif +} + +void DrawClippedTile16 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16, WRITE_4PIXELS16_FLIPPED, 4) +} + +#if 0 +void DrawTile16x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + RENDER_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8) +} + +void DrawClippedTile16x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2, WRITE_4PIXELS16_FLIPPEDx2, 8) +} + +void DrawTile16x2x2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8) +} + +void DrawClippedTile16x2x2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16x2x2, WRITE_4PIXELS16_FLIPPEDx2x2, 8) +} +#endif + +STATIC_INLINE void WRITE_4PIXELS16_ADD (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectAddPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_ADD (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectAddPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_ADD1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectAddPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_ADD1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectAddPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_SUB (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectSubPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_SUB (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectSubPixel16(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_SUB1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectSubPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_SUB1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectSubPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + + +void DrawTile16Add (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4) +} + +void DrawClippedTile16Add (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD, WRITE_4PIXELS16_FLIPPED_ADD, 4) +} + +void DrawTile16Add1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4) +} + +void DrawClippedTile16Add1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADD1_2, WRITE_4PIXELS16_FLIPPED_ADD1_2, 4) +} + +void DrawTile16Sub (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4) +} + +void DrawClippedTile16Sub (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB, WRITE_4PIXELS16_FLIPPED_SUB, 4) +} + +void DrawTile16Sub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4) +} + +void DrawClippedTile16Sub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUB1_2, WRITE_4PIXELS16_FLIPPED_SUB1_2, 4) +} + +STATIC_INLINE void WRITE_4PIXELS16_ADDF1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectFAddPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_ADDF1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectFAddPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_SUBF1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[N])) \ + { \ + TILE_SelectFSubPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +STATIC_INLINE void WRITE_4PIXELS16_FLIPPED_SUBF1_2 (uint32 Offset, uint8 *Pixels) +{ + uint32 Pixel; + uint16 *Screen = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint8 *SubDepth = GFX.SubZBuffer + Offset; + +#define FN(N) \ + if (GFX.Z1 > Depth [N] && (Pixel = Pixels[3 - N])) \ + { \ + TILE_SelectFSubPixel16Half(N, Pixel); \ + } + + FN(0) + FN(1) + FN(2) + FN(3) + +#undef FN +} + +void DrawTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_ADDF1_2, WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4) +} + +void DrawClippedTile16FixedAdd1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_ADDF1_2, + WRITE_4PIXELS16_FLIPPED_ADDF1_2, 4) +} + +void DrawTile16FixedSub1_2 (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + RENDER_TILE(WRITE_4PIXELS16_SUBF1_2, WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4) +} + +void DrawClippedTile16FixedSub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + register uint8 *bp; + + TILE_CLIP_PREAMBLE + RENDER_CLIPPED_TILE(WRITE_4PIXELS16_SUBF1_2, + WRITE_4PIXELS16_FLIPPED_SUBF1_2, 4) +} + +#define PLOT_PIXEL(screen, pixel) (pixel) +#if 0 +void DrawLargePixel (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint8 *sp = GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + uint8 pixel; + + RENDER_TILE_LARGE (((uint8) GFX.ScreenColors [pixel]), PLOT_PIXEL) +} +#endif + +void DrawLargePixel16 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint16 *sp = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.DB + Offset; + uint16 pixel; + + RENDER_TILE_LARGE (GFX.ScreenColors [pixel], PLOT_PIXEL) +} + +void DrawLargePixel16Add (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint16 *sp = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint16 pixel; + +#define LARGE_ADD_PIXEL(s, p) \ +(Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \ + COLOR_ADD (p, *(s + GFX.Delta)) : \ + COLOR_ADD (p, GFX.FixedColour)) \ + : p) + + RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL) +} + +void DrawLargePixel16Add1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint16 *sp = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint16 pixel; + +#define LARGE_ADD_PIXEL1_2(s, p) \ +((uint16) (Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \ + COLOR_ADD1_2 (p, *(s + GFX.Delta)) : \ + COLOR_ADD (p, GFX.FixedColour)) \ + : p)) + + RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_ADD_PIXEL1_2) +} + +void DrawLargePixel16Sub (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint16 *sp = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint16 pixel; + +#define LARGE_SUB_PIXEL(s, p) \ +(Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \ + COLOR_SUB (p, *(s + GFX.Delta)) : \ + COLOR_SUB (p, GFX.FixedColour)) \ + : p) + + RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL) +} + +void DrawLargePixel16Sub1_2 (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + TILE_PREAMBLE + + register uint16 *sp = (uint16 *) GFX.S + Offset; + uint8 *Depth = GFX.ZBuffer + Offset; + uint16 pixel; + +#define LARGE_SUB_PIXEL1_2(s, p) \ +(Depth [z + GFX.DepthDelta] ? (Depth [z + GFX.DepthDelta] != 1 ? \ + COLOR_SUB1_2 (p, *(s + GFX.Delta)) : \ + COLOR_SUB (p, GFX.FixedColour)) \ + : p) + + RENDER_TILE_LARGE (GFX.ScreenColors [pixel], LARGE_SUB_PIXEL1_2) +} + diff --git a/src/tilegl.cpp b/src/tilegl.cpp new file mode 100644 index 0000000..6833652 --- /dev/null +++ b/src/tilegl.cpp @@ -0,0 +1,530 @@ +#ifdef USE_GL + +#include "snes9x.h" + +#include "snes4all.h" + +#include "memmap.h" +#include "ppu.h" +#include "display.h" +#include "gfx.h" +#include "tile.h" + +#include "videogl.h" + +//#define SHOW_TODO +#ifdef USE_VIDEOGL_DIRECT_SLOT +#define get_free_slot(TILE) (unsigned short *)(((unsigned)videogl_cache)+((TILE)*8*8*2)); +#else +static __inline__ unsigned short *get_free_slot(unsigned tile) { +//static unsigned iter_min=2*VIDEO_GL_MAX_TEX; +//static unsigned iter_max=0; +//static double iter_media=0.0; +//static int dime=0; +//unsigned iter=0; + unsigned t=0; + { + unsigned short c=videogl_cache_tile_slot[tile]; + if (c!=0xffff) + videogl_cache_slot[c]=0; + } + for(unsigned i=videogl_cache_slot_last;iiter_max) iter_max=iter; +//if (iterVIDEO_GL_MAX_TILES) return; + + TILE_PREAMBLE + + if (!videogl_tiles) + videogl_first_brightness=PPU.Brightness; +// else videogl_last_brightness=PPU.Brightness; +//static int cuantos=0; +//cuantos++; +//if (cuantos!=10 && cuantos!=11 && cuantos<73) return; +//if (cuantos!=563 && cuantos<569) return; +//printf("DrawTile16hw Tile=%i(%i), Offset=%i, StartLine=%i, LineCount=%i, Z=%i\n",TileNumber,Tile,Offset,StartLine,LineCount,GFX.Z2); + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; +#ifdef USE_QSORT + videogl_tile_p[videogl_tiles]=tile; +#else + if (GFX.Z2>videogl_max_z) videogl_max_z=GFX.Z2; + if (GFX.Z2z=GFX.Z2; + tile->x=Offset;//&0xff; + tile->y=(Offset>>8);//&0xff; + tile->flip=((Tile & (V_FLIP | H_FLIP))>>14)&3; + tile->clipx=0; +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=0; +#endif + tile->tile=TileNumber; +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tile->clipy=(StartLine>>3); + tile->y1=LineCount; + tile->mosaic=0; +#else + tile->clipy=((StartLine>>3)&0xf)|(LineCount<<4); +#endif +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET + tile->pal= ((((unsigned)&GFX.ScreenColors[0])-((unsigned)&IPPU.ScreenColors[0]))>>1); +//if (tile->pal) printf("pal %i (%i) Tile=%i\n",tile->pal,(((unsigned)&GFX.ScreenColors[0])-((unsigned)&IPPU.ScreenColors[0])),(((Tile >> 10) & BG.PaletteMask) << BG.PaletteShift) + BG.StartPalette); +#endif + + if (BG.Buffered==IPPU.TileCached[TILE_2BIT]) { + if (tile->tile>1024) + tile->tile-=1024; + tile->tile&=0x7ff; + tile->tile+=(((Tile>>10)&7)*0x800); + } else { + tile->tile+=(8*0x800)+(((Tile>>10)&7)*0x800); + } + +//printf("Tile %i, pal=%i (shift=%i) (tiles=%i)\n",tile->tile,tile->pal,BG.BitShift,videogl_tiles); +#if 0 + if (BG.Buffered==IPPU.TileCached[TILE_4BIT]) +//{ +//extern unsigned tiles_4bit_frame, tiles_4bit_min, tiles_4bit_max, tiles_4bit_minshift, tiles_4bit_maxshift, tiles_4bit_minmask, tiles_4bit_maxmask; +//tiles_4bit_frame++; +//if (tile->tile>tiles_4bit_max) tiles_4bit_max=tile->tile; +//if (tile->tiletile; +//if (BG.PaletteMask>tiles_4bit_maxmask) tiles_4bit_maxmask=BG.PaletteMask; +//if (BG.PaletteMask>10)&BG.PaletteMask)>tiles_4bit_maxshift) tiles_4bit_maxshift=((Tile>>10)&BG.PaletteMask); +//if (((Tile>>10)&BG.PaletteMask)>10)&BG.PaletteMask); + tile->tile+=(8*MAX_2BIT_TILES)+(((Tile>>10)&BG.PaletteMask)*MAX_4BIT_TILES); +//} + else + if (BG.Buffered==IPPU.TileCached[TILE_8BIT]) +//{ +//extern unsigned tiles_8bit_frame, tiles_8bit_min, tiles_8bit_max, tiles_8bit_minshift, tiles_8bit_maxshift, tiles_8bit_minmask, tiles_8bit_maxmask; +//tiles_8bit_frame++; +//if (tile->tile>tiles_8bit_max) tiles_8bit_max=tile->tile; +//if (tile->tiletile; +//if (BG.PaletteMask>tiles_8bit_maxmask) tiles_8bit_maxmask=BG.PaletteMask; +//if (BG.PaletteMask>10)&BG.PaletteMask)>tiles_8bit_maxshift) tiles_8bit_maxshift=((Tile>>10)&BG.PaletteMask); +//if (((Tile>>10)&BG.PaletteMask)>10)&BG.PaletteMask); +// tile->tile+=(8*(MAX_2BIT_TILES+MAX_4BIT_TILES))+(((Tile>>10)&(7&BG.PaletteMask))*MAX_8BIT_TILES); +//} + else +//{ +//extern unsigned tiles_2bit_frame, tiles_2bit_min, tiles_2bit_max, tiles_2bit_minshift, tiles_2bit_maxshift, tiles_2bit_minmask, tiles_2bit_maxmask; +//tiles_2bit_frame++; +//if (tile->tile>tiles_2bit_max) tiles_2bit_max=tile->tile; +//if (tile->tiletile; +//if (BG.PaletteMask>tiles_2bit_maxmask) tiles_2bit_maxmask=BG.PaletteMask; +//if (BG.PaletteMask>10)&BG.PaletteMask)>tiles_2bit_maxshift) tiles_2bit_maxshift=((Tile>>10)&BG.PaletteMask); +//if (((Tile>>10)&BG.PaletteMask)>10)&BG.PaletteMask); +// tile->tile+=(((Tile>>10)&(7&BG.PaletteMask))*MAX_2BIT_TILES); +} +//else if (BG.Buffered!=IPPU.TileCached[0]) { +//puts("NO SE LOCALIZA EL BUFFERED"); exit(0); } +#endif +//if (tile->tile>=VIDEO_GL_MAX_TEX) { printf("TileNumber=%i (%i). MAX=%i\n",tile->tile,TileNumber,VIDEO_GL_MAX_TEX); exit(0); } +//printf("TileNumber=%i (%i/%i) %s\n",t,TileNumber, BG.Buffered==IPPU.TileCached[TILE_4BIT]?1:BG.Buffered==IPPU.TileCached[TILE_8BIT]?2:0, tile_converted?"converted":"cached"); +//videogl_z=VIDEO_GL_TILE_Z_INIT+((256-GFX.Z2)*VIDEO_GL_TILE_Z_INC); +//videogl_z=VIDEO_GL_TILE_Z_INIT+(GFX.Z2*VIDEO_GL_TILE_Z_INC); +//printf("DrawTile16hw Tile=%i, %i,%i (Z=%i,%i) %s\n",tile->tile,tile->x,tile->y,GFX.Z1,GFX.Z2,tile_converted?"converted":videogl_cache_reseted?"reseted":videogl_cached[tile->tile]?"cached":"empty"); +//printf(" z=%f, GFX.Z1=%i GFX.Z2=%i (%i)\n",videogl_z,GFX.Z1,GFX.Z2,*((int8 *)(GFX.DB + Offset + 4))); +//static unsigned total=0; +//static unsigned nocacheados=0; +//total++; + if (tile_converted || !videogl_cached[tile->tile] /*|| videogl_cache_reseted*/) + { +#ifdef USE_VIDEOGL_SELECTIVE_CACHE_RESET + if (BG.BitShift<=4) { + videogl_selective_cache[(tile->pal*VIDEO_GL_SELECTIVE_MAX_CACHE)+videogl_selective[tile->pal]]=tile->tile; + videogl_selective[tile->pal]++; + if (videogl_selective[tile->pal]>VIDEO_GL_SELECTIVE_MAX_CACHE) videogl_cache_to_reseted=4; + } +#endif +//nocacheados++; +#if !defined(DREAMCAST) || !defined(USE_VIDEOGL_PVRTXR) + unsigned short *tex=get_free_slot(tile->tile); +#else + unsigned short *pvr_tex=get_free_slot(tile->tile); + unsigned short *tex=(unsigned short *)videogl_dc_buffer; +#endif + unsigned char *s=(unsigned char *)pCache;//+ StartLine; +#ifndef DREAMCAST + unsigned short *d=tex; + for(int i=0;i<8*8;i++) { + register unsigned char ds=*s++; +//if (ds>16) printf("MAL col=%i\n",ds); + *d++=ds?GFX.ScreenColors[ds]:0; + } +#else + { + unsigned short back_zero=GFX.ScreenColors[0]; + GFX.ScreenColors[0]=0; +#ifndef USE_MMU + unsigned int *d = (unsigned int *)(void *) + (0xe0000000 | (((unsigned long)tex) & 0x03ffffe0)); + QACR0 = ((((unsigned int)tex)>>26)<<2)&0x1c; + QACR1 = ((((unsigned int)tex)>>26)<<2)&0x1c; +#else + unsigned int *d = (unsigned int *)(void *) + ((0xe0000000 | (((unsigned long)tex) & 0x03ffffe0))|((((unsigned)tex)>>3)&0x3800000)); +#endif + unsigned n=(8*8*2)>>5; + while(n--) { + asm("pref @%0" : : "r" (s + 8)); + {register unsigned char ds0=*s++, ds1=*s++; d[0]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[1]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[2]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[3]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[4]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[5]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[6]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + {register unsigned char ds0=*s++, ds1=*s++; d[7]=(((unsigned)GFX.ScreenColors[ds1])<<16)|((unsigned)GFX.ScreenColors[ds0]); } + asm("pref @%0" : : "r" (d)); + d += 8; + } + d = (unsigned int *)0xe0000000; + d[0] = d[8] = 0; + GFX.ScreenColors[0]=back_zero; + } +#endif +//} else { +//for(i=0;i<8*8;i++) { unsigned char ds=*s++; unsigned short dd=*d++; +//if (dd!=GFX.ScreenColors[ds]) { printf("MAL CACHEADO %i = %i(%i/%i)\n",i,dd,GFX.ScreenColors[ds],ds); exit(0); } +//}} +// glBindTexture(GL_TEXTURE_2D, videogl_tex[tile->tile]); +// loadTextureParams(SNES4ALL_FILTER_NONE); +// glTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, +// GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, tex); +#if defined(DREAMCAST) && defined(USE_VIDEOGL_PVRTXR) + pvr_txr_load(tex,pvr_tex,8*8*2); +#endif + videogl_cached[tile->tile]=1; + } +//printf("Cached %i/%i (%.2f%%)\n",total-nocacheados,total, (((double)(total-nocacheados))*100.0)/((double)total)); +} + +void DrawClippedTile16hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset+StartPixel,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->clipx=StartPixel; +#else + tile->clipx=StartPixel>7?7:StartPixel; +#endif +} + +#if 0 +void DrawTile16x2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +} + +void DrawClippedTile16x2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +} + +void DrawTile16x2x2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +} + +void DrawClippedTile16x2x2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +} +#endif + +void DrawTile16Addhw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16Addhw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=1; +#else + tile->clipx=8; +#endif +} + +void DrawClippedTile16Addhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16Addhw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset+StartPixel,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->clipx=StartPixel; + tile->add=1; +#else + tile->clipx=8|(StartPixel>7?7:StartPixel); +#endif +} + +void DrawTile16Add1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16Add1_2hw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=2; +#else + tile->clipx=8; +#endif +} + + +void DrawClippedTile16Add1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16Add1_2hw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset+StartPixel,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=2; + tile->clipx=StartPixel; +#else + tile->clipx=8|(StartPixel>7?7:StartPixel); +#endif +} + +void DrawTile16Subhw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16Subhw"); +#endif + DrawTile16hw(Tile,Offset,StartLine,LineCount); +} + + +void DrawClippedTile16Subhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16Subhw"); +#endif + DrawClippedTile16hw(Tile, Offset, StartPixel, Width, StartLine,LineCount); +} + + +void DrawTile16Sub1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16Sub1_2hw"); +#endif + DrawTile16hw(Tile,Offset,StartLine,LineCount); +} + +void DrawClippedTile16Sub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16Sub1_2hw"); +#endif + DrawClippedTile16hw(Tile, Offset, StartPixel, Width, StartLine,LineCount); +} + +void DrawTile16FixedAdd1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16FixedAdd1_2hw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=3; +#else + tile->clipx=8; +#endif +} + + +void DrawClippedTile16FixedAdd1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16FixedAdd1_2hw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawTile16hw(Tile,Offset+StartPixel,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=3; + tile->clipx=StartPixel; +#else + tile->clipx=8|(StartPixel>7?7:StartPixel); +#endif +} + + +void DrawTile16FixedSub1_2hw (uint32 Tile, uint32 Offset, uint32 StartLine, + uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawTile16FixedSub1_2hw"); +#endif + DrawTile16hw(Tile,Offset,StartLine,LineCount); +} + + +void DrawClippedTile16FixedSub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Width, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawClippedTile16FixedSub1_2hw"); +#endif + DrawClippedTile16hw(Tile, Offset, StartPixel, Width, StartLine,LineCount); +} + + +#if 0 +void DrawLargePixelhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ +//puts("DrawLargePixelhw"); +} +#endif + +void DrawLargePixel16hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ + int c=Pixels; //StartPixel; + int j=LineCount; + if (c>7) c=7; + if (j>31) j=31; + while(j>0){ + if (j>=8) j-=8; + else j=0; + int i=Pixels; + if (i>31) i=31; + while(i>0){ + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + if (i>=8) i-=8; + else i=0; + DrawTile16hw(Tile,Offset+i+(j<<8),StartLine,LineCount); +#if defined(USE_VIDEOGL_EXTEND_TILELIST) && !defined(USE_VGL_TABLE) + tile->mosaic=c; +#else + tile->flip|=c<<2; +#endif + }; + }; +//{ extern int pintado; pintado=1;} +//printf("Tile %i Pixels %i Start=%i, Offset=%i, StartLine=%i, LineCount=%i\n",tile->tile,Pixels,StartPixel,Offset,StartLine,LineCount); +} + +void DrawLargePixel16Addhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawLargePixel16Addhw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawLargePixel16hw(Tile,Offset,StartPixel,Pixels,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=1; +#else + tile->clipx=8; +#endif +} + + +void DrawLargePixel16Add1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawLargePixel16Add1_2hw"); +#endif + videogl_tile_list_t *tile=&videogl_tile[videogl_tiles]; + DrawLargePixel16hw(Tile,Offset,StartPixel,Pixels,StartLine,LineCount); +#ifdef USE_VIDEOGL_EXTEND_TILELIST + tile->add=2; +#else + tile->clipx=8; +#endif +} + +void DrawLargePixel16Subhw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawLargePixel16Subhw"); +#endif + DrawLargePixel16hw(Tile,Offset,StartPixel,Pixels,StartLine,LineCount); +} + +void DrawLargePixel16Sub1_2hw (uint32 Tile, uint32 Offset, + uint32 StartPixel, uint32 Pixels, + uint32 StartLine, uint32 LineCount) +{ +#ifdef SHOW_TODO +puts("DrawLargePixel16Sub1_2hw"); +#endif + DrawLargePixel16hw(Tile,Offset,StartPixel,Pixels,StartLine,LineCount); +} + +#endif diff --git a/src/unzip/explode.c b/src/unzip/explode.c new file mode 100644 index 0000000..3fc610d --- /dev/null +++ b/src/unzip/explode.c @@ -0,0 +1,1119 @@ +/* explode.c -- Not copyrighted 1992 by Mark Adler + version c7, 27 June 1992 */ + + +/* You can do whatever you like with this source file, though I would + prefer that if you modify it and redistribute it that you include + comments to that effect with your name and the date. Thank you. + + History: + vers date who what + ---- --------- -------------- ------------------------------------ + c1 30 Mar 92 M. Adler explode that uses huft_build from inflate + (this gives over a 70% speed improvement + over the original unimplode.c, which + decoded a bit at a time) + c2 4 Apr 92 M. Adler fixed bug for file sizes a multiple of 32k. + c3 10 Apr 92 M. Adler added a little memory tracking if DEBUG + c4 11 Apr 92 M. Adler added NOMEMCPY do kill use of memcpy() + c5 21 Apr 92 M. Adler added the WSIZE #define to allow reducing + the 32K window size for specialized + applications. + c6 31 May 92 M. Adler added typecasts to eliminate some warnings + c7 27 Jun 92 G. Roelofs added more typecasts + */ + + +/* + Explode imploded (PKZIP method 6 compressed) data. This compression + method searches for as much of the current string of bytes (up to a length + of ~320) in the previous 4K or 8K bytes. If it doesn't find any matches + (of at least length 2 or 3), it codes the next byte. Otherwise, it codes + the length of the matched string and its distance backwards from the + current position. Single bytes ("literals") are preceded by a one (a + single bit) and are either uncoded (the eight bits go directly into the + compressed stream for a total of nine bits) or Huffman coded with a + supplied literal code tree. If literals are coded, then the minimum match + length is three, otherwise it is two. + + There are therefore four kinds of imploded streams: 8K search with coded + literals (min match = 3), 4K search with coded literals (min match = 3), + 8K with uncoded literals (min match = 2), and 4K with uncoded literals + (min match = 2). The kind of stream is identified in two bits of a + general purpose bit flag that is outside of the compressed stream. + + Distance-length pairs are always coded. Distance-length pairs for matched + strings are preceded by a zero bit (to distinguish them from literals) and + are always coded. The distance comes first and is either the low six (4K) + or low seven (8K) bits of the distance (uncoded), followed by the high six + bits of the distance coded. Then the length is six bits coded (0..63 + + min match length), and if the maximum such length is coded, then it's + followed by another eight bits (uncoded) to be added to the coded length. + This gives a match length range of 2..320 or 3..321 bytes. + + The literal, length, and distance codes are all represented in a slightly + compressed form themselves. What is sent are the lengths of the codes for + each value, which is sufficient to construct the codes. Each byte of the + code representation is the code length (the low four bits representing + 1..16), and the number of values sequentially with that length (the high + four bits also representing 1..16). There are 256 literal code values (if + literals are coded), 64 length code values, and 64 distance code values, + in that order at the beginning of the compressed stream. Each set of code + values is preceded (redundantly) with a byte indicating how many bytes are + in the code description that follows, in the range 1..256. + + The codes themselves are decoded using tables made by huft_build() from + the bit lengths. That routine and its comments are in the inflate.c + module. + */ + +#include "unz.h" /* this must supply the slide[] (byte) array */ +#include "unzipP.h" +#include + +#ifndef WSIZE +# define WSIZE 0x8000 /* window size--must be a power of two, and at least + 8K for zip's implode method */ +#endif /* !WSIZE */ + + +struct huft { + byte e; /* number of extra bits or operation */ + byte b; /* number of bits in this code or subcode */ + union { + UWORD n; /* literal, length base, or distance base */ + struct huft *t; /* pointer to next level of table */ + } v; +}; + +/* Function prototypes */ +/* routines from inflate.c */ +extern unsigned hufts; +int huft_build OF((unsigned *, unsigned, unsigned, UWORD *, UWORD *, + struct huft **, int *)); +int huft_free OF((struct huft *)); +void flush OF((unsigned)); + +/* routines here */ +int get_tree OF((unsigned *, unsigned)); +int explode_lit8 OF((struct huft *, struct huft *, struct huft *, + int, int, int)); +int explode_lit4 OF((struct huft *, struct huft *, struct huft *, + int, int, int)); +int explode_nolit8 OF((struct huft *, struct huft *, int, int)); +int explode_nolit4 OF((struct huft *, struct huft *, int, int)); +int explode (); + +extern file_in_zip_read_info_s *pfile_in_zip_read_info; +extern unz_s *pUnzip; + +/* The implode algorithm uses a sliding 4K or 8K byte window on the + uncompressed stream to find repeated byte strings. This is implemented + here as a circular buffer. The index is updated simply by incrementing + and then and'ing with 0x0fff (4K-1) or 0x1fff (8K-1). Here, the 32K + buffer of inflate is used, and it works just as well to always have + a 32K circular buffer, so the index is anded with 0x7fff. This is + done to allow the window to also be used as the output buffer. */ +/* This must be supplied in an external module useable like "byte slide[8192];" + or "byte *slide;", where the latter would be malloc'ed. In unzip, slide[] + is actually a 32K area for use by inflate, which uses a 32K sliding window. + */ + + +/* Tables for length and distance */ +UWORD cplen2[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65}; +UWORD cplen3[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66}; +UWORD extra[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8}; +UWORD cpdist4[] = {1, 65, 129, 193, 257, 321, 385, 449, 513, 577, 641, 705, + 769, 833, 897, 961, 1025, 1089, 1153, 1217, 1281, 1345, 1409, 1473, + 1537, 1601, 1665, 1729, 1793, 1857, 1921, 1985, 2049, 2113, 2177, + 2241, 2305, 2369, 2433, 2497, 2561, 2625, 2689, 2753, 2817, 2881, + 2945, 3009, 3073, 3137, 3201, 3265, 3329, 3393, 3457, 3521, 3585, + 3649, 3713, 3777, 3841, 3905, 3969, 4033}; +UWORD cpdist8[] = {1, 129, 257, 385, 513, 641, 769, 897, 1025, 1153, 1281, + 1409, 1537, 1665, 1793, 1921, 2049, 2177, 2305, 2433, 2561, 2689, + 2817, 2945, 3073, 3201, 3329, 3457, 3585, 3713, 3841, 3969, 4097, + 4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, 5377, 5505, + 5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, 6657, 6785, 6913, + 7041, 7169, 7297, 7425, 7553, 7681, 7809, 7937, 8065}; + + +/* Macros for inflate() bit peeking and grabbing. + The usage is: + + NEEDBITS(j) + x = b & mask_bits[j]; + DUMPBITS(j) + + where NEEDBITS makes sure that b has at least j bits in it, and + DUMPBITS removes the bits from b. The macros use the variable k + for the number of bits in b. Normally, b and k are register + variables for speed. + */ + +extern UWORD bytebuf; /* (use the one in inflate.c) */ +#define NEXTBYTE (ReadByte(&bytebuf), bytebuf) +#define NEEDBITS(n) {while(k<(n)){b|=((ULONG)NEXTBYTE)<>=(n);k-=(n);} + +/* HERE */ +UWORD mask_bits[] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; +union work area; /* see unzip.h for the definition of work */ +ULONG crc32val; +ush bytebuf; +ULONG bitbuf; +int bits_left; +boolean zipeof; + +int get_tree(l, n) +unsigned *l; /* bit lengths */ +unsigned n; /* number expected */ +/* Get the bit lengths for a code representation from the compressed + stream. If get_tree() returns 4, then there is an error in the data. + Otherwise zero is returned. */ +{ + unsigned i; /* bytes remaining in list */ + unsigned k; /* lengths entered */ + unsigned j; /* number of codes */ + unsigned b; /* bit length for those codes */ + + + /* get bit lengths */ + ReadByte(&bytebuf); + i = bytebuf + 1; /* length/count pairs to read */ + k = 0; /* next code */ + do { + ReadByte(&bytebuf); + b = ((j = bytebuf) & 0xf) + 1; /* bits in code (1..16) */ + j = ((j & 0xf0) >> 4) + 1; /* codes with those bits (1..16) */ + if (k + j > n) + return 4; /* don't overflow l[] */ + do { + l[k++] = b; + } while (--j); + } while (--i); + return k != n ? 4 : 0; /* should have read n of them */ +} + + + +int explode_lit8(tb, tl, td, bb, bl, bd) +struct huft *tb, *tl, *td; /* literal, length, and distance tables */ +int bb, bl, bd; /* number of bits decoded by those */ +/* Decompress the imploded data using coded literals and an 8K sliding + window. */ +{ + longint s; /* bytes to decompress */ + register unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ + register ULONG b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + unsigned u; /* true if unflushed */ + + + /* explode the coded data */ + b = k = w = 0; /* initialize bit buffer, window */ + u = 1; /* buffer unflushed */ + mb = mask_bits[bb]; /* precompute masks for speed */ + ml = mask_bits[bl]; + md = mask_bits[bd]; + s = pUnzip->pfile_in_zip_read->rest_read_uncompressed; + while (s > 0) /* do until ucsize bytes uncompressed */ + { + NEEDBITS(1) + if (b & 1) /* then literal--decode it */ + { + DUMPBITS(1) + s--; + NEEDBITS((unsigned)bb) /* get coded literal */ + if ((e = (t = tb + ((~(unsigned)b) & mb))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + slide[w++] = (byte)t->v.n; + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } + else /* else distance/length */ + { + DUMPBITS(1) + NEEDBITS(7) /* get distance low bits */ + d = (unsigned)b & 0x7f; + DUMPBITS(7) + NEEDBITS((unsigned)bd) /* get coded distance high bits */ + if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + d = w - d - t->v.n; /* construct offset */ + NEEDBITS((unsigned)bl) /* get coded length */ + if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + n = t->v.n; + if (e) /* get length extra bits */ + { + NEEDBITS(8) + n += (unsigned)b & 0xff; + DUMPBITS(8) + } + + /* do the copy */ + s -= n; + do { + n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); + if (u && w <= d) + { + memset(slide + w, 0, e); + w += e; + d += e; + } + else +#ifndef NOMEMCPY + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* !NOMEMCPY */ + do { + slide[w++] = slide[d++]; + } while (--e); + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } while (n); + } + } + + /* flush out slide */ + flush(w); + return pfile_in_zip_read_info->rest_read_compressed ? 5 : 0; /* should have read csize bytes */ +} + + + +int explode_lit4(tb, tl, td, bb, bl, bd) +struct huft *tb, *tl, *td; /* literal, length, and distance tables */ +int bb, bl, bd; /* number of bits decoded by those */ +/* Decompress the imploded data using coded literals and a 4K sliding + window. */ +{ + longint s; /* bytes to decompress */ + register unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned mb, ml, md; /* masks for bb, bl, and bd bits */ + register ULONG b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + unsigned u; /* true if unflushed */ + + + /* explode the coded data */ + b = k = w = 0; /* initialize bit buffer, window */ + u = 1; /* buffer unflushed */ + mb = mask_bits[bb]; /* precompute masks for speed */ + ml = mask_bits[bl]; + md = mask_bits[bd]; + s = pUnzip->pfile_in_zip_read->rest_read_uncompressed; + while (s > 0) /* do until ucsize bytes uncompressed */ + { + NEEDBITS(1) + if (b & 1) /* then literal--decode it */ + { + DUMPBITS(1) + s--; + NEEDBITS((unsigned)bb) /* get coded literal */ + if ((e = (t = tb + ((~(unsigned)b) & mb))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + slide[w++] = (byte)t->v.n; + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } + else /* else distance/length */ + { + DUMPBITS(1) + NEEDBITS(6) /* get distance low bits */ + d = (unsigned)b & 0x3f; + DUMPBITS(6) + NEEDBITS((unsigned)bd) /* get coded distance high bits */ + if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + d = w - d - t->v.n; /* construct offset */ + NEEDBITS((unsigned)bl) /* get coded length */ + if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + n = t->v.n; + if (e) /* get length extra bits */ + { + NEEDBITS(8) + n += (unsigned)b & 0xff; + DUMPBITS(8) + } + + /* do the copy */ + s -= n; + do { + n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); + if (u && w <= d) + { + memset(slide + w, 0, e); + w += e; + d += e; + } + else +#ifndef NOMEMCPY + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* !NOMEMCPY */ + do { + slide[w++] = slide[d++]; + } while (--e); + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } while (n); + } + } + + /* flush out slide */ + flush(w); + return pfile_in_zip_read_info->rest_read_compressed ? 5 : 0; /* should have read csize bytes */ +} + + + +int explode_nolit8(tl, td, bl, bd) +struct huft *tl, *td; /* length and distance decoder tables */ +int bl, bd; /* number of bits decoded by tl[] and td[] */ +/* Decompress the imploded data using uncoded literals and an 8K sliding + window. */ +{ + longint s; /* bytes to decompress */ + register unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned ml, md; /* masks for bl and bd bits */ + register ULONG b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + unsigned u; /* true if unflushed */ + + + /* explode the coded data */ + b = k = w = 0; /* initialize bit buffer, window */ + u = 1; /* buffer unflushed */ + ml = mask_bits[bl]; /* precompute masks for speed */ + md = mask_bits[bd]; + s = pUnzip->pfile_in_zip_read->rest_read_uncompressed; + while (s > 0) /* do until ucsize bytes uncompressed */ + { + NEEDBITS(1) + if (b & 1) /* then literal--get eight bits */ + { + DUMPBITS(1) + s--; + NEEDBITS(8) + slide[w++] = (byte)b; + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + DUMPBITS(8) + } + else /* else distance/length */ + { + DUMPBITS(1) + NEEDBITS(7) /* get distance low bits */ + d = (unsigned)b & 0x7f; + DUMPBITS(7) + NEEDBITS((unsigned)bd) /* get coded distance high bits */ + if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + d = w - d - t->v.n; /* construct offset */ + NEEDBITS((unsigned)bl) /* get coded length */ + if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + n = t->v.n; + if (e) /* get length extra bits */ + { + NEEDBITS(8) + n += (unsigned)b & 0xff; + DUMPBITS(8) + } + + /* do the copy */ + s -= n; + do { + n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); + if (u && w <= d) + { + memset(slide + w, 0, e); + w += e; + d += e; + } + else +#ifndef NOMEMCPY + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* !NOMEMCPY */ + do { + slide[w++] = slide[d++]; + } while (--e); + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } while (n); + } + } + + /* flush out slide */ + flush(w); + return pfile_in_zip_read_info->rest_read_compressed ? 5 : 0; /* should have read csize bytes */ +} + + + +int explode_nolit4(tl, td, bl, bd) +struct huft *tl, *td; /* length and distance decoder tables */ +int bl, bd; /* number of bits decoded by tl[] and td[] */ +/* Decompress the imploded data using uncoded literals and a 4K sliding + window. */ +{ + longint s; /* bytes to decompress */ + register unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned ml, md; /* masks for bl and bd bits */ + register ULONG b; /* bit buffer */ + register unsigned k; /* number of bits in bit buffer */ + unsigned u; /* true if unflushed */ + + + /* explode the coded data */ + b = k = w = 0; /* initialize bit buffer, window */ + u = 1; /* buffer unflushed */ + ml = mask_bits[bl]; /* precompute masks for speed */ + md = mask_bits[bd]; + s = pUnzip->pfile_in_zip_read->rest_read_uncompressed; + while (s > 0) /* do until ucsize bytes uncompressed */ + { + NEEDBITS(1) + if (b & 1) /* then literal--get eight bits */ + { + DUMPBITS(1) + s--; + NEEDBITS(8) + slide[w++] = (byte)b; + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + DUMPBITS(8) + } + else /* else distance/length */ + { + DUMPBITS(1) + NEEDBITS(6) /* get distance low bits */ + d = (unsigned)b & 0x3f; + DUMPBITS(6) + NEEDBITS((unsigned)bd) /* get coded distance high bits */ + if ((e = (t = td + ((~(unsigned)b) & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + d = w - d - t->v.n; /* construct offset */ + NEEDBITS((unsigned)bl) /* get coded length */ + if ((e = (t = tl + ((~(unsigned)b) & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((~(unsigned)b) & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + n = t->v.n; + if (e) /* get length extra bits */ + { + NEEDBITS(8) + n += (unsigned)b & 0xff; + DUMPBITS(8) + } + + /* do the copy */ + s -= n; + do { + n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); + if (u && w <= d) + { + memset(slide + w, 0, e); + w += e; + d += e; + } + else +#ifndef NOMEMCPY + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* !NOMEMCPY */ + do { + slide[w++] = slide[d++]; + } while (--e); + if (w == WSIZE) + { + flush(w); + w = u = 0; + } + } while (n); + } + } + + /* flush out slide */ + flush(w); + return pfile_in_zip_read_info->rest_read_compressed ? 5 : 0; /* should have read csize bytes */ +} + + + +int explode () +/* Explode an imploded compressed stream. Based on the general purpose + bit flag, decide on coded or uncoded literals, and an 8K or 4K sliding + window. Construct the literal (if any), length, and distance codes and + the tables needed to decode them (using huft_build() from inflate.c), + and call the appropriate routine for the type of data in the remainder + of the stream. The four routines are nearly identical, differing only + in whether the literal is decoded or simply read in, and in how many + bits are read in, uncoded, for the low distance bits. */ +{ + unsigned r; /* return codes */ + struct huft *tb; /* literal code table */ + struct huft *tl; /* length code table */ + struct huft *td; /* distance code table */ + int bb; /* bits for tb */ + int bl; /* bits for tl */ + int bd; /* bits for td */ + unsigned l[256]; /* bit lengths for codes */ + + + /* Tune base table sizes. Note: I thought that to truly optimize speed, + I would have to select different bl, bd, and bb values for different + compressed file sizes. I was suprised to find out the the values of + 7, 7, and 9 worked best over a very wide range of sizes, except that + bd = 8 worked marginally better for large compressed sizes. */ + bl = 7; + bd = pUnzip->pfile_in_zip_read->rest_read_compressed > 200000L ? 8 : 7; + + + /* With literal tree--minimum match length is 3 */ + hufts = 0; /* initialze huft's malloc'ed */ + if (pUnzip->cur_file_info.flag & 4) + { + bb = 9; /* base table size for literals */ + if ((r = get_tree(l, 256)) != 0) + return r; + if ((r = huft_build(l, 256, 256, NULL, NULL, &tb, &bb)) != 0) + { + if (r == 1) + huft_free(tb); + return r; + } + if ((r = get_tree(l, 64)) != 0) + return r; + if ((r = huft_build(l, 64, 0, cplen3, extra, &tl, &bl)) != 0) + { + if (r == 1) + huft_free(tl); + huft_free(tb); + return r; + } + if ((r = get_tree(l, 64)) != 0) + return r; + if (pUnzip->cur_file_info.flag & 2) /* true if 8K */ + { + if ((r = huft_build(l, 64, 0, cpdist8, extra, &td, &bd)) != 0) + { + if (r == 1) + huft_free(td); + huft_free(tl); + huft_free(tb); + return r; + } + r = explode_lit8(tb, tl, td, bb, bl, bd); + } + else /* else 4K */ + { + if ((r = huft_build(l, 64, 0, cpdist4, extra, &td, &bd)) != 0) + { + if (r == 1) + huft_free(td); + huft_free(tl); + huft_free(tb); + return r; + } + r = explode_lit4(tb, tl, td, bb, bl, bd); + } + huft_free(td); + huft_free(tl); + huft_free(tb); + } + else + + + /* No literal tree--minimum match length is 2 */ + { + if ((r = get_tree(l, 64)) != 0) + return r; + if ((r = huft_build(l, 64, 0, cplen2, extra, &tl, &bl)) != 0) + { + if (r == 1) + huft_free(tl); + return r; + } + if ((r = get_tree(l, 64)) != 0) + return r; + if (pUnzip->cur_file_info.flag & 2) /* true if 8K */ + { + if ((r = huft_build(l, 64, 0, cpdist8, extra, &td, &bd)) != 0) + { + if (r == 1) + huft_free(td); + huft_free(tl); + return r; + } + r = explode_nolit8(tl, td, bl, bd); + } + else /* else 4K */ + { + if ((r = huft_build(l, 64, 0, cpdist4, extra, &td, &bd)) != 0) + { + if (r == 1) + huft_free(td); + huft_free(tl); + return r; + } + r = explode_nolit4(tl, td, bl, bd); + } + huft_free(td); + huft_free(tl); + } +#ifdef DEBUG + fprintf(stderr, "<%u > ", hufts); +#endif /* DEBUG */ + return r; +} + + +int ReadByte(x) + UWORD *x; +{ + /* + * read a byte; return 8 if byte available, 0 if not + */ + + if (pfile_in_zip_read_info->stream.avail_in == 0) + { + unsigned int uReadThis = UNZ_BUFSIZE; + + if (pfile_in_zip_read_info->rest_read_compressed <= 0) + return (0); + + if (pfile_in_zip_read_info->rest_read_compressed < uReadThis) + uReadThis = (uInt) pfile_in_zip_read_info->rest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (fseek (pfile_in_zip_read_info->file, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, SEEK_SET) != 0) + return UNZ_ERRNO; + if (fread (pfile_in_zip_read_info->read_buffer, uReadThis, 1, + pfile_in_zip_read_info->file) != 1) + return UNZ_ERRNO; + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed -= uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef *) pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt) uReadThis; + } + + *x = *pfile_in_zip_read_info->stream.next_in++; + pfile_in_zip_read_info->stream.avail_in--; + + return 8; +} + +/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ +#define BMAX 16 /* maximum bit length of any code (16 for explode) */ +#define N_MAX 288 /* maximum number of codes in any set */ + +unsigned hufts; /* track memory usage */ + + +int huft_build(b, n, s, d, e, t, m) +unsigned *b; /* code lengths in bits (all assumed <= BMAX) */ +unsigned n; /* number of codes (assumed <= N_MAX) */ +unsigned s; /* number of simple-valued codes (0..s-1) */ +ush *d; /* list of base values for non-simple codes */ +ush *e; /* list of extra bits for non-simple codes */ +struct huft **t; /* result: starting table */ +int *m; /* maximum lookup bits, returns actual */ +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return zero on success, one if + the given code set is incomplete (the tables are still built in this + case), two if the input is invalid (all zero length codes or an + oversubscribed set of lengths), and three if not enough memory. */ +{ + unsigned a; /* counter for codes of length k */ + unsigned c[BMAX+1]; /* bit length count table */ + unsigned f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + register unsigned i; /* counter, current code */ + register unsigned j; /* counter */ + register int k; /* number of bits in current code */ + int l; /* bits per table (returned in m) */ + register unsigned *p; /* pointer into c[], b[], or v[] */ + register struct huft *q; /* points to current table */ + struct huft r; /* table entry for structure assignment */ + struct huft *u[BMAX]; /* table stack */ + unsigned v[N_MAX]; /* values in order of bit length */ + register int w; /* bits before this table == (l * h) */ + unsigned x[BMAX+1]; /* bit offsets, then code stack */ + unsigned *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + unsigned z; /* number of entries in current table */ + + + /* Generate counts for each bit length */ + memset(c, 0, sizeof(c)); + p = b; i = n; + do { + c[*p++]++; /* assume all entries <= BMAX */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (struct huft *)NULL; + *m = 0; + return 0; + } + + + /* Find minimum and maximum length, bound *m by those */ + l = *m; + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((unsigned)l < j) + l = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((unsigned)l > i) + l = i; + *m = l; + + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return 2; /* bad input: more codes than bits */ + if ((y -= c[i]) < 0) + return 2; + c[i] += y; + + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = -l; /* bits decoded == (l * h) */ + u[0] = (struct huft *)NULL; /* just to keep compilers happy */ + q = (struct huft *)NULL; /* ditto */ + z = 0; /* ditto */ + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { + a = c[k]; + while (a--) + { + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l) + { + h++; + w += l; /* previous table always l bits */ + + /* compute minimum size table less than or equal to l bits */ + z = (z = g - w) > (unsigned)l ? l : z; /* upper limit on table size */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } + z = 1 << j; /* table entries for j-bit table */ + + /* allocate and link in new table */ + if ((q = (struct huft *)malloc((z + 1)*sizeof(struct huft))) == + (struct huft *)NULL) + { + if (h) + huft_free(u[0]); + return 3; /* not enough memory */ + } + hufts += z + 1; /* track memory usage */ + *t = q + 1; /* link to list for huft_free() */ + *(t = &(q->v.t)) = (struct huft *)NULL; + u[h] = ++q; /* table starts after link */ + + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.b = (uch)l; /* bits to dump before this table */ + r.e = (uch)(16 + j); /* bits in this table */ + r.v.t = q; /* pointer to this table */ + j = i >> (w - l); /* (get around Turbo C bug) */ + u[h-1][j] = r; /* connect to last table */ + } + } + + /* set up table entry in r */ + r.b = (uch)(k - w); + if (p >= v + n) + r.e = 99; /* out of values--invalid code */ + else if (*p < s) + { + r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ + r.v.n = *p++; /* simple code is just the value */ + } + else + { + r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ + r.v.n = d[*p++ - s]; + } + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + while ((i & ((1 << w) - 1)) != x[h]) + { + h--; /* don't need to update q */ + w -= l; + } + } + } + + + /* Return true (1) if we were given an incomplete table */ + return y != 0 && g != 1; +} + + +int huft_free(t) +struct huft *t; /* table to free */ +/* Free the malloc'ed tables built by huft_build(), which makes a linked + list of the tables it made, with the links in a dummy first entry of + each table. */ +{ + register struct huft *p, *q; + + + /* Go through linked list, freeing from the malloced (t[-1]) address. */ + p = t; + while (p != (struct huft *)NULL) + { + q = (--p)->v.t; + free(p); + p = q; + } + return 0; +} + +void flush(w) +unsigned w; /* number of bytes to flush */ +/* Do the equivalent of OUTB for the bytes slide[0..w-1]. */ +{ + memmove (pfile_in_zip_read_info->stream.next_out, slide, w); + pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + w); + pfile_in_zip_read_info->stream.next_out += w; + pfile_in_zip_read_info->stream.avail_out -= w; + pfile_in_zip_read_info->stream.total_out += w; +} + +void flush_stack(w) +unsigned w; /* number of bytes to flush */ +/* Do the equivalent of OUTB for the bytes slide[0..w-1]. */ +{ + memmove (pfile_in_zip_read_info->stream.next_out, stack, w); + pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + w); + pfile_in_zip_read_info->stream.next_out += w; + pfile_in_zip_read_info->stream.avail_out -= w; + pfile_in_zip_read_info->stream.total_out += w; +} + +/****************************/ +/* Function FillBitBuffer() */ +/****************************/ + +int FillBitBuffer() +{ + /* + * Fill bitbuf, which is 32 bits. This function is only used by the + * READBIT and PEEKBIT macros (which are used by all of the uncompression + * routines). + */ + UWORD temp; + + zipeof = 1; + while (bits_left < 25 && ReadByte(&temp) == 8) + { + bitbuf |= (ULONG)temp << bits_left; + bits_left += 8; + zipeof = 0; + } + return 0; +} + diff --git a/src/unzip/unreduce.c b/src/unzip/unreduce.c new file mode 100644 index 0000000..e978746 --- /dev/null +++ b/src/unzip/unreduce.c @@ -0,0 +1,217 @@ +/*--------------------------------------------------------------------------- + + unreduce.c + + The Reducing algorithm is actually a combination of two distinct algorithms. + The first algorithm compresses repeated byte sequences, and the second al- + gorithm takes the compressed stream from the first algorithm and applies a + probabilistic compression method. + + ---------------------------------------------------------------------------*/ + + +#include "unz.h" +#include "unzipP.h" + +/**************************************/ +/* UnReduce Defines, Typedefs, etc. */ +/**************************************/ + +#define DLE 144 + +typedef byte f_array[64]; /* for followers[256][64] */ + +static void LoadFollowers (); +void flush OF((unsigned)); /* routine from inflate.c */ + +extern file_in_zip_read_info_s *pfile_in_zip_read_info; +extern unz_s *pUnzip; + +/*******************************/ +/* UnReduce Global Variables */ +/*******************************/ + +#if (defined(MACOS) || defined(MTS)) + f_array *followers; /* shared work space */ +#else + f_array *followers = (f_array *) (slide + 0x4000); +#endif + +byte Slen[256]; +int factor; + +int L_table[] = +{0, 0x7f, 0x3f, 0x1f, 0x0f}; + +int D_shift[] = +{0, 0x07, 0x06, 0x05, 0x04}; +int D_mask[] = +{0, 0x01, 0x03, 0x07, 0x0f}; + +int B_table[] = +{8, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8}; + + + + + +/*************************/ +/* Function unReduce() */ +/*************************/ + +void unReduce() /* expand probabilistically reduced data */ +{ + register int lchar = 0; + int nchar; + int ExState = 0; + int V = 0; + int Len = 0; + longint s = pUnzip->pfile_in_zip_read->rest_read_compressed; + unsigned w = 0; /* position in output window slide[] */ + unsigned u = 1; /* true if slide[] unflushed */ + + +#if (defined(MACOS) || defined(MTS)) + followers = (f_array *) (slide + 0x4000); +#endif + + factor = pUnzip->cur_file_info.compression_method; + LoadFollowers(); + + while (s > 0 /* && (!zipeof) */) { + if (Slen[lchar] == 0) + READBIT(8, nchar) /* ; */ + else { + READBIT(1, nchar); + if (nchar != 0) + READBIT(8, nchar) /* ; */ + else { + int follower; + int bitsneeded = B_table[Slen[lchar]]; + READBIT(bitsneeded, follower); + nchar = followers[lchar][follower]; + } + } + /* expand the resulting byte */ + switch (ExState) { + + case 0: + if (nchar != DLE) { + s--; + slide[w++] = (byte) nchar; + if (w == 0x4000) { + flush(w); + w = u = 0; + } + } + else + ExState = 1; + break; + + case 1: + if (nchar != 0) { + V = nchar; + Len = V & L_table[factor]; + if (Len == L_table[factor]) + ExState = 2; + else + ExState = 3; + } else { + s--; + slide[w++] = DLE; + if (w == 0x4000) + { + flush(w); + w = u = 0; + } + ExState = 0; + } + break; + + case 2:{ + Len += nchar; + ExState = 3; + } + break; + + case 3:{ + register unsigned e; + register unsigned n = Len + 3; + register unsigned d = w - ((((V >> D_shift[factor]) & + D_mask[factor]) << 8) + nchar + 1); + + s -= n; + do { + n -= (e = (e = 0x4000 - ((d &= 0x3fff) > w ? d : w)) > n ? + n : e); + if (u && w <= d) + { + memset(slide + w, 0, e); + w += e; + d += e; + } + else + if (w - d < e) /* (assume unsigned comparison) */ + do { /* slow to avoid memcpy() overlap */ + slide[w++] = slide[d++]; + } while (--e); + else + { + memcpy(slide + w, slide + d, e); + w += e; + d += e; + } + if (w == 0x4000) + { + flush(w); + w = u = 0; + } + } while (n); + + ExState = 0; + } + break; + } + + /* store character for next iteration */ + lchar = nchar; + } + + /* flush out slide */ + flush(w); +} + + + + + +/******************************/ +/* Function LoadFollowers() */ +/******************************/ + +static void LoadFollowers() +{ + register int x; + register int i; + + for (x = 255; x >= 0; x--) { + READBIT(6, Slen[x]); + for (i = 0; (byte) i < Slen[x]; i++) { + READBIT(8, followers[x][i]); + } + } +} diff --git a/src/unzip/unshrink.c b/src/unzip/unshrink.c new file mode 100644 index 0000000..6deb4d4 --- /dev/null +++ b/src/unzip/unshrink.c @@ -0,0 +1,177 @@ +/*--------------------------------------------------------------------------- + + unshrink.c + + Shrinking is a Dynamic Lempel-Ziv-Welch compression algorithm with partial + clearing. + + ---------------------------------------------------------------------------*/ + + +#include "unz.h" +void flush_stack (int); + +/*************************************/ +/* UnShrink Defines, Globals, etc. */ +/*************************************/ + +/* MAX_BITS 13 (in unzip.h; defines size of global work area) */ +#define INIT_BITS 9 +#define FIRST_ENT 257 +#define CLEAR 256 +#define GetCode(dest) READBIT(codesize,dest) + +static void partial_clear (); + +int codesize, maxcode, maxcodemax, free_ent; + + + + +/*************************/ +/* Function unShrink() */ +/*************************/ + +void unShrink() +{ + register int code; + register int stackp; + int finchar; + int oldcode; + int incode; + + + /* decompress the file */ + codesize = INIT_BITS; + maxcode = (1 << codesize) - 1; + maxcodemax = HSIZE; /* (1 << MAX_BITS) */ + free_ent = FIRST_ENT; + + code = maxcodemax; + do { + prefix_of[code] = -1; + } while (--code > 255); +/* + OvdL: -Ox with SCO's 3.2.0 cc gives + a. warning: overflow in constant multiplication + b. segmentation fault (core dumped) when using the executable + for (code = maxcodemax; code > 255; code--) + prefix_of[code] = -1; + */ + + for (code = 255; code >= 0; code--) { + prefix_of[code] = 0; + suffix_of[code] = (byte) code; + } + + GetCode(oldcode); + if (zipeof) + return; + finchar = oldcode; + + stack[0] = finchar; + flush_stack (1); + + stackp = HSIZE; + + while (!zipeof) { + GetCode(code); + if (zipeof) + return; + + while (code == CLEAR) { + GetCode(code); + switch (code) { + case 1: + codesize++; + if (codesize == MAX_BITS) + maxcode = maxcodemax; + else + maxcode = (1 << codesize) - 1; + break; + + case 2: + partial_clear(); + break; + } + + GetCode(code); + if (zipeof) + return; + } + + + /* special case for KwKwK string */ + incode = code; + if (prefix_of[code] == -1) { + stack[--stackp] = (byte) finchar; + code = oldcode; + } + /* generate output characters in reverse order */ + while (code >= FIRST_ENT) { + if (prefix_of[code] == -1) { + stack[--stackp] = (byte) finchar; + code = oldcode; + } else { + stack[--stackp] = suffix_of[code]; + code = prefix_of[code]; + } + } + + finchar = suffix_of[code]; + stack[--stackp] = (byte) finchar; + + /* and put them out in forward order, block copy */ + flush_stack (HSIZE - stackp); + stackp = HSIZE; + + /* generate new entry */ + code = free_ent; + if (code < maxcodemax) { + prefix_of[code] = oldcode; + suffix_of[code] = (byte) finchar; + + do + code++; + while ((code < maxcodemax) && (prefix_of[code] != -1)); + + free_ent = code; + } + /* remember previous code */ + oldcode = incode; + } +} + + + +/******************************/ +/* Function partial_clear() */ +/******************************/ + +static void partial_clear() +{ + register int pr; + register int cd; + + /* mark all nodes as potentially unused */ + for (cd = FIRST_ENT; cd < free_ent; cd++) + prefix_of[cd] |= 0x8000; + + /* unmark those that are used by other nodes */ + for (cd = FIRST_ENT; cd < free_ent; cd++) { + pr = prefix_of[cd] & 0x7fff; /* reference to another node? */ + if (pr >= FIRST_ENT) /* flag node as referenced */ + prefix_of[pr] &= 0x7fff; + } + + /* clear the ones that are still marked */ + for (cd = FIRST_ENT; cd < free_ent; cd++) + if ((prefix_of[cd] & 0x8000) != 0) + prefix_of[cd] = -1; + + /* find first cleared node as next free_ent */ + cd = FIRST_ENT; + while ((cd < maxcodemax) && (prefix_of[cd] != -1)) + cd++; + free_ent = cd; +} diff --git a/src/unzip/unz.h b/src/unzip/unz.h new file mode 100644 index 0000000..1ea7478 --- /dev/null +++ b/src/unzip/unz.h @@ -0,0 +1,994 @@ +/*--------------------------------------------------------------------------- + + unzip.h + + This header file is used by all of the unzip source files. Its contents + are divided into seven more-or-less separate sections: predefined macros, + OS-dependent includes, (mostly) OS-independent defines, typedefs, function + prototypes (or "prototypes," in the case of non-ANSI compilers), macros, + and global-variable declarations. + + ---------------------------------------------------------------------------*/ + +#include "zlib.h" + +/*****************************************/ +/* Predefined, Machine-specific Macros */ +/*****************************************/ + +#if (defined(__GO32__) && defined(unix)) /* DOS extender */ +# undef unix +#endif + +#if defined(unix) || defined(__convexc__) || defined(M_XENIX) +# ifndef UNIX +# define UNIX +# endif /* !UNIX */ +#endif /* unix || __convexc__ || M_XENIX */ + +/* Much of the following is swiped from zip's tailor.h: */ + +/* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */ +#ifdef __POWERC +# define __TURBOC__ +# define MSDOS +#endif /* __POWERC */ +#if (defined(__TURBOC__) && defined(__MSDOS__) && !defined(MSDOS)) +# define MSDOS +#endif + +/* use prototypes and ANSI libraries if __STDC__, or Microsoft or Borland C, + * or Silicon Graphics, or Convex, or IBM C Set/2, or GNU gcc under emx, or + * or Watcom C, or Macintosh, or Windows NT. + */ +#if (__STDC__ || defined(MSDOS) || defined(sgi) || defined(CONVEX) || defined(__sun)) +# ifndef PROTO +# define PROTO +# endif +# define MODERN +#endif +#if (defined(__IBMC__) || defined(__EMX__) || defined(__WATCOMC__)) +# ifndef PROTO +# define PROTO +# endif +# define MODERN +#endif +#if (defined(THINK_C) || defined(MPW) || defined(WIN32)) +# ifndef PROTO +# define PROTO +# endif +# define MODERN +#endif + +/* turn off prototypes if requested */ +#if (defined(NOPROTO) && defined(PROTO)) +# undef PROTO +#endif + +#if (defined(ultrix) || defined(bsd4_2) || defined(sun) || defined(pyr)) +# if (!defined(BSD) && !defined(__SYSTEM_FIVE) && !defined(SYSV)) +# define BSD +# endif /* !BSD && !__SYSTEM_FIVE && !SYSV */ +#endif /* ultrix || bsd4_2 || sun || pyr */ + +#if (defined(CONVEX) || defined(CRAY) || defined(__SYSTEM_FIVE)) +# ifndef TERMIO +# define TERMIO +# endif /* !TERMIO */ +#endif /* CONVEX || CRAY || __SYSTEM_FIVE */ + +#ifdef pyr /* Pyramid */ +# ifndef ZMEM +# define ZMEM +# endif /* !ZMEM */ +#endif /* pyr */ + +#ifdef CRAY +# ifdef ZMEM +# undef ZMEM +# endif /* ZMEM */ +#endif /* CRAY */ + +/* the i386 test below is to catch SCO Unix (which has redefinition + * warnings if param.h is included), but it probably doesn't hurt if + * other 386 Unixes get nailed, too...except now that 386BSD and BSDI + * exist. Sigh. is mostly included for "BSD", I think. + * [An alternate fix for SCO Unix is below.] + */ +#if (defined(MINIX) || (defined(i386) && defined(unix))) +# define NO_PARAM_H +#endif /* MINIX || (i386 && unix) */ + + + + + +/***************************/ +/* OS-Dependent Includes */ +/***************************/ + +#ifndef MINIX /* Minix needs it after all the other includes (?) */ +# include +#endif +#include /* skip for VMS, to use tolower() function? */ +#include /* used in mapname() */ +#ifndef NO_ERRNO +# define DECLARE_ERRNO /* everybody except MSC 6.0, SCO cc, Watcom C/386 */ +#endif /* !NO_ERRNO */ +#ifdef VMS +# include /* (placed up here instead of in VMS section below */ +# include /* because types.h is used in some other headers) */ +#else /* !VMS */ +# if !defined(THINK_C) && !defined(MPW) +# include /* off_t, time_t, dev_t, ... */ +# include +# endif /* !THINK_C && !MPW */ +#endif /* ?VMS */ + +#ifdef MODERN +# if (!defined(M_XENIX) && !(defined(__GNUC__) && defined(sun))) +# include +# endif +# if (!defined(__GNUC__) && !defined(apollo)) /* both define __STDC__ */ +# include /* standard library prototypes, malloc(), etc. */ +# else +# ifdef __EMX__ +# include /* emx IS gcc but has stdlib.h */ +# endif +# endif +# include /* defines strcpy, strcmp, memcpy, etc. */ + typedef size_t extent; +#else /* !MODERN */ + char *malloc(); + char *strchr(), *strrchr(); + long lseek(); + typedef unsigned int extent; +# define void int +#endif /* ?MODERN */ + +/* this include must be down here for SysV.4, for some reason... */ +#include /* used in unzip.c, file_io.c */ + + + +/*--------------------------------------------------------------------------- + Next, a word from our Unix (mostly) sponsors: + ---------------------------------------------------------------------------*/ + +#ifdef UNIX +# ifdef AMIGA +# include +# else /* !AMIGA */ +# ifndef NO_PARAM_H +#if 0 /* [GRR: this is an alternate fix for SCO's redefinition bug] */ +# ifdef NGROUPS_MAX +# undef NGROUPS_MAX /* SCO bug: defined again in */ +# endif /* NGROUPS_MAX */ +#endif /* 0 */ +# include /* conflict with , some systems? */ +# endif /* !NO_PARAM_H */ +# endif /* ?AMIGA */ + +# ifndef BSIZE +# ifdef MINIX +# define BSIZE 1024 +# else /* !MINIX */ +# define BSIZE DEV_BSIZE /* assume common for all Unix systems */ +# endif /* ?MINIX */ +# endif + +# ifndef BSD +# if (!defined(AMIGA) && !defined(MINIX)) +# define NO_MKDIR /* for mapname() */ +# endif /* !AMIGA && !MINIX */ +# include + struct tm *gmtime(), *localtime(); +# else /* BSD */ +# include +# include +# ifdef _AIX +# include +# endif +# endif + +#else /* !UNIX */ +# define BSIZE 512 /* disk block size */ +#endif /* ?UNIX */ + +#if (defined(V7) || defined(BSD)) +# define strchr index +# define strrchr rindex +#endif + +/*--------------------------------------------------------------------------- + And now, our MS-DOS and OS/2 corner: + ---------------------------------------------------------------------------*/ + +#ifdef __TURBOC__ +# define DOS_OS2 +# include /* for structure ftime */ +# ifndef __BORLANDC__ /* there appears to be a bug (?) in Borland's */ +# include /* MEM.H related to __STDC__ and far poin- */ +# endif /* ters. (dpk) [mem.h included for memcpy] */ +# include /* for REGS macro (at least for Turbo C 2.0) */ +#else /* NOT Turbo C (or Power C)... */ +# ifdef MSDOS /* but still MS-DOS, so we'll assume it's */ +# ifndef MSC /* Microsoft's compiler and fake the ID, if */ +# define MSC /* necessary (it is in 5.0; apparently not */ +# endif /* in 5.1 and 6.0) */ +# include /* for _dos_setftime() */ +# endif +#endif + +#if (defined(__IBMC__) && defined(__OS2__)) +# define DOS_OS2 +# define S_IFMT 0xF000 +# define timezone _timezone +#endif + +#ifdef __WATCOMC__ +# define DOS_OS2 +# define __32BIT__ +# ifdef DECLARE_ERRNO +# undef DECLARE_ERRNO +# endif +# undef far +# define far +#endif + +#ifdef __EMX__ +# define DOS_OS2 +# define __32BIT__ +# define far +#endif /* __EMX__ */ + +#ifdef MSC /* defined for all versions of MSC now */ +# define DOS_OS2 /* Turbo C under DOS, MSC under DOS or OS/2 */ +# if (defined(_MSC_VER) && (_MSC_VER >= 600)) /* new with 5.1 or 6.0 ... */ +# undef DECLARE_ERRNO /* errno is now a function in a dynamic link */ +# endif /* library (or something)--incompatible with */ +#endif /* the usual "extern int errno" declaration */ + +#ifdef DOS_OS2 /* defined for all MS-DOS and OS/2 compilers */ +# include /* lseek(), open(), setftime(), dup(), creat() */ +# include /* localtime() */ +#endif + +#ifdef OS2 /* defined for all OS/2 compilers */ +# ifdef isupper +# undef isupper +# endif +# ifdef tolower +# undef tolower +# endif +# define isupper(x) IsUpperNLS((unsigned char)(x)) +# define tolower(x) ToLowerNLS((unsigned char)(x)) +#endif + +#ifdef WIN32 +# include /* read(), open(), etc. */ +# include +# include +# include /* mkdir() */ +# ifdef FILE_IO_C +# include +# include +# include +# include +# include +# define DOS_OS2 +# define getch() getchar() +# endif +#endif + +/*--------------------------------------------------------------------------- + Followed by some VMS (mostly) stuff: + ---------------------------------------------------------------------------*/ + +#ifdef VMS +# include /* the usual non-BSD time functions */ +# include /* same things as fcntl.h has */ +# include +# define _MAX_PATH NAM$C_MAXRSS /* to define FILNAMSIZ below */ +# define UNIX /* can share most of same code from now on */ +# define RETURN return_VMS /* VMS interprets return codes incorrectly */ +#else /* !VMS */ +# ifndef THINK_C +# define RETURN return /* only used in main() */ +# else +# define RETURN(v) { int n;\ + n = (v);\ + fprintf(stderr, "\npress to continue ");\ + while (getc(stdin) != '\n');\ + putc('\n', stderr);\ + InitCursor();\ + goto start;\ + } +# endif +# ifdef V7 +# define O_RDONLY 0 +# define O_WRONLY 1 +# define O_RDWR 2 +# else /* !V7 */ +# ifdef MTS +# include /* MTS uses this instead of fcntl.h */ +# include +# include +# else /* !MTS */ +# ifdef COHERENT /* Coherent 3.10/Mark Williams C */ +# include +# define SHORT_NAMES +# define tzset settz +# else /* !COHERENT */ +# include /* O_BINARY for open() w/o CR/LF translation */ +# endif /* ?COHERENT */ +# endif /* ?MTS */ +# endif /* ?V7 */ +#endif /* ?VMS */ + +#if (defined(MSDOS) || defined(VMS)) +# define DOS_VMS +#endif + +/*--------------------------------------------------------------------------- + And some Mac stuff for good measure: + ---------------------------------------------------------------------------*/ + +#ifdef THINK_C +# define MACOS +# ifndef __STDC__ /* if Think C hasn't defined __STDC__ ... */ +# define __STDC__ 1 /* make sure it's defined: it needs it */ +# else /* __STDC__ defined */ +# if !__STDC__ /* sometimes __STDC__ is defined as 0; */ +# undef __STDC__ /* it needs to be 1 or required header */ +# define __STDC__ 1 /* files are not properly included. */ +# endif /* !__STDC__ */ +# endif /* ?defined(__STDC__) */ +#endif /* THINK_C */ + +#ifdef MPW +# define MACOS +# include +# include +# include +# include +# include +# define CtoPstr c2pstr +# define PtoCstr p2cstr +# ifdef CR +# undef CR +# endif +#endif /* MPW */ + +#ifdef MACOS +# define open(x,y) macopen(x,y, gnVRefNum, glDirID) +# define close macclose +# define read macread +# define write macwrite +# define lseek maclseek +# define creat(x,y) maccreat(x, gnVRefNum, glDirID, gostCreator, gostType) +# define stat(x,y) macstat(x,y,gnVRefNum, glDirID) + +# ifndef isascii +# define isascii(c) ((unsigned char)(c) <= 0x3F) +# endif + +# include "macstat.h" + +typedef struct _ZipExtraHdr { + unsigned short header; /* 2 bytes */ + unsigned short data; /* 2 bytes */ +} ZIP_EXTRA_HEADER; + +typedef struct _MacInfoMin { + unsigned short header; /* 2 bytes */ + unsigned short data; /* 2 bytes */ + unsigned long signature; /* 4 bytes */ + FInfo finfo; /* 16 bytes */ + unsigned long lCrDat; /* 4 bytes */ + unsigned long lMdDat; /* 4 bytes */ + unsigned long flags ; /* 4 bytes */ + unsigned long lDirID; /* 4 bytes */ + /*------------*/ +} MACINFOMIN; /* = 40 bytes for size of data */ + +typedef struct _MacInfo { + unsigned short header; /* 2 bytes */ + unsigned short data; /* 2 bytes */ + unsigned long signature; /* 4 bytes */ + FInfo finfo; /* 16 bytes */ + unsigned long lCrDat; /* 4 bytes */ + unsigned long lMdDat; /* 4 bytes */ + unsigned long flags ; /* 4 bytes */ + unsigned long lDirID; /* 4 bytes */ + char rguchVolName[28]; /* 28 bytes */ + /*------------*/ +} MACINFO; /* = 68 bytes for size of data */ +#endif /* MACOS */ + +/*--------------------------------------------------------------------------- + And finally, some random extra stuff: + ---------------------------------------------------------------------------*/ + +#ifdef MINIX +# include +#endif + +#ifdef SHORT_NAMES /* Mark Williams C, ...? */ +# define extract_or_test_files xtr_or_tst_files +# define extract_or_test_member xtr_or_tst_member +#endif + +#ifdef MTS +# include /* Some important non-ANSI routines */ +# define mkdir(s,n) (-1) /* No "make directory" capability */ +# define EBCDIC /* Set EBCDIC conversion on */ +#endif + + + + + +/*************/ +/* Defines */ +/*************/ + +#ifndef WSIZE +# define WSIZE 0x8000 /* window size--must be a power of two, and */ +#endif /* !WSIZE */ /* at least 32K for zip's deflate method */ + +#define DIR_BLKSIZ 64 /* number of directory entries per block + * (should fit in 4096 bytes, usually) */ +#ifndef INBUFSIZ +# define INBUFSIZ 2048 /* works for MS-DOS small model */ +#endif /* !INBUFSIZ */ + +/* + * If exists on most systems, should include that, since it may + * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX, + * _POSIX_PATH_MAX. + */ +#ifdef DOS_OS2 +# include +#endif /* DOS_OS2 */ + +#ifdef _MAX_PATH +# define FILNAMSIZ (_MAX_PATH) +#else /* !_MAX_PATH */ +# define FILNAMSIZ 1025 +#endif /* ?_MAX_PATH */ + +#ifndef PATH_MAX +# ifdef MAXPATHLEN /* defined in some systems */ +# define PATH_MAX MAXPATHLEN +# else +# if FILENAME_MAX > 255 /* used like PATH_MAX on some systems */ +# define PATH_MAX FILENAME_MAX +# else +# define PATH_MAX (FILNAMSIZ - 1) +# endif +# endif /* ?MAXPATHLEN */ +#endif /* !PATH_MAX */ + +#define OUTBUFSIZ INBUFSIZ + +#define ZSUFX ".zip" +#define CENTRAL_HDR_SIG "\113\001\002" /* the infamous "PK" signature */ +#define LOCAL_HDR_SIG "\113\003\004" /* bytes, sans "P" (so unzip */ +#define END_CENTRAL_SIG "\113\005\006" /* executable not mistaken for */ +#define EXTD_LOCAL_SIG "\113\007\010" /* zipfile itself) */ + +#define SKIP 0 /* choice of activities for do_string() */ +#define DISPLAY 1 +#define FILENAME 2 +#define EXTRA_FIELD 3 + +#define DOES_NOT_EXIST -1 /* return values for check_for_newer() */ +#define EXISTS_AND_OLDER 0 +#define EXISTS_AND_NEWER 1 + +#define DOS_OS2_FAT_ 0 /* version_made_by codes (central dir) */ +#define AMIGA_ 1 +#define VMS_ 2 /* make sure these are not defined on */ +#define UNIX_ 3 /* the respective systems!! (like, for */ +#define VM_CMS_ 4 /* instance, "VMS", or "UNIX": CFLAGS = */ +#define ATARI_ 5 /* -O -DUNIX) */ +#define OS2_HPFS_ 6 +#define MAC_ 7 +#define Z_SYSTEM_ 8 +#define CPM_ 9 +/* #define TOPS20_ 10? (TOPS20_ is to be defined in PKZIP 2.0...) */ +#define NUM_HOSTS 10 /* index of last system + 1 */ + +#define STORED 0 /* compression methods */ +#define SHRUNK 1 +#define REDUCED1 2 +#define REDUCED2 3 +#define REDUCED3 4 +#define REDUCED4 5 +#define IMPLODED 6 +#define TOKENIZED 7 +#define DEFLATED 8 +#define NUM_METHODS 9 /* index of last method + 1 */ +/* don't forget to update list_files() appropriately if NUM_METHODS changes */ + +#define DF_MDY 0 /* date format 10/26/91 (USA only) */ +#define DF_DMY 1 /* date format 26/10/91 (most of the world) */ +#define DF_YMD 2 /* date format 91/10/26 (a few countries) */ + +#define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */ +#define VMS_VERSION 42 /* if OS-needed-to-extract is VMS: can do */ + +/*--------------------------------------------------------------------------- + True sizes of the various headers, as defined by PKWare--so it is not + likely that these will ever change. But if they do, make sure both these + defines AND the typedefs below get updated accordingly. + ---------------------------------------------------------------------------*/ +#define LREC_SIZE 26 /* lengths of local file headers, central */ +#define CREC_SIZE 42 /* directory headers, and the end-of- */ +#define ECREC_SIZE 18 /* central-dir record, respectively */ + +#define MAX_BITS 13 /* used in unShrink() */ +#define HSIZE (1 << MAX_BITS) /* size of global work area */ + +#define LF 10 /* '\n' on ASCII machines. Must be 10 due to EBCDIC */ +#define CR 13 /* '\r' on ASCII machines. Must be 13 due to EBCDIC */ +#define CTRLZ 26 /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */ + +#ifdef EBCDIC +# define ascii_to_native(c) ebcdic[(c)] +# define NATIVE "EBCDIC" +#endif + +#if MPW +# define FFLUSH putc('\n',stderr); +#else /* !MPW */ +# define FFLUSH fflush(stderr); +#endif /* ?MPW */ + +#ifdef VMS +# define ENV_UNZIP "UNZIP_OPTS" /* name of environment variable */ +# define ENV_ZIPINFO "ZIPINFO_OPTS" +#else /* !VMS */ +# define ENV_UNZIP "UNZIP" +# define ENV_ZIPINFO "ZIPINFO" +#endif /* ?VMS */ + +#ifdef CRYPT +# define PWLEN 80 +# define DECRYPT(b) (update_keys(t=((b)&0xff)^decrypt_byte()),t) +#endif /* CRYPT */ + +#ifdef QQ /* Newtware version */ +# define QCOND (!quietflg) /* for no file comments with -vq or -vqq */ +#else /* (original) Bill Davidsen version */ +# define QCOND (which_hdr) /* no way to kill file comments with -v, -l */ +#endif + +#ifndef TRUE +# define TRUE 1 /* sort of obvious */ +#endif +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef SEEK_SET /* These should all be declared in stdio.h! But */ +# define SEEK_SET 0 /* since they're not (in many cases), do so here. */ +# define SEEK_CUR 1 +# define SEEK_END 2 +#endif + +#ifndef S_IRUSR +# define S_IRWXU 00700 /* read, write, execute: owner */ +# define S_IRUSR 00400 /* read permission: owner */ +# define S_IWUSR 00200 /* write permission: owner */ +# define S_IXUSR 00100 /* execute permission: owner */ +# define S_IRWXG 00070 /* read, write, execute: group */ +# define S_IRGRP 00040 /* read permission: group */ +# define S_IWGRP 00020 /* write permission: group */ +# define S_IXGRP 00010 /* execute permission: group */ +# define S_IRWXO 00007 /* read, write, execute: other */ +# define S_IROTH 00004 /* read permission: other */ +# define S_IWOTH 00002 /* write permission: other */ +# define S_IXOTH 00001 /* execute permission: other */ +#endif /* !S_IRUSR */ + +#ifdef ZIPINFO /* these are individually checked because SysV doesn't */ +# ifndef S_IFBLK /* have some of them, Microsoft C others, etc. */ +# define S_IFBLK 0060000 /* block special */ +# endif +# ifndef S_IFIFO /* in Borland C, not MSC */ +# define S_IFIFO 0010000 /* fifo */ +# endif +# ifndef S_IFLNK /* in BSD, not SysV */ +# define S_IFLNK 0120000 /* symbolic link */ +# endif +# ifndef S_IFSOCK /* in BSD, not SysV */ +# define S_IFSOCK 0140000 /* socket */ +# endif +# ifndef S_ISUID +# define S_ISUID 04000 /* set user id on execution */ +# endif +# ifndef S_ISGID +# define S_ISGID 02000 /* set group id on execution */ +# endif +# ifndef S_ISVTX +# define S_ISVTX 01000 /* directory permissions control */ +# endif +# ifndef S_ENFMT +# define S_ENFMT S_ISGID /* record locking enforcement flag */ +# endif +#endif /* ZIPINFO */ + + + + + +/**************/ +/* Typedefs */ +/**************/ + +#ifndef _BULL_SOURCE /* Bull has it defined somewhere already */ + typedef unsigned char byte; /* code assumes UNSIGNED bytes */ +#endif /* !_BULL_SOURCE */ + +typedef char boolean; +typedef long longint; +typedef unsigned short UWORD; +typedef unsigned long ULONG; +typedef unsigned char uch; +typedef unsigned short ush; +typedef unsigned long ulg; + +typedef struct min_info { + unsigned unix_attr; + unsigned dos_attr; + int hostnum; + longint offset; + ULONG compr_size; /* compressed size (needed if extended header) */ + ULONG crc; /* crc (needed if extended header) */ + unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing */ + unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */ + unsigned text : 1; /* file is text or binary */ + unsigned lcflag : 1; /* convert filename to lowercase */ +} min_info; + +typedef struct VMStimbuf { + char *revdate; /* (both correspond to Unix modtime/st_mtime) */ + char *credate; +} VMStimbuf; + +/*--------------------------------------------------------------------------- + Zipfile layout declarations. If these headers ever change, make sure the + xxREC_SIZE defines (above) change with them! + ---------------------------------------------------------------------------*/ + + typedef byte local_byte_hdr[ LREC_SIZE ]; +# define L_VERSION_NEEDED_TO_EXTRACT_0 0 +# define L_VERSION_NEEDED_TO_EXTRACT_1 1 +# define L_GENERAL_PURPOSE_BIT_FLAG 2 +# define L_COMPRESSION_METHOD 4 +# define L_LAST_MOD_FILE_TIME 6 +# define L_LAST_MOD_FILE_DATE 8 +# define L_CRC32 10 +# define L_COMPRESSED_SIZE 14 +# define L_UNCOMPRESSED_SIZE 18 +# define L_FILENAME_LENGTH 22 +# define L_EXTRA_FIELD_LENGTH 24 + + typedef byte cdir_byte_hdr[ CREC_SIZE ]; +# define C_VERSION_MADE_BY_0 0 +# define C_VERSION_MADE_BY_1 1 +# define C_VERSION_NEEDED_TO_EXTRACT_0 2 +# define C_VERSION_NEEDED_TO_EXTRACT_1 3 +# define C_GENERAL_PURPOSE_BIT_FLAG 4 +# define C_COMPRESSION_METHOD 6 +# define C_LAST_MOD_FILE_TIME 8 +# define C_LAST_MOD_FILE_DATE 10 +# define C_CRC32 12 +# define C_COMPRESSED_SIZE 16 +# define C_UNCOMPRESSED_SIZE 20 +# define C_FILENAME_LENGTH 24 +# define C_EXTRA_FIELD_LENGTH 26 +# define C_FILE_COMMENT_LENGTH 28 +# define C_DISK_NUMBER_START 30 +# define C_INTERNAL_FILE_ATTRIBUTES 32 +# define C_EXTERNAL_FILE_ATTRIBUTES 34 +# define C_RELATIVE_OFFSET_LOCAL_HEADER 38 + + typedef byte ec_byte_rec[ ECREC_SIZE+4 ]; +/* define SIGNATURE 0 space-holder only */ +# define NUMBER_THIS_DISK 4 +# define NUM_DISK_WITH_START_CENTRAL_DIR 6 +# define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8 +# define TOTAL_ENTRIES_CENTRAL_DIR 10 +# define SIZE_CENTRAL_DIRECTORY 12 +# define OFFSET_START_CENTRAL_DIRECTORY 16 +# define ZIPFILE_COMMENT_LENGTH 20 + + + typedef struct local_file_header { /* LOCAL */ + byte version_needed_to_extract[2]; + UWORD general_purpose_bit_flag; + UWORD compression_method; + UWORD last_mod_file_time; + UWORD last_mod_file_date; + ULONG crc32; + ULONG compressed_size; + ULONG uncompressed_size; + UWORD filename_length; + UWORD extra_field_length; + } local_file_hdr; + + typedef struct central_directory_file_header { /* CENTRAL */ + byte version_made_by[2]; + byte version_needed_to_extract[2]; + UWORD general_purpose_bit_flag; + UWORD compression_method; + UWORD last_mod_file_time; + UWORD last_mod_file_date; + ULONG crc32; + ULONG compressed_size; + ULONG uncompressed_size; + UWORD filename_length; + UWORD extra_field_length; + UWORD file_comment_length; + UWORD disk_number_start; + UWORD internal_file_attributes; + ULONG external_file_attributes; + ULONG relative_offset_local_header; + } cdir_file_hdr; + + typedef struct end_central_dir_record { /* END CENTRAL */ + UWORD number_this_disk; + UWORD num_disk_with_start_central_dir; + UWORD num_entries_centrl_dir_ths_disk; + UWORD total_entries_central_dir; + ULONG size_central_directory; + ULONG offset_start_central_directory; + UWORD zipfile_comment_length; + } ecdir_rec; + + + + + +/*************************/ +/* Function Prototypes */ +/*************************/ + +#ifndef __ +# define __ OF +#endif + +/*--------------------------------------------------------------------------- + Decompression functions: + ---------------------------------------------------------------------------*/ + +int explode (); +void unReduce (); +void unShrink (); + +/*--------------------------------------------------------------------------- + Functions in file_io.c and crypt.c: + ---------------------------------------------------------------------------*/ + +int FillBitBuffer (); +int ReadByte __((UWORD *x)); /* file_io.c */ + +/************/ +/* Macros */ +/************/ + +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + + +#define LSEEK(abs_offset) {longint request=(abs_offset)+extra_bytes,\ + inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\ + if(request<0) {fprintf(stderr, SeekMsg, ReportMsg); return(3);}\ + else if(bufstart!=cur_zipfile_bufstart)\ + {cur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\ + if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\ + inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;} else\ + {incnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;}} + +/* + * Seek to the block boundary of the block which includes abs_offset, + * then read block into input buffer and set pointers appropriately. + * If block is already in the buffer, just set the pointers. This macro + * is used by process_end_central_dir (unzip.c) and do_string (misc.c). + * A slightly modified version is embedded within extract_or_test_files + * (unzip.c). ReadByte and readbuf (file_io.c) are compatible. + * + * macro LSEEK(abs_offset) + * ULONG abs_offset; + * { + * longint request = abs_offset + extra_bytes; + * longint inbuf_offset = request % INBUFSIZ; + * longint bufstart = request - inbuf_offset; + * + * if (request < 0) { + * fprintf(stderr, SeekMsg, ReportMsg); + * return(3); /-* 3: severe error in zipfile *-/ + * } else if (bufstart != cur_zipfile_bufstart) { + * cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET); + * if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0) + * return(51); /-* 51: unexpected EOF *-/ + * inptr = inbuf + (int)inbuf_offset; + * incnt -= (int)inbuf_offset; + * } else { + * incnt += (inptr-inbuf) - (int)inbuf_offset; + * inptr = inbuf + (int)inbuf_offset; + * } + * } + * + */ + + +#define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\ + {error_in_archive=error; if(error>1) return error;} + +/* + * Skip a variable-length field, and report any errors. Used in zipinfo.c + * and unzip.c in several functions. + * + * macro SKIP_(length) + * UWORD length; + * { + * if (length && ((error = do_string(length, SKIP)) != 0)) { + * error_in_archive = error; /-* might be warning *-/ + * if (error > 1) /-* fatal *-/ + * return (error); + * } + * } + * + */ + +#define READBIT(nbits,zdest) {if(nbits>bits_left) FillBitBuffer();\ + zdest=(int)((UWORD)bitbuf&mask_bits[nbits]);bitbuf>>=nbits;bits_left-=nbits;} + +/* + * macro READBIT(nbits,zdest) + * { + * if (nbits > bits_left) + * FillBitBuffer(); + * zdest = (int)((UWORD)bitbuf & mask_bits[nbits]); + * bitbuf >>= nbits; + * bits_left -= nbits; + * } + * + */ + + +#define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\ + (UWORD)bitbuf & mask_bits[nbits]) : (UWORD)bitbuf & mask_bits[nbits]) + + +#define NUKE_CRs(buf,len) {register int i,j; for (i=j=0; j +#include +#include +#include "zlib.h" +#include "unzip.h" +#include "unzipP.h" + +#ifdef STDC +#include +#include +#include +#endif +#ifdef NO_ERRNO_H +extern int errno; +#else +#include +#endif + +const char unz_copyright[] = +" unzip 0.15 Copyright 1998 Gilles Vollant "; + +void unShrink (); +void unReduce (); +int explode (); + +/* + * =========================================================================== + * Read a byte from a gz_stream; update next_in and avail_in. Return EOF for + * end of file. IN assertion: the stream s has been sucessfully opened for + * reading. + */ + + +local int +unzlocal_getByte (FILE * fin, int *pi) +{ + unsigned char c; + int err = fread (&c, 1, 1, fin); + if (err == 1) + { + *pi = (int) c; + return UNZ_OK; + } else + { + if (ferror (fin)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* + * =========================================================================== + * Reads a long in LSB order from the given gz_stream. Sets + */ +local int +unzlocal_getShort (FILE * fin, uLong * pX) +{ + uLong x; + int i; + int err; + + err = unzlocal_getByte (fin, &i); + x = (uLong) i; + + if (err == UNZ_OK) + err = unzlocal_getByte (fin, &i); + x += ((uLong) i) << 8; + + if (err == UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int +unzlocal_getLong (FILE * fin, uLong * pX) +{ + uLong x; + int i; + int err; + + err = unzlocal_getByte (fin, &i); + x = (uLong) i; + + if (err == UNZ_OK) + err = unzlocal_getByte (fin, &i); + x += ((uLong) i) << 8; + + if (err == UNZ_OK) + err = unzlocal_getByte (fin, &i); + x += ((uLong) i) << 16; + + if (err == UNZ_OK) + err = unzlocal_getByte (fin, &i); + x += ((uLong) i) << 24; + + if (err == UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int +strcmpcasenosensitive_internal (const char *fileName1, const char *fileName2) +{ + for (;;) + { + char c1 = *(fileName1++); + char c2 = *(fileName2++); + if ((c1 >= 'a') && (c1 <= 'z')) + c1 -= 0x20; + if ((c2 >= 'a') && (c2 <= 'z')) + c2 -= 0x20; + if (c1 == '\0') + return ((c2 == '\0') ? 0 : -1); + if (c2 == '\0') + return 1; + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + * Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, + * comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, + * comparision is not case sensitivity (like strcmpi or strcasecmp) If + * iCaseSenisivity = 0, case sensitivity is defaut of your operating system + * (like 1 on Unix, 2 on Windows) + * + */ +extern int ZEXPORT +unzStringFileNameCompare (const char *fileName1, const char *fileName2, int iCaseSensitivity) +{ + if (iCaseSensitivity == 0) + iCaseSensitivity = CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity == 1) + return strcmp (fileName1, fileName2); + + return STRCMPCASENOSENTIVEFUNCTION (fileName1, fileName2); +} + +#define BUFREADCOMMENT (0x400) + +/* + * Locate the Central directory of a zipfile (at the end, just before the + * global comment) + */ +local uLong +unzlocal_SearchCentralDir (FILE * fin) +{ + unsigned char *buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack = 0xffff; /* maximum size of global comment */ + uLong uPosFound = 0; + + if (fseek (fin, 0, SEEK_END) != 0) + return 0; + + + uSizeFile = ftell (fin); + + if (uMaxBack > uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char *) ALLOC (BUFREADCOMMENT + 4); + if (buf == NULL) + return 0; + + uBackRead = 4; + while (uBackRead < uMaxBack) + { + uLong uReadSize, uReadPos; + int i; + if (uBackRead + BUFREADCOMMENT > uMaxBack) + uBackRead = uMaxBack; + else + uBackRead += BUFREADCOMMENT; + uReadPos = uSizeFile - uBackRead; + + uReadSize = ((BUFREADCOMMENT + 4) < (uSizeFile - uReadPos)) ? + (BUFREADCOMMENT + 4) : (uSizeFile - uReadPos); + if (fseek (fin, uReadPos, SEEK_SET) != 0) + break; + + if (fread (buf, (uInt) uReadSize, 1, fin) != 1) + break; + + for (i = 0; i < (int) uReadSize - 3; i++) + if (((*(buf + i)) == 0x50) && ((*(buf + i + 1)) == 0x4b) && + ((*(buf + i + 2)) == 0x05) && ((*(buf + i + 3)) == 0x06)) + { + uPosFound = uReadPos + i; + break; + } + if (uPosFound != 0) + break; + } + TRYFREE (buf); + return uPosFound; +} + +/* + * Open a Zip file. path contain the full pathname (by example, on a Windows + * NT computer "c:\\test\\zlib109.zip" or on an Unix computer + * "zlib/zlib109.zip". If the zipfile cannot be opened (file don't exist or + * in not valid), the return value is NULL. Else, the return value is a + * unzFile Handle, usable with other function of this unzip package. + */ +extern unzFile ZEXPORT +unzOpen (const char *path) +{ + unz_s us; + unz_s *s; + uLong central_pos, uL; + FILE *fin; + + uLong number_disk;/* number of the current dist, used for + * spaning ZIP, unsupported, always 0 */ + uLong number_disk_with_CD; /* number the the disk with + * central dir, used for + * spaning ZIP, unsupported, + * always 0 */ + uLong number_entry_CD; /* total number of entries in the + * central dir (same than + * number_entry on nospan) */ + + int err = UNZ_OK; + + if (unz_copyright[0] != ' ') + return NULL; + + fin = fopen (path, "rb"); + if (fin == NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir (fin); + if (central_pos == 0) + err = UNZ_ERRNO; + + if (fseek (fin, central_pos, SEEK_SET) != 0) + err = UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong (fin, &uL) != UNZ_OK) + err = UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort (fin, &number_disk) != UNZ_OK) + err = UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort (fin, &number_disk_with_CD) != UNZ_OK) + err = UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort (fin, &us.gi.number_entry) != UNZ_OK) + err = UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort (fin, &number_entry_CD) != UNZ_OK) + err = UNZ_ERRNO; + + if ((number_entry_CD != us.gi.number_entry) || + (number_disk_with_CD != 0) || + (number_disk != 0)) + err = UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong (fin, &us.size_central_dir) != UNZ_OK) + err = UNZ_ERRNO; + + /* + * offset of start of central directory with respect to the starting disk + * number + */ + if (unzlocal_getLong (fin, &us.offset_central_dir) != UNZ_OK) + err = UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort (fin, &us.gi.size_comment) != UNZ_OK) + err = UNZ_ERRNO; + + if ((central_pos < us.offset_central_dir + us.size_central_dir) && + (err == UNZ_OK)) + err = UNZ_BADZIPFILE; + + if (err != UNZ_OK) + { + fclose (fin); + return NULL; + } + us.file = fin; + us.byte_before_the_zipfile = central_pos - + (us.offset_central_dir + us.size_central_dir); + us.central_pos = central_pos; + us.pfile_in_zip_read = NULL; + + + s = (unz_s *) ALLOC (sizeof (unz_s)); + *s = us; + unzGoToFirstFile ((unzFile) s); + return (unzFile) s; +} + + +/* + * Close a ZipFile opened with unzipOpen. If there is files inside the .Zip + * opened with unzipOpenCurrentFile (see later), these files MUST be closed + * with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there + * is no problem. + */ +extern int ZEXPORT +unzClose (unzFile file) +{ + unz_s *s; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile (file); + + fclose (s->file); + TRYFREE (s); + return UNZ_OK; +} + + +/* + * Write info about the ZipFile in the *pglobal_info structure. No + * preparation of the structure is needed return UNZ_OK if there is no + * problem. + */ +extern int ZEXPORT +unzGetGlobalInfo (unzFile file, unz_global_info * pglobal_info) +{ + unz_s *s; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + *pglobal_info = s->gi; + return UNZ_OK; +} + + +/* + * Translate date/time from Dos format to tm_unz (readable more easilty) + */ +local void +unzlocal_DosDateToTmuDate (uLong ulDosDate, tm_unz * ptm) +{ + uLong uDate; + uDate = (uLong) (ulDosDate >> 16); + ptm->tm_mday = (uInt) (uDate & 0x1f); + ptm->tm_mon = (uInt) ((((uDate) & 0x1E0) / 0x20) - 1); + ptm->tm_year = (uInt) (((uDate & 0x0FE00) / 0x0200) + 1980); + + ptm->tm_hour = (uInt) ((ulDosDate & 0xF800) / 0x800); + ptm->tm_min = (uInt) ((ulDosDate & 0x7E0) / 0x20); + ptm->tm_sec = (uInt) (2 * (ulDosDate & 0x1f)); +} + +/* + * Get Info about the current file in the zipfile, with internal only info + */ +local int unzlocal_GetCurrentFileInfoInternal +OF ((unzFile file, + unz_file_info * pfile_info, + unz_file_info_internal + * pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + + local int unzlocal_GetCurrentFileInfoInternal ( + unzFile file, + unz_file_info * pfile_info, + unz_file_info_internal * pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz_s *s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err = UNZ_OK; + uLong uMagic; + long lSeek = 0; + + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + if (fseek (s->file, s->pos_in_central_dir + s->byte_before_the_zipfile, SEEK_SET) != 0) + err = UNZ_ERRNO; + + + /* we check the magic */ + if (err == UNZ_OK) + { + if (unzlocal_getLong (s->file, &uMagic) != UNZ_OK) + err = UNZ_ERRNO; + else if (uMagic != 0x02014b50) + err = UNZ_BADZIPFILE; + } + if (unzlocal_getShort (s->file, &file_info.version) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.version_needed) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.flag) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.compression_method) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &file_info.dosDate) != UNZ_OK) + err = UNZ_ERRNO; + + unzlocal_DosDateToTmuDate (file_info.dosDate, &file_info.tmu_date); + + if (unzlocal_getLong (s->file, &file_info.crc) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &file_info.compressed_size) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &file_info.uncompressed_size) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.size_filename) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.size_file_extra) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.size_file_comment) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.disk_num_start) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &file_info.internal_fa) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &file_info.external_fa) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &file_info_internal.offset_curfile) != UNZ_OK) + err = UNZ_ERRNO; + + lSeek += file_info.size_filename; + if ((err == UNZ_OK) && (szFileName != NULL)) + { + uLong uSizeRead; + if (file_info.size_filename < fileNameBufferSize) + { + *(szFileName + file_info.size_filename) = '\0'; + uSizeRead = file_info.size_filename; + } else + uSizeRead = fileNameBufferSize; + + if ((file_info.size_filename > 0) && (fileNameBufferSize > 0)) + if (fread (szFileName, (uInt) uSizeRead, 1, s->file) != 1) + err = UNZ_ERRNO; + lSeek -= uSizeRead; + } + if ((err == UNZ_OK) && (extraField != NULL)) + { + uLong uSizeRead; + if (file_info.size_file_extra < extraFieldBufferSize) + uSizeRead = file_info.size_file_extra; + else + uSizeRead = extraFieldBufferSize; + + if (lSeek != 0) + { + if (fseek (s->file, lSeek, SEEK_CUR) == 0) + lSeek = 0; + else + err = UNZ_ERRNO; + } + if ((file_info.size_file_extra > 0) && (extraFieldBufferSize > 0)) + if (fread (extraField, (uInt) uSizeRead, 1, s->file) != 1) + err = UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } else + lSeek += file_info.size_file_extra; + + + if ((err == UNZ_OK) && (szComment != NULL)) + { + uLong uSizeRead; + if (file_info.size_file_comment < commentBufferSize) + { + *(szComment + file_info.size_file_comment) = '\0'; + uSizeRead = file_info.size_file_comment; + } else + uSizeRead = commentBufferSize; + + if (lSeek != 0) + { + if (fseek (s->file, lSeek, SEEK_CUR) == 0) + lSeek = 0; + else + err = UNZ_ERRNO; + } + if ((file_info.size_file_comment > 0) && (commentBufferSize > 0)) + if (fread (szComment, (uInt) uSizeRead, 1, s->file) != 1) + err = UNZ_ERRNO; + lSeek += file_info.size_file_comment - uSizeRead; + } else + lSeek += file_info.size_file_comment; + + if ((err == UNZ_OK) && (pfile_info != NULL)) + *pfile_info = file_info; + + if ((err == UNZ_OK) && (pfile_info_internal != NULL)) + *pfile_info_internal = file_info_internal; + + return err; +} + + + +/* + * Write info about the ZipFile in the *pglobal_info structure. No + * preparation of the structure is needed return UNZ_OK if there is no + * problem. + */ +extern int ZEXPORT +unzGetCurrentFileInfo ( + unzFile file, + unz_file_info * pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + return unzlocal_GetCurrentFileInfoInternal (file, pfile_info, NULL, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize); +} + +/* + * Set the current file of the zipfile to the first file. return UNZ_OK if + * there is no problem + */ +extern int ZEXPORT +unzGoToFirstFile (unzFile file) +{ + int err = UNZ_OK; + unz_s *s; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + s->pos_in_central_dir = s->offset_central_dir; + s->num_file = 0; + err = unzlocal_GetCurrentFileInfoInternal (file, &s->cur_file_info, + &s->cur_file_info_internal, + NULL, 0, NULL, 0, NULL, 0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + * Set the current file of the zipfile to the next file. return UNZ_OK if + * there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was + * the latest. + */ +extern int ZEXPORT +unzGoToNextFile (unzFile file) +{ + unz_s *s; + int err; + + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->num_file + 1 == s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal (file, &s->cur_file_info, + &s->cur_file_info_internal, + NULL, 0, NULL, 0, NULL, 0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + * Try locate the file szFileName in the zipfile. For the iCaseSensitivity + * signification, see unzipStringFileNameCompare + * + * return value : UNZ_OK if the file is found. It becomes the current file. + * UNZ_END_OF_LIST_OF_FILE if the file is not found + */ +extern int ZEXPORT +unzLocateFile ( + unzFile file, + const char *szFileName, + int iCaseSensitivity) +{ + unz_s *s; + int err; + + + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file == NULL) + return UNZ_PARAMERROR; + + if (strlen (szFileName) >= UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s = (unz_s *) file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + + err = unzGoToFirstFile (file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP + 1]; + unzGetCurrentFileInfo (file, NULL, + szCurrentFileName, sizeof (szCurrentFileName) - 1, + NULL, 0, NULL, 0); + if (unzStringFileNameCompare (szCurrentFileName, + szFileName, iCaseSensitivity) == 0) + return UNZ_OK; + err = unzGoToNextFile (file); + } + + s->num_file = num_fileSaved; + s->pos_in_central_dir = pos_in_central_dirSaved; + return err; +} + + +/* + * Read the local header of the current zipfile Check the coherency of the + * local header and info in the end of central directory about this file + * store in *piSizeVar the size of extra info in local header (filename and + * size of extra field data) + */ +local int +unzlocal_CheckCurrentFileCoherencyHeader ( + unz_s * s, + uInt * piSizeVar, + uLong * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic, uData, uFlags; + uLong size_filename; + uLong size_extra_field; + int err = UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (fseek (s->file, s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile, SEEK_SET) != 0) + return UNZ_ERRNO; + + + if (err == UNZ_OK) + { + if (unzlocal_getLong (s->file, &uMagic) != UNZ_OK) + err = UNZ_ERRNO; + else if (uMagic != 0x04034b50) + err = UNZ_BADZIPFILE; + } + + if (unzlocal_getShort (s->file, &uData) != UNZ_OK) + err = UNZ_ERRNO; + /* + * else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + * err=UNZ_BADZIPFILE; + */ + if (unzlocal_getShort (s->file, &uFlags) != UNZ_OK) + err = UNZ_ERRNO; + + if (unzlocal_getShort (s->file, &uData) != UNZ_OK) + err = UNZ_ERRNO; + else if ((err == UNZ_OK) && (uData != s->cur_file_info.compression_method)) + err = UNZ_BADZIPFILE; + + if ((err == UNZ_OK) && + s->cur_file_info.compression_method > Z_DEFLATED) + err = UNZ_BADZIPFILE; + + if (unzlocal_getLong (s->file, &uData) != UNZ_OK) /* date/time */ + err = UNZ_ERRNO; + + if (unzlocal_getLong (s->file, &uData) != UNZ_OK) /* crc */ + err = UNZ_ERRNO; + else if ((err == UNZ_OK) && (uData != s->cur_file_info.crc) && + ((uFlags & 8) == 0)) + err = UNZ_BADZIPFILE; + + if (unzlocal_getLong (s->file, &uData) != UNZ_OK) /* size compr */ + err = UNZ_ERRNO; + else if ((err == UNZ_OK) && (uData != s->cur_file_info.compressed_size) && + ((uFlags & 8) == 0)) + err = UNZ_BADZIPFILE; + + if (unzlocal_getLong (s->file, &uData) != UNZ_OK) /* size uncompr */ + err = UNZ_ERRNO; + else if ((err == UNZ_OK) && (uData != s->cur_file_info.uncompressed_size) && + ((uFlags & 8) == 0)) + err = UNZ_BADZIPFILE; + + + if (unzlocal_getShort (s->file, &size_filename) != UNZ_OK) + err = UNZ_ERRNO; + else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename)) + err = UNZ_BADZIPFILE; + + *piSizeVar += (uInt) size_filename; + + if (unzlocal_getShort (s->file, &size_extra_field) != UNZ_OK) + err = UNZ_ERRNO; + *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt) size_extra_field; + + *piSizeVar += (uInt) size_extra_field; + + return err; +} + +/* + * Open for reading data the current file in the zipfile. If there is no + * error and the file is opened, the return value is UNZ_OK. + */ +extern int ZEXPORT +unzOpenCurrentFile (unzFile file) +{ + int err = UNZ_OK; + uInt iSizeVar; + unz_s *s; + file_in_zip_read_info_s *pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra + * field */ + uInt size_local_extrafield; /* size of the local extra + * field */ + + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile (file); + + if (unzlocal_CheckCurrentFileCoherencyHeader (s, &iSizeVar, + &offset_local_extrafield, &size_local_extrafield) != UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s *) + ALLOC (sizeof (file_in_zip_read_info_s)); + if (pfile_in_zip_read_info == NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer = (char *) ALLOC (UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield = 0; + + if (pfile_in_zip_read_info->read_buffer == NULL) + { + TRYFREE (pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + pfile_in_zip_read_info->stream_initialised = 0; + + if (s->cur_file_info.compression_method > Z_DEFLATED) + err = UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc; + pfile_in_zip_read_info->crc32 = 0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->file = s->file; + pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + switch (s->cur_file_info.compression_method) + { + case UNZ_STORED: + break; + case UNZ_SHRUNK: + break; + case UNZ_REDUCED1: + case UNZ_REDUCED2: + case UNZ_REDUCED3: + case UNZ_REDUCED4: + break; + case UNZ_IMPLODED: + break; + case UNZ_DEFLATED: + pfile_in_zip_read_info->stream.zalloc = (alloc_func) 0; + pfile_in_zip_read_info->stream.zfree = (free_func) 0; + pfile_in_zip_read_info->stream.opaque = (voidpf) 0; + + err = inflateInit2 (&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised = 1; + /* + * windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. In unzip, i don't wait absolutely + * Z_STREAM_END because I known the size of both compressed and + * uncompressed data + */ + break; + default: + return UNZ_INTERNALERROR; + break; + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt) 0; + s->pfile_in_zip_read = pfile_in_zip_read_info; + return UNZ_OK; +} + + +/* + * Read bytes from the current file. buf contain buffer where data must be + * copied len the size of buf. + * + * return the number of byte copied if somes bytes are copied return 0 if the + * end of file was reached return <0 with error code if there is an error + * (UNZ_ERRNO for IO error, or zLib error for uncompress error) + */ + +file_in_zip_read_info_s *pfile_in_zip_read_info = NULL; +unz_s *pUnzip = NULL; +extern int ZEXPORT +unzReadCurrentFile ( + unzFile file, + voidp buf, + unsigned len) +{ + int err = UNZ_OK; + uInt iRead = 0; + unz_s *s; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + pUnzip = s; + pfile_in_zip_read_info = s->pfile_in_zip_read; + + if (pfile_in_zip_read_info == NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len == 0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef *) buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt) len; + + if (len > pfile_in_zip_read_info->rest_read_uncompressed) + pfile_in_zip_read_info->stream.avail_out = + (uInt) pfile_in_zip_read_info->rest_read_uncompressed; + + while (pfile_in_zip_read_info->stream.avail_out > 0 && err == UNZ_OK) + { + switch (pfile_in_zip_read_info->compression_method) + { + case UNZ_STORED: + case UNZ_DEFLATED: + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed > 0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressed < uReadThis) + uReadThis = (uInt) pfile_in_zip_read_info->rest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (fseek (pfile_in_zip_read_info->file, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, SEEK_SET) != 0) + return UNZ_ERRNO; + if (fread (pfile_in_zip_read_info->read_buffer, uReadThis, 1, + pfile_in_zip_read_info->file) != 1) + return UNZ_ERRNO; + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed -= uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef *) pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt) uReadThis; + } + break; + } + switch (pfile_in_zip_read_info->compression_method) + { + case UNZ_STORED: + { + uInt uDoCopy, i; + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in; + + for (i = 0; i < uDoCopy; i++) + *(pfile_in_zip_read_info->stream.next_out + i) = + *(pfile_in_zip_read_info->stream.next_in + i); + + pfile_in_zip_read_info->crc32 = crc32 (pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed -= uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + break; + } + case UNZ_SHRUNK: + iRead = pfile_in_zip_read_info->rest_read_uncompressed; + unShrink (); + break; + case UNZ_REDUCED1: + case UNZ_REDUCED2: + case UNZ_REDUCED3: + case UNZ_REDUCED4: + iRead = pfile_in_zip_read_info->rest_read_uncompressed; + unReduce (); + break; + case UNZ_IMPLODED: + iRead = pfile_in_zip_read_info->rest_read_uncompressed; + err = explode (); + break; + case UNZ_DEFLATED: + { + uLong uTotalOutBefore, uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush = Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + * if ((pfile_in_zip_read_info->rest_read_uncompressed == + * pfile_in_zip_read_info->stream.avail_out) && + * (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = + * Z_FINISH; + */ + err = inflate (&pfile_in_zip_read_info->stream, flush); + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter - uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32 (pfile_in_zip_read_info->crc32, bufBefore, + (uInt) (uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt) (uTotalOutAfter - uTotalOutBefore); + + if (err == Z_STREAM_END) + return (iRead == 0) ? UNZ_EOF : iRead; + if (err != Z_OK) + break; + break; + } + default: + return (UNZ_EOF); + } + } + + if (err == Z_OK) + return iRead; + return err; +} + + +/* + * Give the current position in uncompressed data + */ +extern z_off_t ZEXPORT +unztell (unzFile file) +{ + unz_s *s; + file_in_zip_read_info_s *pfile_in_zip_read_info; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + pfile_in_zip_read_info = s->pfile_in_zip_read; + + if (pfile_in_zip_read_info == NULL) + return UNZ_PARAMERROR; + + return (z_off_t) pfile_in_zip_read_info->stream.total_out; +} + + +/* + * return 1 if the end of file was reached, 0 elsewhere + */ +extern int ZEXPORT +unzeof (unzFile file) +{ + unz_s *s; + file_in_zip_read_info_s *pfile_in_zip_read_info; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + pfile_in_zip_read_info = s->pfile_in_zip_read; + + if (pfile_in_zip_read_info == NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + * Read extra field from the current file (opened by unzOpenCurrentFile) This + * is the local-header version of the extra field (sometimes, there is more + * info in the local-header version than in the central-header) + * + * if buf==NULL, it return the size of the local extra field that can be read + * + * if buf!=NULL, len is the size of the buffer, the extra header is copied in + * buf. the return value is the number of bytes copied in buf, or (if <0) the + * error code + */ +extern int ZEXPORT +unzGetLocalExtrafield ( + unzFile file, + voidp buf, + unsigned len) +{ + unz_s *s; + file_in_zip_read_info_s *pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + pfile_in_zip_read_info = s->pfile_in_zip_read; + + if (pfile_in_zip_read_info == NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf == NULL) + return (int) size_to_read; + + if (len > size_to_read) + read_now = (uInt) size_to_read; + else + read_now = (uInt) len; + + if (read_now == 0) + return 0; + + if (fseek (pfile_in_zip_read_info->file, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, SEEK_SET) != 0) + return UNZ_ERRNO; + + if (fread (buf, (uInt) size_to_read, 1, pfile_in_zip_read_info->file) != 1) + return UNZ_ERRNO; + + return (int) read_now; +} + +/* + * Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR + * if all the file was read but the CRC is not good + */ +extern int ZEXPORT +unzCloseCurrentFile (unzFile file) +{ + int err = UNZ_OK; + + unz_s *s; + file_in_zip_read_info_s *pfile_in_zip_read_info; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + pfile_in_zip_read_info = s->pfile_in_zip_read; + + if (pfile_in_zip_read_info == NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err = UNZ_CRCERROR; + } + TRYFREE (pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd (&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE (pfile_in_zip_read_info); + + s->pfile_in_zip_read = NULL; + + return err; +} + + +/* + * Get the global comment string of the ZipFile, in the szComment buffer. + * uSizeBuf is the size of the szComment buffer. return the number of byte + * copied or an error code <0 + */ +extern int ZEXPORT +unzGetGlobalComment ( + unzFile file, + char *szComment, + uLong uSizeBuf) +{ + unz_s *s; + uLong uReadThis; + if (file == NULL) + return UNZ_PARAMERROR; + s = (unz_s *) file; + + uReadThis = uSizeBuf; + if (uReadThis > s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (fseek (s->file, s->central_pos + 22, SEEK_SET) != 0) + return UNZ_ERRNO; + + if (uReadThis > 0) + { + *szComment = '\0'; + if (fread (szComment, (uInt) uReadThis, 1, s->file) != 1) + return UNZ_ERRNO; + } + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment + s->gi.size_comment) = '\0'; + return (int) uReadThis; +} diff --git a/src/unzip/unzip.h b/src/unzip/unzip.h new file mode 100644 index 0000000..f629782 --- /dev/null +++ b/src/unzip/unzip.h @@ -0,0 +1,285 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 0.15 beta, Mar 19th, 1998, + + Copyright (C) 1998 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + Encryption and multi volume ZipFile (span) are not supported. + Old compressions used by old PKZip 1.x are not supported + + THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE + CAN CHANGE IN FUTURE VERSION !! + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ +/* for more info about .ZIP format, see + ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip */ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +#define UNZ_STORED 0 /* compression methods */ +#define UNZ_SHRUNK 1 +#define UNZ_REDUCED1 2 +#define UNZ_REDUCED2 3 +#define UNZ_REDUCED3 4 +#define UNZ_REDUCED4 5 +#define UNZ_IMPLODED 6 +#define UNZ_TOKENIZED 7 +#define UNZ_DEFLATED 8 + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer + "zlib/zlib111.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/src/unzip/unzipP.h b/src/unzip/unzipP.h new file mode 100644 index 0000000..8817dc9 --- /dev/null +++ b/src/unzip/unzipP.h @@ -0,0 +1,124 @@ +#ifndef _UNZIPP_H_ +#define _UNZIPP_H_ + +#include "unzip.h" + +#ifndef local +#define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + + +#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ + !defined(CASESENSITIVITYDEFAULT_NO) +#define CASESENSITIVITYDEFAULT_NO +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +#define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +#define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +/* unz_file_info_interntal contain internal info about a file in zipfile */ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile; /* relative offset of local header 4 + * bytes */ +} unz_file_info_internal; + + +/* + * file_in_zip_read_info_s contain internal information about a file in + * zipfile, when reading and decompress it + */ +typedef struct +{ + char *read_buffer;/* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, + * for fseek */ + uLong stream_initialised; /* flag set if stream structure is + * initialised */ + + uLong offset_local_extrafield; /* offset of the local extra + * field */ + uInt size_local_extrafield; /* size of the local extra + * field */ + uLong pos_local_extrafield; /* position in the local + * extra field in read */ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be + * decompressed */ + uLong rest_read_uncompressed; /* number of byte to be + * obtained after decomp */ + FILE *file; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile; /* byte before the zipfile, + * (>0 for sfx) */ +} file_in_zip_read_info_s; + + +/* + * unz_s contain internal information about the zipfile + */ +typedef struct +{ + FILE *file; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile; /* byte before the zipfile, + * (>0 for sfx) */ + uLong num_file; /* number of the current file in the zipfile */ + uLong pos_in_central_dir; /* pos of the current file in the + * central dir */ + uLong current_file_ok; /* flag about the usability of the + * current file */ + uLong central_pos;/* position of the beginning of the central + * dir */ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central + * directory with respect to the + * starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file + * in zip */ + unz_file_info_internal cur_file_info_internal; /* private info about it */ + file_in_zip_read_info_s *pfile_in_zip_read; /* structure about the + * current file if we are + * decompressing it */ +} unz_s; + +#endif -- GitLab

ks7YQ3l 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 sR{Ted4 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 A^^V;>hON=-BT?ts1G`H!i=|(+b-ziF-?W`#Ii) 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%0DcD(e=U29i5Xf@y`Kij$S$F4lT60ul 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%0D~!XBYkyu&gFC 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[$ykunE}TWR1QS-KnHe#< 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�OQL-JU6Wvj2Kium+&3HXFw68Z?Xak5 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ξ0>r`WXHXS;5$b=-7~o=n7_^-R@WrLOZ) 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